#include "PerStaticElement.h" #include #include #include #include #include #include #include #include #include #include #include PerStaticElement::PerStaticElement(const SdkRule& rule): PipeElement(true), m_sdkRule(rule), m_triggerElement(0,0), m_lTime(AppUtil::getCurrentUs()), pManagerEsDB(nullptr) { pManagerEsDB=new EsDBTool(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort")); } PerStaticElement::~PerStaticElement() { if(pManagerEsDB) { delete pManagerEsDB; pManagerEsDB=nullptr; } } void PerStaticElement::threadInitial() { setMask(m_sdkRule.strAreas.toStdString()); } void PerStaticElement::threadFunc() { if(!isInWeek(m_sdkRule.weekRuleVec)) return; int num=0; for(auto obj:mObjs) { if(obj.score < m_sdkRule.fSensitivity)continue; QRect rect(obj.rect.x,obj.rect.y,obj.rect.width,obj.rect.height); QPoint center = rect.center(); if(mPolygon.containsPoint(center,Qt::OddEvenFill)) { for(auto score:m_lastScoreRect) { if(obj.id == score.id) { obj.isMove = score.isMove; //DBG("moving? "<<_TrackingInfo.m_bMoveState) break; } } } } if((AppUtil::getCurrentUs()-m_lTime)>(m_sdkRule.nTriggerDelay*60*1000*1000)) { for(auto& obj: mObjs){ //compare with last temp memery and clear temp memery for(auto ele:m_lastScoreRect) { if(ele.id==obj.id) { if((obj.rect&ele.rect).area()>ele.rect.area()*0.8) { //not moving obj.isMove = true; auto t_image = image(CvUtil::zoomRectEqual(obj.rect, 1.2, 1.2) & cv::Rect(0, 0, image.cols, image.rows)).clone(); std::string imgUrl=uploadImgToFdfs(t_image); saveInfoToEs(imgUrl,obj); m_triggerElement.setState(true); //DBG("not moving") } else { obj.isMove = false; m_triggerElement.setState(false); //DBG("moving") } break; } } //do temp memery } m_lastScoreRect = mObjs; m_lTime =AppUtil::getCurrentUs(); } m_lastScoreRect=mObjs; m_triggerElement.triggerOnce(); fireConnectors(); } //void PerimeterElement::setSensitivity(float value) //{ // sensitivity = value; //} void PerStaticElement::setObjsResults(const YoloDetect::ObjInfos &value) { m_objs = value; } std::vector PerStaticElement::getLastScoreRects() const { return trackingTrigger->getLastScoreRects(); } void PerStaticElement::setYoloObjects(std::vector value) { mObjs=value; } void PerStaticElement::setMask(std::string mask) { QJsonArray arrayAreas = getJsonArrayFromQString(QString::fromStdString(mask)); 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").toDouble()*4; int y = obj.value("y").toDouble()*4; mPolygon<<(QPoint(x,y)); } } QJsonArray PerStaticElement::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; } bool PerStaticElement::getTriggerState() const { return m_triggerElement.getTriggerState(); } std::string PerStaticElement::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 PerStaticElement::saveInfoToEs(const std::string& imgUrl,const ScoredRect& obj) { 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["videoReqNum"] = m_sdkRule.strCamId.toStdString(); t_json["sdkType"] =to_string(m_sdkRule.nSdkType); // t_json["Gender"] = obj.score; t_json["picName"] = "wait todo";// 抓拍照片名称 t_json["content"] = "wait todo";// 内容描述 t_json["personPicUrl"] = "";// 人员 地库图片 t_json["ChannlId"] = getProperty("ch_id"); // 通道id t_json["likeDate"] =AppUtil::getTimeSecString(); // 比对时间 t_json["picAddress"] =getProperty("str_addr");// 抓拍地址 t_json["picMaxUrl"] = "wait todo"; // 大图路径 // t_json["Age"] ="wait todo"; t_json["picDate"] = obj.properties["time"]; // 抓拍时间,必须有 t_json["picLocalUrl"] = "wait todo"; // 本地路径 t_json["isDelete"] = "1";//默认1 ,0无效 1有效 t_json["likePer"] = obj.score; // 相似值 t_json["BaseName"] = "wait todo";// 地库名称 t_json["videoNum"] = m_sdkRule.strCamId.toStdString();//Video设备编号 t_json["picSmUrl"] = imgUrl; // 抓拍图片 t_json["indeviceid"] = appPref.getStringData("fxDevID");;// 设备id t_json["idcard"] = "wait todo"; t_json["personId"] = "wait todo"; t_json["indevicename"] = appPref.getStringData("fxDevNAME");// 设备名称 t_json["FaceFeature"] = "base64"; t_json["personIsHub"] = m_triggerElement.getTriggerState()?"1":"4"; //1: 报警 2: 可疑 3: 安全 4: 未知 t_json["videoIp"] = m_sdkRule.strAddr.toStdString(); // 设备ip t_json["ack_alarm"]=m_triggerElement.getTriggerState()?"0":""; // que ren shi fou bao jing t_json["cluster_id"]="wait todo"; // ji qun id bool retface = false; if(pManagerEsDB) retface = pManagerEsDB->insertData("personaction", "perVideoAction", t_json.toStyledString(), str_uuid); if (retface) { INFO("perVideoAction db success"); } else { ERR("personaction db fail"); } } bool PerStaticElement::isInWeek(const std::vector& ruleWeek) { int nWeek = QDate::currentDate().dayOfWeek(); for(int i = 0;i < ruleWeek.size();++i) { if(ruleWeek[i].m_nType == nWeek) { QString strCurrent = QDateTime::currentDateTime().toString("hh:mm"); if(strCurrent >= ruleWeek[i].m_strBegin && strCurrent <= ruleWeek[i].m_strEnd) { return true; } } } return false; } void PerStaticElement::setImage(const cv::Mat &value) { value.copyTo(image); }