#include "PerimeterElement.h" //#include #include #include #include #include #include #include #include #include #include #include #include #include PerimeterElement::PerimeterElement(int alarm_people_num): m_nAlarmPeopleNum(alarm_people_num), PipeElement(true), trackingTrigger(nullptr), mRealNum(0), m_triggerElement(0,50) { trackingTrigger= new TrackingTrigger(0.5); } PerimeterElement::~PerimeterElement() { if(trackingTrigger) { delete trackingTrigger; trackingTrigger=nullptr; } } void PerimeterElement::threadInitial() { } void PerimeterElement::threadFunc() { int num=0; string detKey = getProperty("dev_id") + getProperty("ch_id")+getProperty("sdkType")+".det"; float t_det_sc =0.75; t_det_sc= appPref.getFloatData(detKey) == -1 ? 0.75 : appPref.getFloatData(detKey); // t_det_sc= appPref.getFloatData(t_camIdex + "perimeter.det") == -1 ? 0.75 : appPref.getFloatData(t_camIdex + "perimeter.det"); for(auto obj:m_objs){ if(obj.type!=0) continue; //todo if(obj.prob < ((1-0.5)/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); // scoredRect.score = scoredRect.rect.area() > 0 ? obj.prob : 0; // cv::Rect rec=obj.rect; QRect rect(x,y,w,h); QPoint center = rect.center(); if(mPolygon.containsPoint(center,Qt::OddEvenFill)) { // scoredRect.isMask=true; //if(bInWeekTime) num++; auto t_image = image(cv::Rect(x, y, w, h)& cv::Rect(0, 0, image.cols, image.rows)).clone(); std::string imgUrl=uploadImgToFdfs(t_image); saveInfoToEs(imgUrl,obj); } // if(trackingTrigger->triggerOnce(scoredRect)) // { // trackingTrigger->getLastRect().properties["id"] = to_string(scoredRect.id); // trackingTrigger->getLastRect().properties["type"] = cocoData[obj.type]; // } } trackingTrigger->triggerLine(); if(num>=m_nAlarmPeopleNum) { m_triggerElement.setState(true); } else { m_triggerElement.setState(false); } m_triggerElement.triggerOnce(); mRealNum=num; fireConnectors(); } void PerimeterElement::setSensitivity(float value) { sensitivity = value; } void PerimeterElement::setObjsResults(const YoloDetect::ObjInfos &value) { m_objs = value; } std::vector PerimeterElement::getLastScoreRects() const { return trackingTrigger->getLastScoreRects(); } void PerimeterElement::setYoloObjects(std::vector value) { mObjs=value; } int PerimeterElement::getRealNum() const { //DBG("getRealNum "<data()); // } // value.copyTo(image); } bool PerimeterElement::getTriggerState() const { return m_triggerElement.getTriggerState(); } std::string PerimeterElement::uploadImgToFdfs(cv::Mat& image) { std::string strImgUrl = "http://"; if (fdfsClient != nullptr && fdfsClient->fastFds != nullptr) { fdfsClient->rwLock.rdlock(); std::vector buffer; CvUtil::cvMat2Buffer(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(); } return strImgUrl; } bool PerimeterElement::saveInfoToEs(const std::string& imgUrl,const ::YoloDetect::ObjInfo& obj) { //#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; 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["likeDate"] = AppUtil::getTimeSecString();//比较时间 t_json["picAddress"] = getProperty("str_addr");//抓拍地址 t_json["picSmUrl"] = imgUrl;//人员抓小图 t_json["picDate"] = getProperty("time"); 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"); bool retface = false; std::string name=getProperty("sdkType")+"det"; retface = pManagerEsDB.insertData(name, "info", t_json.toStyledString(), str_uuid); if (retface) { INFO(name<<"db success"); } else { ERR(name<<"db fail"); } }