#include "PaYoloRpcElement.h" #include #include #include #include #include #include "AppPaController.h" #include #include #include #include #include #include PaYoloRpcElement::PaYoloRpcElement(string shareMemoryName) : rpcClient(appPref.getStringData("yolo.proxy"), appPref.getStringData("yolo.ip"), appPref.getIntData("yolo.port"), "tcp"), fdfsClient(nullptr), sharedMemory(nullptr), mRealNum(0),mCfg(nullptr), trackingTrigger(nullptr) { 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(); } catch (std::exception &e) { ERR(e.what()) } } PaYoloRpcElement::~PaYoloRpcElement() { if (sharedMemory) { delete sharedMemory; } if (trackingTrigger) { delete trackingTrigger; } if (mCfg) { delete mCfg; mCfg=nullptr; } mPolygon.clear(); } void PaYoloRpcElement::threadFunc() { // ClockTimer ct("YoloRpcElement::threadFunc");. triggerMats.clear(); int num=0; bool bInWeekTime=false; if(mCfg==nullptr) { return; } try { auto server = rpcClient.getServer(); if (!server) { ERR("server is null"); return; } objs = server->YoloDetect(image.cols, image.rows, sharedMemory->key().toStdString());//TODO if (objs.size() <= 0) { trackingTrigger->triggerLine(); return; } 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"); bInWeekTime=isInWeekRuleTime(); for (auto &obj: objs) { if (obj.type != 0) continue; if(obj.prob < ((1-mCfg->paAlarmInfo.fSensitivity)/2+0.5))continue; ScoredRect scoredRect; int x = obj.rcObj.left * image.cols; int y = obj.rcObj.top * image.rows; 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); QRect rect(x,y,w,h); QPoint center = rect.center(); scoredRect.score = scoredRect.rect.area() > 0 ? obj.prob : 0; if(mPolygon.containsPoint(center,Qt::OddEvenFill)) { scoredRect.isMask=true; if(bInWeekTime) num++; } if ( trackingTrigger->triggerOnce(scoredRect)) { DBG("x="<getLastRect().isMask= scoredRect.isMask; 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 buffer; CvUtil::cvMat2Buffer(t_image, buffer); std::string strImgUrlTmp = ""; fdfsClient->fastFds->uploadFile(buffer, strImgUrlTmp, "jpg"); strImgUrl.append(fdfsClient->fastFds->getIp() + "/" + strImgUrlTmp); fdfsClient->rwLock.unlock(); } //使用的时候将false改为ture if(0) { //#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"); } } } } mRealNum=num; trackingTrigger->triggerLine(); if (triggerMats.size() > 0)fireConnectors("YoloTrigger"); fireConnectors(); } catch (std::exception &e) { ERR(e.what()) } } ::YoloDetect::ObjInfos PaYoloRpcElement::getObjects() const { return objs; } std::vector PaYoloRpcElement::getTriggerMats() { return triggerMats; } std::vector PaYoloRpcElement::getLastScoreRects() const { return trackingTrigger->getLastScoreRects(); } void PaYoloRpcElement::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 PaYoloRpcElement::isInWeekRuleTime() { int nWeek = QDate::currentDate().dayOfWeek(); //QString strWeek = getWeekString(nWeek); int size=mCfg->ruleWeekInfoVec.size(); for(int i = 0;i < size;++i) { if(mCfg->ruleWeekInfoVec[i].m_nType == nWeek) { QString strCurrent = QDateTime::currentDateTime().toString("hh:mm"); if(strCurrent >= mCfg->ruleWeekInfoVec[i].m_strBegin && strCurrent <= mCfg->ruleWeekInfoVec[i].m_strEnd) { return true; } } } return false; } QJsonArray PaYoloRpcElement::getJsonArrayFromQString(const QString strJson) { QJsonDocument jsonDocument = QJsonDocument::fromJson(strJson.toLocal8Bit()); if( jsonDocument.isNull() ){ //DBG("please check the string"<< strJson.toLocal8Bit()); return QJsonArray(); } QJsonArray jsonArray = jsonDocument.array(); return jsonArray; } void PaYoloRpcElement::SetRuleCfg(const ControllerConfig* cfg) { mCfg=cfg; if(mCfg) { QJsonArray arrayAreas = getJsonArrayFromQString(mCfg->paAlarmInfo.strMaskPath); if(arrayAreas.isEmpty()) { return;//do not detect } for(int i = 0;i < arrayAreas.size();++i) { QJsonValue jsonValue = arrayAreas[i]; QJsonObject obj = jsonValue.toObject(); int x = obj.value("x").toInt(); int y = obj.value("y").toInt(); mPolygon<<(QPoint(x,y)); } } } int PaYoloRpcElement::getRealNum() const { return mRealNum; }