From 9f08028f23d9e5cbfa159bec1e07d63b141a6809 Mon Sep 17 00:00:00 2001 From: zhangjixing <775834166@qq.com> Date: 星期五, 18 一月 2019 10:17:00 +0800 Subject: [PATCH] --- QiaoJiaSystem/StructureApp/PerimeterElement.cpp | 441 ++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 311 insertions(+), 130 deletions(-) diff --git a/QiaoJiaSystem/StructureApp/PerimeterElement.cpp b/QiaoJiaSystem/StructureApp/PerimeterElement.cpp index df68f9a..b605b07 100644 --- a/QiaoJiaSystem/StructureApp/PerimeterElement.cpp +++ b/QiaoJiaSystem/StructureApp/PerimeterElement.cpp @@ -1,5 +1,5 @@ #include "PerimeterElement.h" -#include <basic/event/EventBus.hpp> +//#include <basic/event/EventBus.hpp> #include <basic/debug/Debug.h> #include <iostream> #include <opencv2/opencv.hpp> @@ -8,98 +8,192 @@ #include <QJsonObject> #include <QString> #include <basic/util/app/AppPreference.hpp> -#include <basic/db/Elasticsearch/EsDBTool.h> + #include <basic/util/opencv/CvUtil.h> #include <uuid/uuid.h> #include <jsoncpp/json/json.h> -PerimeterElement::PerimeterElement(int alarm_people_num): -m_nAlarmPeopleNum(alarm_people_num), -PipeElement(true), -trackingTrigger(nullptr), -mRealNum(0), -m_triggerElement(0,50) + +#define ALARM_PERCENT (10) //10% +PerimeterElement::PerimeterElement(const SdkRule &rule) : + m_sdkRule(rule), + PipeElement(true), + trackingTrigger(nullptr), + mRealNum(0), + m_triggerElement(rule.nTriggerDelay*8,0), + pManagerEsDB(nullptr), + m_bIsMask(true) { - trackingTrigger= new TrackingTrigger(0.5); - - + pManagerEsDB = new EsDBTool(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort")); } -PerimeterElement::~PerimeterElement() -{ - if(trackingTrigger) - { - delete trackingTrigger; - trackingTrigger=nullptr; +PerimeterElement::~PerimeterElement() { + if (pManagerEsDB) { + delete pManagerEsDB; + pManagerEsDB = nullptr; } } - -void PerimeterElement::threadInitial() -{ - +void PerimeterElement::threadInitial() { + setMask(m_sdkRule.strAreas.toStdString()); } -void PerimeterElement::threadFunc() -{ +void PerimeterElement::threadFunc() { - int num=0; - string detKey = getProperty("dev_id") + getProperty("ch_id")+getProperty("sdkType")+".det"; - float t_det_sc =0.75; + //ClockTimer ct("PerimeterElement::threadFunc"); + if (!isInWeek(m_sdkRule.weekRuleVec)) + return; + int num = 0; + std::string picDate; + bool state = false; - t_det_sc= appPref.getFloatData(detKey) == -1 ? 0.75 : appPref.getFloatData(detKey); + m_recVec.clear(); + // DBG("Objs="<<mObjs.size()<<" fSensitivity="<<m_sdkRule.fSensitivity<<" nThreshold"<<m_sdkRule.nThreshold); + for (auto obj:mObjs) { -// t_det_sc= appPref.getFloatData(t_camIdex + "perimeter.det") == -1 ? 0.75 : appPref.getFloatData(t_camIdex + "perimeter.det"); + 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(); - for(auto obj:m_objs){ - if(obj.type!=0) continue; - //todo - if(obj.prob < ((1-0.5)/2+0.5))continue; + if (picDate.empty()) { + picDate = obj.properties["time"]; + // DBG("picDate="<<picDate); -// ScoredRect scoredRect; + } + if (m_sdkRule.nSdkType == PerimeterSdk) + { - 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)) + if(m_bIsMask) { - // 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); + std::vector<Point> poly2; + std::vector<Point> interPoly; + poly2.push_back(Point(rect.x(),rect.y())); + poly2.push_back(Point(rect.x()+rect.width(),rect.y())); + poly2.push_back(Point(rect.x()+rect.width(),rect.y()+rect.height())); + poly2.push_back(Point(rect.x(),rect.y()+rect.height())); + IntAreaCalcUtil::PolygonClip(poly1,poly2,interPoly); + float inter = IntAreaCalcUtil::intAreaCalc(interPoly); + float total1 =IntAreaCalcUtil::intAreaCalc(poly1); + float total2 = IntAreaCalcUtil::intAreaCalc(poly2); + int per1 = (int)(inter / total1 * 100); + int per2 = (int)(inter / total2 * 100); + int per=std::max(per1,per2); + + if(ALARM_PERCENT <= per) + { + //DBG("per 1="<<per1<<" per2="<<per2<<" per="<<per); + m_recVec.push_back(obj.rect); + num++; + } } -// if(trackingTrigger->triggerOnce(scoredRect)) -// { -// trackingTrigger->getLastRect().properties["id"] = to_string(scoredRect.id); -// trackingTrigger->getLastRect().properties["type"] = cocoData[obj.type]; -// } + + + } + else if (mPolygon.containsPoint(center, Qt::OddEvenFill) || !m_bIsMask) + { + m_recVec.push_back(obj.rect); + + + num++; + } + + } - trackingTrigger->triggerLine(); - if(num>=m_nAlarmPeopleNum) - { - m_triggerElement.setState(true); + switch (m_sdkRule.nSdkType) { + case PerimeterSdk: + //state = num > 0 ; + state =( num !=mRealNum); + // DBG("num="<<num<< "time="<< picDate); + + + break; + case CrowdSdk: + state = num > m_sdkRule.nAlarmNumLowerLimit && num !=mRealNum; + + break; + case PerHubSdk: + state = num > m_sdkRule.nAlarmNumLowerLimit && num < m_sdkRule.nAlarmNumUpperLimit && num !=mRealNum; + + +// if(m_sdkRule.nAlarmNumLowerLimit>=0) +// { +// if( m_sdkRule.nAlarmNumUp2019-01-16 09:49:57perLimit>m_sdkRule.nAlarmNumLowerLimit+1) +// { + +// m_triggerElement.setState(num>m_sdkRule.nAlarmNumLowerLimit && num<m_sdkRule.nAlarmNumUpperLimit); +// } +// else +// { +// m_triggerElement.setState(num>m_sdkRule.nAlarmNumLowerLimit); +// } + +// } +// else +// { +// if(m_sdkRule.nAlarmNumUpperLimit>0) +// { +// m_triggerElement.setState(num>m_sdkRule.nAlarmNumUpperLimit); +// } +// else +// { +// m_triggerElement.setState(false); +// } +// } + + + break; + default: + break; } - else - { - m_triggerElement.setState(false); - } + + m_triggerElement.setState(state); m_triggerElement.triggerOnce(); - mRealNum=num; + if (m_triggerElement.getTriggerState() ) + { + if(num > 0) { + cv::Mat t_image = image(CutMask()).clone(); + if(t_image.empty()) + { + DBG("t_image empty"); + return; + } + std::string imgUrl = uploadImgToFdfs(t_image); + saveInfoToEs(imgUrl, picDate); + } + DBG("num=" << num << " lastnum=" << mRealNum); + mRealNum = num; + } +// if (m_triggerElement.getTriggerState() && num!=mRealNum) +// { + +// cv::Mat t_image = image(CutMask()).clone(); +// if(t_image.empty()) +// { +// DBG("t_image empty"); +// return; +// } +// std::string imgUrl = uploadImgToFdfs(t_image); +// saveInfoToEs(imgUrl, picDate); +// DBG("num=" << num << " lastnum=" << mRealNum); +// mRealNum = num; +// } + + + +// if(!state) +// { +// mRealNum = num; +// } + + + // DBG("m_sdkRule.nSdkType="<<m_sdkRule.nSdkType<<" num="<<num); fireConnectors(); } @@ -108,15 +202,14 @@ -void PerimeterElement::setSensitivity(float value) -{ - sensitivity = value; -} +//void PerimeterElement::setSensitivity(float value) +//{ +// sensitivity = value; +//} -void PerimeterElement::setObjsResults(const YoloDetect::ObjInfos &value) -{ +void PerimeterElement::setObjsResults(const YoloDetect::ObjInfos &value) { m_objs = value; } @@ -124,56 +217,66 @@ return trackingTrigger->getLastScoreRects(); } -void PerimeterElement::setYoloObjects(std::vector<ScoredRect> value) -{ - mObjs=value; +void PerimeterElement::setYoloObjects(std::vector<ScoredRect> value) { + mObjs.clear(); + mObjs = value; } -int PerimeterElement::getRealNum() const -{ +int PerimeterElement::getRealNum() const { //DBG("getRealNum "<<mRealNum); return mRealNum; } -void PerimeterElement::setMask(std::string mask) -{ + +void PerimeterElement::setMask(std::string mask) { QJsonArray arrayAreas = getJsonArrayFromQString(QString::fromStdString(mask)); - if(arrayAreas.isEmpty()) - { + if (arrayAreas.isEmpty() && m_sdkRule.nSdkType != PerimeterSdk) { + m_bIsMask=false; return;//do not detect } - for(int i = 0;i < arrayAreas.size();++i) - { + int size = arrayAreas.size(); + npts = size; + for (int i = 0; i < size; ++i) { + QJsonValue jsonValue = arrayAreas[i]; QJsonObject obj = jsonValue.toObject(); - int x = obj.value("x").toInt()*2; - int y = obj.value("y").toInt()*2; - mPolygon<<(QPoint(x,y)); + int x = obj.value("x").toDouble() * 4; + int y = obj.value("y").toDouble() * 4; + if(m_sdkRule.nSdkType == PerimeterSdk) + { + poly1.push_back(Point(x,y)); + } + else + { + mPolygon << (QPoint(x, y)); + } + + } } -QJsonArray PerimeterElement::getJsonArrayFromQString(const QString& strJson) -{ + +QJsonArray PerimeterElement::getJsonArrayFromQString(const QString &strJson) { QJsonDocument jsonDocument = QJsonDocument::fromJson(strJson.toLocal8Bit()); - if( jsonDocument.isNull() ){ - //DBG("please check the string"<< strJson.toLocal8Bit()); + if (jsonDocument.isNull()) { + DBG("please check the string" << strJson.toStdString()); return QJsonArray(); } QJsonArray jsonArray = jsonDocument.array(); return jsonArray; } -void PerimeterElement::setImage(const cv::Mat &value) -{ +void PerimeterElement::setImage(const cv::Mat &value) { // if (value.size != image.size) { // image = cv::Mat(value.rows, value.cols, CV_8UC3, sharedMemory->data()); // } -// value.copyTo(image); + value.copyTo(image); } + bool PerimeterElement::getTriggerState() const { return m_triggerElement.getTriggerState(); } -std::string PerimeterElement::uploadImgToFdfs(cv::Mat& image) -{ + +std::string PerimeterElement::uploadImgToFdfs(cv::Mat &image) { std::string strImgUrl = "http://"; if (fdfsClient != nullptr && fdfsClient->fastFds != nullptr) { fdfsClient->rwLock.rdlock(); @@ -181,7 +284,7 @@ CvUtil::cvMat2Buffer(image, buffer); std::string strImgUrlTmp = ""; fdfsClient->fastFds->uploadFile(buffer, strImgUrlTmp, "jpg"); - strImgUrl.append(fdfsClient->fastFds->getIp() + "/" + strImgUrlTmp); + // strImgUrl.append(fdfsClient->fastFds->getIp() + "/" + strImgUrlTmp); strImgUrl.clear(); strImgUrl = strImgUrlTmp; // strImgUrl.append("/").append(strImgUrlTmp); @@ -189,53 +292,131 @@ } return strImgUrl; } -bool PerimeterElement::saveInfoToEs(const std::string& imgUrl,const ::YoloDetect::ObjInfo& obj) -{ - //#todo - EsDBTool pManagerEsDB(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort")); +bool PerimeterElement::saveInfoToEs(const std::string &imgUrl, const std::string &time) { - string str_uuid; - uuid_t t_uuid; - char str[36]; - uuid_generate(t_uuid); - uuid_unparse(t_uuid, str); - str_uuid = str; + 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; //涓婚敭 + 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["videoReqNum"] = m_sdkRule.strCamId.toStdString(); + t_json["sdkType"] = to_string(m_sdkRule.nSdkType); +// DBG("to_string(m_sdkRule.nSdkType)="<<to_string(m_sdkRule.nSdkType)); +// t_json["Gender"] = obj.score; - 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");//褰撳墠鏈嶅姟鍣↖P鍦板潃 + 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"] = m_sdkRule.strAddr.toStdString();// 鎶撴媿鍦板潃 + DBG("picAddress="<<m_sdkRule.strAddr.toStdString()); + t_json["picMaxUrl"] = "wait todo"; // 澶у浘璺緞 - 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["Age"] ="wait todo"; + t_json["picDate"] = time; // 鎶撴媿鏃堕棿锛屽繀椤绘湁 + DBG("picDate="<<time); + t_json["picLocalUrl"] = "wait todo"; // 鏈湴璺緞 + 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"); + t_json["likePer"] = "0"; // 鐩镐技鍊� + + 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"] = appPref.getStringData("clusterID");; // 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 PerimeterElement::isInWeek(const std::vector<LActRuleWeekRecord> &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; + } } - else - { - ERR(name<<"db fail"); + } + return false; +} + +cv::Rect PerimeterElement::CutMask() { + int size = m_recVec.size(); + //QPoint max,secMax; + cv::Rect rect, max, min; + + if (size > 0) { + + max = m_recVec[0]; + min = m_recVec[0]; + } + + for (int i = 1; i < size; ++i) { + if (m_recVec[i].x > max.x) { + + max.x = m_recVec[i].x; } + + + if (m_recVec[i].y > max.y) { + + max.y = m_recVec[i].y; + } + if (m_recVec[i].x < min.x) { + min.x = m_recVec[i].x; + } + + if (m_recVec[i].y < min.y) { + min.y = m_recVec[i].y; + } + + } + + if (size == 1) { + rect = max; + } else { + + rect.x = min.x; + rect.y = min.y; + rect.width = max.x + max.width - min.x; + rect.height = max.y + max.height - min.y; + } + + rect = CvUtil::zoomRectEqual(rect, 1.2, 1.2) & cv::Rect(0, 0, image.cols, image.rows); +// DBG("min x="<<min.x<<"y"<<min.y<<"w"<<min.width<<"h"<<min.height); +// DBG("max x="<<max.x<<"y"<<max.y<<"w"<<max.width<<"h"<<max.height); +// DBG("RECT x="<<rect.x<<"y"<<rect.y<<"w"<<rect.width<<"h"<<rect.height); + return rect; +} +bool PerimeterElement::isAnd() +{ + } -- Gitblit v1.8.0