| | |
| | | #include <basic/util/opencv/CvUtil.h> |
| | | |
| | | |
| | | #include <basic/db/Elasticsearch/EsDBTool.h> |
| | | #include <uuid/uuid.h> |
| | | #include <jsoncpp/json/json.h> |
| | | |
| | | #include <QtCore/QJsonDocument> |
| | | #include <QtCore/QJsonObject> |
| | | |
| | | YoloRpcElement::YoloRpcElement(string shareMemoryName) : |
| | | YoloRpcElement::YoloRpcElement(std::string shareMemoryName) : |
| | | rpcClient(appPref.getStringData("yolo.proxy"), appPref.getStringData("yolo.ip"), |
| | | appPref.getIntData("yolo.port"), "tcp"), fdfsClient(nullptr), sharedMemory(nullptr), |
| | | m_triggerElement(0, 50), trackingTrigger(nullptr) { |
| | | appPref.getIntData("yolo.port"), "tcp"), |
| | | sharedMemory(nullptr), |
| | | trackingTrigger(nullptr) |
| | | { |
| | | trackingTrigger = new TrackingTrigger(0.5); |
| | | sharedMemory = new QSharedMemory(QString(shareMemoryName.c_str())); |
| | | // DBG(shareMemoryName); |
| | | //1520 x 2688 1080 x 1920 //2560 * 1440 * 4 |
| | | if (!sharedMemory->create(4608 * 2592 * 4)) { |
| | | sharedMemory->attach(); |
| | | } |
| | | trackingTrigger = new TrackingTrigger(0.5); |
| | | |
| | | try { |
| | | auto server = rpcClient.getServer(); |
| | | cocoData = server->getCocoData(); |
| | |
| | | if (sharedMemory) { |
| | | delete sharedMemory; |
| | | } |
| | | if (trackingTrigger) { |
| | | if(trackingTrigger) |
| | | { |
| | | delete trackingTrigger; |
| | | trackingTrigger=nullptr; |
| | | } |
| | | } |
| | | void YoloRpcElement::setImage(const cv::Mat &value) |
| | | { |
| | | if (value.size != image.size) |
| | | { |
| | | image = cv::Mat(value.rows, value.cols, CV_8UC3, sharedMemory->data()); |
| | | } |
| | | value.copyTo(image); |
| | | } |
| | | ::YoloDetect::ObjInfos YoloRpcElement::getObjects() const |
| | | { |
| | | return objs; |
| | | } |
| | | |
| | | void YoloRpcElement::threadFunc() { |
| | | // ClockTimer ct("YoloRpcElement::threadFunc");. |
| | | triggerMats.clear(); |
| | | |
| | | std::vector<ScoredRect> YoloRpcElement::getLastScoreRects() const { |
| | | return trackingTrigger->getLastScoreRects(); |
| | | } |
| | | |
| | | cv::Mat YoloRpcElement::getImage() const |
| | | { |
| | | return image; |
| | | } |
| | | |
| | | void YoloRpcElement::threadFunc() |
| | | { |
| | | // ClockTimer ct("YoloRpcElement::threadFunc"); |
| | | triggerScoredRects.clear(); |
| | | try { |
| | | auto server = rpcClient.getServer(); |
| | | if (!server) { |
| | | ERR("server is null"); |
| | | return; |
| | | auto server = rpcClient.getServer(); |
| | | if (!server) |
| | | { |
| | | ERR("server is null"); |
| | | return; |
| | | } |
| | | objs = server->YoloDetect(image.cols, image.rows, sharedMemory->key().toStdString());//TODO |
| | | } |
| | | objs = server->YoloDetect(image.cols, image.rows, sharedMemory->key().toStdString());//TODO |
| | | if (objs.size() <= 0) { |
| | | m_triggerElement.setState(false); |
| | | m_triggerElement.triggerOnce(false); |
| | | trackingTrigger->triggerLine(); |
| | | return; |
| | | } else { |
| | | m_triggerElement.setState(true); |
| | | catch (std::exception &e) |
| | | { |
| | | ERR(e.what()) |
| | | } |
| | | string t_camIdex = getProperty("dev_id") + getProperty("ch_id"); |
| | | float t_det_sc = |
| | | appPref.getFloatData(t_camIdex + "yolo.det") == -1 ? 0.75 : appPref.getFloatData(t_camIdex + "yolo.det"); |
| | | // int size=objs.size(); |
| | | // if(size>30) |
| | | // { |
| | | |
| | | for (auto &obj: objs) { |
| | | // DBG("size="<<size); |
| | | // return; |
| | | // } |
| | | |
| | | for (auto &obj: objs) |
| | | { |
| | | if (obj.type != 0) |
| | | continue; |
| | | if (obj.prob < t_det_sc) { |
| | | continue; |
| | | } |
| | | |
| | | ScoredRect scoredRect; |
| | | |
| | | int x = obj.rcObj.left * image.cols; |
| | |
| | | int w = (obj.rcObj.right - obj.rcObj.left) * image.cols; |
| | | int h = (obj.rcObj.bottom - obj.rcObj.top) * image.rows; |
| | | scoredRect.rect = cv::Rect(x, y, w, h); |
| | | |
| | | scoredRect.score = scoredRect.rect.area() > 0 ? obj.prob : 0; |
| | | if (trackingTrigger->triggerOnce(scoredRect)) { |
| | | scoredRect.properties["time"] = getProperty("time"); |
| | | scoredRect.properties["imgKey"]=getProperty("imgKey"); |
| | | if (trackingTrigger->triggerOnce(scoredRect)) |
| | | { |
| | | trackingTrigger->getLastRect().properties["id"] = to_string(scoredRect.id); |
| | | trackingTrigger->getLastRect().properties["type"] = cocoData[obj.type]; |
| | | auto t_image = image(scoredRect.rect & cv::Rect(0, 0, image.cols, image.rows)).clone(); |
| | | triggerMats.push_back(t_image); |
| | | |
| | | std::string strImgUrl = "http://"; |
| | | if (fdfsClient != nullptr && fdfsClient->fastFds != nullptr) { |
| | | fdfsClient->rwLock.rdlock(); |
| | | std::vector<unsigned char> buffer; |
| | | CvUtil::cvMat2Buffer(t_image, buffer); |
| | | std::string strImgUrlTmp = ""; |
| | | fdfsClient->fastFds->uploadFile(buffer, strImgUrlTmp, "jpg"); |
| | | strImgUrl.append(fdfsClient->fastFds->getIp() + "/" + strImgUrlTmp); |
| | | strImgUrl.clear(); |
| | | strImgUrl = strImgUrlTmp; |
| | | // strImgUrl.append("/").append(strImgUrlTmp); |
| | | fdfsClient->rwLock.unlock(); |
| | | } |
| | | |
| | | //使用的时候将false改为ture |
| | | { |
| | | //#todo |
| | | EsDBTool pManagerEsDB(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort")); |
| | | |
| | | string str_uuid; |
| | | uuid_t t_uuid; |
| | | char str[36]; |
| | | uuid_generate(t_uuid); |
| | | uuid_unparse(t_uuid, str); |
| | | str_uuid = str; |
| | | |
| | | // jsonyolo.insert("HardCamId","");//硬盘摄像机id ???拿不到 |
| | | // jsonyolo.insert("ChannlId","");//通道id ??? 拿不到 |
| | | // jsonyolo.insert("Time","");//时间 可以获取当前时间 明确时间是获取当前的还是传过来的 ??? 拿不到 |
| | | // jsonyolo.insert("ImgUrl","");//图像img路径 ??? 拿不到 |
| | | // jsonyolo.insert("Image","");//快照 ??? 拿不到 |
| | | // jsonyolo.insert("DataType",obj.type);//检测的类型 |
| | | // jsonyolo.insert("Score",obj.prob);//检测的得分 |
| | | |
| | | Json::Value t_json; |
| | | t_json["Id"] = str_uuid; //主键 |
| | | //#todo |
| | | |
| | | t_json["picName"] = "wait todo"; |
| | | t_json["DataType"] = cocoData[obj.type]; |
| | | t_json["Score"] = obj.prob; |
| | | |
| | | t_json["personPicUrl"] = "wait todo";//人员图片 store |
| | | t_json["likeDate"] = AppUtil::getTimeSecString();//比较时间 |
| | | t_json["picAddress"] = getProperty("str_addr");//抓拍地址 |
| | | t_json["picMaxUrl"] = "wait todo";//大图路径 |
| | | t_json["picLocalUrl"] = "wait todo";//本地路径 |
| | | t_json["picSmUrl"] = strImgUrl;//人员抓小图 |
| | | |
| | | // faceRpcElement.setProperty("frame_number", frame_number); |
| | | t_json["picDate"] = getProperty("time"); |
| | | t_json["content"] = "wait todo"; |
| | | t_json["viType"] = "2";//只有4种类型 1:personface 2:personbody 3:car 4:bicycle 5:none 未知类型 |
| | | t_json["personIsHub"] = "4";//1: 报警 2: 可疑 3: 安全 4: 未知 |
| | | t_json["videoIp"] = getProperty("local_ip");//当前服务器IP地址 |
| | | |
| | | |
| | | t_json["videoNum"] = getProperty("path");//Vide编号 外键 |
| | | t_json["videoReqNum"] = getProperty("dev_id");//Video设备编号 |
| | | t_json["ChannlId"] = getProperty("ch_id");//通道id |
| | | t_json["isDelete"] = "1";//默认1 ,0无效 1有效 |
| | | |
| | | t_json["indeviceid"] = appPref.getStringData("fxDevID"); |
| | | t_json["indevicename"] = appPref.getStringData("fxDevNAME"); |
| | | |
| | | DBG(t_json.toStyledString()); |
| | | bool retface = false; |
| | | retface = pManagerEsDB.insertData("yolodet", "info", t_json.toStyledString(), str_uuid); |
| | | if (retface) { |
| | | INFO("facedb success"); |
| | | } else { |
| | | ERR("facedb fail"); |
| | | } |
| | | } |
| | | trackingTrigger->getLastRect().properties["time"] = getProperty("time"); |
| | | trackingTrigger->getLastRect().properties["imgKey"]=getProperty("imgKey"); |
| | | // DBG("time)"<<getProperty("time")); |
| | | triggerScoredRects.push_back(trackingTrigger->getLastRect()); |
| | | } |
| | | } |
| | | trackingTrigger->triggerLine(); |
| | | m_triggerElement.triggerOnce(false); |
| | | if (triggerMats.size() > 0)fireConnectors("YoloTrigger"); |
| | | // if(trackingTrigger->getLastScoreRects().size()>20) |
| | | // { |
| | | // DBG(""); |
| | | // } |
| | | fireConnectors(); |
| | | } catch (std::exception &e) { |
| | | ERR(e.what()) |
| | | } |
| | | } |
| | | |
| | | ::YoloDetect::ObjInfos YoloRpcElement::getObjects() const { |
| | | return objs; |
| | | } |
| | | |
| | | bool YoloRpcElement::getTrigger() const { |
| | | return (objs.size() > 0 ? true : false); |
| | | } |
| | | |
| | | std::vector<cv::Mat> YoloRpcElement::getTriggerMats() { |
| | | return triggerMats; |
| | | } |
| | | |
| | | std::vector<ScoredRect> YoloRpcElement::getLastScoreRects() const { |
| | | return trackingTrigger->getLastScoreRects(); |
| | | } |
| | | |
| | | void YoloRpcElement::setImage(const cv::Mat &value) { |
| | | if (value.size != image.size) { |
| | | image = cv::Mat(value.rows, value.cols, CV_8UC3, sharedMemory->data()); |
| | | } |
| | | value.copyTo(image); |
| | | } |
| | | |
| | | bool YoloRpcElement::getTriggerState() const { |
| | | return m_triggerElement.getTriggerState(); |
| | | } |