派生自 development/c++

zhangjixing
2019-01-15 abd9036f024a77d22b47a108bc88b27b9732e3c5
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,17 @@
}
//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, 0),
              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)
{
    sharedMemory = new QSharedMemory(QString(shareMemoryName.c_str()));
    if (!sharedMemory->create(4608 * 2592 * 4)) {
        sharedMemory->attach();
@@ -55,13 +61,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 +87,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 +97,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 +105,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;
@@ -166,3 +182,48 @@
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
    }
    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 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;
}