From e4c9b5bfb1d9000c08d84f2f044cd0c3605a2945 Mon Sep 17 00:00:00 2001 From: miyanhui <dennismi1024@gmail.com> Date: 星期三, 13 二月 2019 14:17:13 +0800 Subject: [PATCH] 修复检测结果ImgKey不对应的问题 --- QiaoJiaSystem/StructureApp/FaceRpcElement.cpp | 85 +++++++++++++++++++++++++++++++++++++++--- 1 files changed, 79 insertions(+), 6 deletions(-) diff --git a/QiaoJiaSystem/StructureApp/FaceRpcElement.cpp b/QiaoJiaSystem/StructureApp/FaceRpcElement.cpp index ccee428..8e19e77 100644 --- a/QiaoJiaSystem/StructureApp/FaceRpcElement.cpp +++ b/QiaoJiaSystem/StructureApp/FaceRpcElement.cpp @@ -4,7 +4,8 @@ #include <QtCore/QString> #include <basic/timer_counter/Clocktimer.h> #include <basic/util/opencv/CvUtil.h> - +#include <QJsonDocument> +#include <QJsonObject> #define GETSCORE(IDENT) appPref.getFloatData(IDENT) == -1 ? 95 : appPref.getFloatData(IDENT); //************************************ @@ -29,12 +30,18 @@ } //todo appPref.getStringData("face.detect.proxy") -FaceRpcElement::FaceRpcElement(string shareMemoryName) : +FaceRpcElement::FaceRpcElement(string shareMemoryName,const SdkRule& rule) : //#todo rpcClient(appPref.getStringData("faceDete.proxy"), appPref.getStringData("faceDete.ip"), - appPref.getIntData("faceDete.port"), "tcp"), m_triggerElement(0, 50), + appPref.getIntData("faceDete.port"), "tcp"), + m_triggerElement(0, 0), // rpcClient("faceServer","",10002,"tcp"), - sharedMemory(nullptr), trackingTrigger(nullptr) { + sharedMemory(nullptr), + trackingTrigger(nullptr), + m_sdkRule(rule), + m_bIsMask(true), + m_bSetWH(false) +{ sharedMemory = new QSharedMemory(QString(shareMemoryName.c_str())); if (!sharedMemory->create(4608 * 2592 * 4)) { sharedMemory->attach(); @@ -55,13 +62,14 @@ t_camIdex = shareMemoryName.substr(0, shareMemoryName.rfind("faceRpc")); } - float t_score = GETSCORE(t_camIdex + "face.det"); + float t_score = m_sdkRule.nQuality; DBG(" TESTCODE getValue" << t_camIdex << " " << t_score << " " << t_score / 100); t_score = t_score / 100; trackingTrigger = new TrackingTrigger(t_score); +// setMask(m_sdkRule.strAreas.toStdString()); } FaceRpcElement::~FaceRpcElement() { @@ -80,6 +88,8 @@ // string string1(AppUtil::getTimeString() + "-ff2" + getProperty("time") + ".jpg"); // cv::imwrite(string1, image); // } + if(!isInWeek(m_sdkRule.weekRuleVec)) + return; triggerMats.clear(); triggerFaces.clear(); triggerScoredRects.clear(); @@ -88,6 +98,7 @@ if (!server) ERR("server is null"); faces = server->faceDetect(image.cols, image.rows, sharedMemory->key().toStdString()); // DBG("faces.size " << faces.size()); + for (auto face: faces) { ::FaceDetect::RECT &rect = face.rcFace; ScoredRect scoredRect; @@ -95,6 +106,12 @@ int y = face.rcFace.top; int w = face.rcFace.right - face.rcFace.left; int h = face.rcFace.bottom - face.rcFace.top; + QRect re(x,y,w,h); + QPoint center = re.center(); + if(m_bIsMask && !mPolygon.containsPoint(center,Qt::OddEvenFill)) + { + return; + } scoredRect.rect = {x, y, w, h}; scoredRect.score = (float) face.fAngle.confidence; @@ -107,7 +124,9 @@ trackingTrigger->getLastRect().properties["smile"] = to_string(property.smile_level); trackingTrigger->getLastRect().properties["race"] = to_string(property.race); trackingTrigger->getLastRect().properties["time"] = getProperty("time"); - + trackingTrigger->getLastRect().properties["detectscore"] = scoredRect.score; + trackingTrigger->getLastRect().properties["imgKey"] = getProperty("imgKey"); + INFO("FaceRpcElement SaveToES: "<<getProperty("imgKey")); triggerFaces.push_back(face); triggerMats.push_back(image( CvUtil::zoomRectEqual(scoredRect.rect, 1.5, 1.5) & cv::Rect(0, 0, image.cols, image.rows)).clone()); @@ -161,8 +180,62 @@ image = cv::Mat(value.rows, value.cols, CV_8UC3, sharedMemory->data()); } value.copyTo(image); + if(!m_bSetWH) + { + setMask(m_sdkRule.strAreas.toStdString()); + m_bSetWH=true; + } } bool FaceRpcElement::getTriggerState() const { return m_triggerElement.getTriggerState(); } +void FaceRpcElement::setMask(std::string mask) +{ + QJsonArray arrayAreas = getJsonArrayFromQString(QString::fromStdString(mask)); + if(arrayAreas.isEmpty()) + { + m_bIsMask=false; + return;//do not detect + } + float sizeW=(float)appPref.getIntData(m_sdkRule.strCamId.toStdString()+"width")/480; + float sizeH=(float)appPref.getIntData(m_sdkRule.strCamId.toStdString()+"height")/270; + for(int i = 0;i < arrayAreas.size();++i) + { + QJsonValue jsonValue = arrayAreas[i]; + QJsonObject obj = jsonValue.toObject(); + int x = obj.value("x").toDouble() *sizeW ; + int y = obj.value("y").toDouble() *sizeH; + mPolygon<<(QPoint(x,y)); + DBG("width="<<sizeW); + DBG("height="<<sizeH); + + } +} +QJsonArray FaceRpcElement::getJsonArrayFromQString(const QString& strJson) +{ + QJsonDocument jsonDocument = QJsonDocument::fromJson(strJson.toLocal8Bit()); + if( jsonDocument.isNull() ){ + DBG("please check the string"<< strJson.toStdString()); + return QJsonArray(); + } + QJsonArray jsonArray = jsonDocument.array(); + return jsonArray; +} +bool FaceRpcElement::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; + } + } + } + return false; +} -- Gitblit v1.8.0