chenshijun
2019-04-15 c06ac5deb150c99b53d1ff460a88cf2543698788
QiaoJiaSystem/StructureApp/PerimeterElement.cpp
@@ -14,6 +14,7 @@
#include <jsoncpp/json/json.h>
#define ALARM_PERCENT (25)  //25%
PerimeterElement::PerimeterElement(const SdkRule &rule) :
    m_sdkRule(rule),
    PipeElement(true),
@@ -25,8 +26,7 @@
    m_bIsMask(true),
    m_bSetWH(false),
    pointArray(nullptr),
    m_rpcClient("RtspAnalysServer", "127.0.0.1",appPref.getIntData("RpcVTIMPort"),"tcp")
{
    m_rpcClient("RtspAnalysServer", "127.0.0.1", appPref.getIntData("RpcVTIMPort"), "tcp") {
    pManagerEsDB = new EsDBTool(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort"));
}
@@ -36,8 +36,7 @@
        delete pManagerEsDB;
        pManagerEsDB = nullptr;
    }
    if(pointArray)
    {
    if (pointArray) {
//        delete[] pointArray[0];
        delete[] pointArray;
    }
@@ -60,11 +59,17 @@
    bool state = false;
    m_recVec.clear();
    //todo debug
    m_scoreVec.clear();
    m_objTypeVec.clear();
//    DBG("Objs="<<mObjs.size()<<" fSensitivity="<<m_sdkRule.fSensitivity<<" nThreshold"<<m_sdkRule.nThreshold);
    for (auto obj:mObjs) {
    for (auto &obj:mObjs) {
        if (obj.score < m_sdkRule.fSensitivity)continue;
        DBG("objArea:" << obj.rect.width * obj.rect.height);
        DBG("alarmObjType:" << obj.properties["type"]);
        QRect rect(obj.rect.x, obj.rect.y, obj.rect.width, obj.rect.height);
        QPoint center = rect.center();
@@ -74,15 +79,18 @@
            // DBG("picDate="<<picDate);
        }
        if(imgKey.empty())
        {
        if (imgKey.empty()) {
            imgKey =obj.properties["imgKey"];
        }
        if (m_sdkRule.nSdkType == PerimeterSdk)
        if (m_sdkRule.nSdkType == PerimeterSdk) {
            //todo 解析sdkrule 并和检测结果对比
            if (m_sdkRule.strPerimeterObjType.toStdString().find(obj.properties["type"]) ==
                m_sdkRule.strPerimeterObjType.toStdString().npos)//页面没有配置了该算法
        {
                continue;
            }
            if(m_bIsMask)
            {
            if (m_bIsMask) {
                   std::vector<Point> poly2;
                   std::vector<Point> interPoly;
                   poly2.push_back(Point(rect.x(),rect.y()));
@@ -97,26 +105,21 @@
                   int per2 = (int)(inter / total2 * 100);
                   int per=std::max(per1,per2);
                   if(ALARM_PERCENT <= per)
                   {
                if (ALARM_PERCENT <= per) {
                       //DBG("per 1="<<per1<<" per2="<<per2<<" per="<<per);
                       m_recVec.push_back(obj.rect);
                    m_scoreVec.push_back(obj.score);
                    m_objTypeVec.push_back(obj.properties["type"]);
                       num++;
                    DBG("============alarmObjType:" << obj.properties["type"] << " score:" << obj.score);
                   }
            }
        }
        else if (mPolygon.containsPoint(center, Qt::OddEvenFill) || !m_bIsMask)
        {
        } else if (mPolygon.containsPoint(center, Qt::OddEvenFill) || !m_bIsMask) {
            m_recVec.push_back(obj.rect);
            num++;
        }
    }
    switch (m_sdkRule.nSdkType) {
@@ -166,14 +169,15 @@
        default:
            break;
    }
    INFO("State:"<<state<<" Num:"<<num<<" mRealNum:"<<mRealNum<<" LowerLimit :"<<m_sdkRule.nAlarmNumLowerLimit<<" HightLimit: "<<m_sdkRule.nAlarmNumUpperLimit);
    INFO("State:" << state << " Num:" << num << " mRealNum:" << mRealNum << " LowerLimit :"
                  << m_sdkRule.nAlarmNumLowerLimit << " HightLimit: " << m_sdkRule.nAlarmNumUpperLimit
                  << " m_triggerElement.getTriggerState() :" << m_triggerElement.getTriggerState());
    m_triggerElement.setState(state);
    m_triggerElement.triggerOnce();
    if (m_triggerElement.getTriggerState())
    {
    DBG("m_triggerElement.getTriggerState():" << m_triggerElement.getTriggerState());
    if (m_triggerElement.getTriggerState()) {
        if(num > 0) {
            if(pointArray!=nullptr)
            {
            if (pointArray != nullptr) {
                const cv::Point2i* ppt[1] = { pointArray };
                int npt[]={npts};
@@ -181,9 +185,16 @@
                cv::polylines(image, ppt,npt, 1, true,cv::Scalar(255,255,0), 2);
            }
            for(auto rect:m_recVec)
            {
                cv::rectangle(image, rect,  cv::Scalar(0, 0, 255), 2);
//            for(auto rect:m_recVec)
//            {
//                cv::rectangle(image, rect,  cv::Scalar(0, 0, 255), 2);
//            }
            for (int i = 0; i < m_recVec.size(); i++) {
                cv::rectangle(image, m_recVec[i], cv::Scalar(0, 0, 255), 2);
                cv::putText(image, to_string(m_scoreVec[i]), cv::Point(m_recVec[i].x, m_recVec[i].y + 12),
                            cv::HersheyFonts::FONT_HERSHEY_PLAIN, 1.5, cv::Scalar(255, 255, 0));
                cv::putText(image, m_objTypeVec[i], cv::Point(m_recVec[i].x, m_recVec[i].y + 24),
                            cv::HersheyFonts::FONT_HERSHEY_PLAIN, 1.5, cv::Scalar(255, 255, 0));
            }
//            cv::Mat t_image = image(CutMask()).clone();
//            if(t_image.empty())
@@ -277,12 +288,9 @@
        int x = obj.value("x").toDouble() *sizeW;
        int y = obj.value("y").toDouble() *sizeH;
        pointArray[i]={x,y};
        if(m_sdkRule.nSdkType == PerimeterSdk)
        {
        if (m_sdkRule.nSdkType == PerimeterSdk) {
             poly1.push_back(Point(x,y));
        }
        else
        {
        } else {
             mPolygon << (QPoint(x, y));
        }
        DBG("width="<<sizeW);
@@ -307,8 +315,7 @@
//        image = cv::Mat(value.rows, value.cols, CV_8UC3, sharedMemory->data());
//    }
    value.copyTo(image);
    if(!m_bSetWH)
    {
    if (!m_bSetWH) {
        setMask(m_sdkRule.strAreas.toStdString());
        m_bSetWH=true;
    }
@@ -389,16 +396,14 @@
    t_json["imgKey"] = imgKey;
    try {
        auto server = m_rpcClient.getServer();
        if (!server)
        {
        if (!server) {
            ERR("server is null");
            //return false;
        }
        INFO("Record Video "<<imgKey);
        server->recordVideo(imgKey);
    }
    catch (std::exception &e)
    {
    catch (std::exception &e) {
        ERR("Record Video Err: "<<imgKey <<"   Message: "<<e.what());
        //return false;
    }