From 9f08028f23d9e5cbfa159bec1e07d63b141a6809 Mon Sep 17 00:00:00 2001
From: zhangjixing <775834166@qq.com>
Date: 星期五, 18 一月 2019 10:17:00 +0800
Subject: [PATCH] 

---
 QiaoJiaSystem/build/EncodeServer                      |    0 
 QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp |   29 +-
 QiaoJiaSystem/build/RapidStructureApp                 |    0 
 QiaoJiaSystem/StructureApp/PerimeterElement.cpp       |  118 ++++++++---
 QiaoJiaSystem/build/FaceSearchServer                  |    0 
 QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.h   |    3 
 QiaoJiaSystem/YoloServer/main.cpp                     |   14 
 QiaoJiaSystem/build/DataWebServer                     |    0 
 QiaoJiaSystem/StructureApp/IntAreaCalcUtil.cpp        |    2 
 QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.cpp |   88 +++++---
 QiaoJiaSystem/StructureApp/IntAreaCalcUtil.h          |  238 +++++++++++++++++++++++
 QiaoJiaSystem/RapidStructureApp/TriggerElement.cpp    |    6 
 QiaoJiaSystem/StructureApp/PerimeterElement.h         |    6 
 QiaoJiaSystem/build/RecordVideo                       |    0 
 QiaoJiaSystem/build/scpToSer.sh                       |    2 
 QiaoJiaSystem/CMakeLists.txt                          |    2 
 QiaoJiaSystem/build/YoloServer                        |    0 
 QiaoJiaSystem/build/YoloDetectClientTest              |    0 
 QiaoJiaSystem/StructureApp/PerStaticElement.cpp       |    4 
 QiaoJiaSystem/build/RapidStructureAppRtsp             |    0 
 QiaoJiaSystem/RapidStructureApp/TriggerElement.h      |    2 
 QiaoJiaSystem/StructureApp/AppPipeController.cpp      |   10 
 QiaoJiaSystem/DataManagerServer/http_configserver.cpp |   21 +
 QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp      |   28 ++
 QiaoJiaSystem/VideoAnalysFromHC/CMakeLists.txt        |    1 
 QiaoJiaSystem/YoloServer/YoloDetectServerI.cpp        |    1 
 QiaoJiaSystem/build/VideoAnalysFromHC                 |    0 
 QiaoJiaSystem/StructureApp/CMakeLists.txt             |    1 
 QiaoJiaSystem/build/config.db                         |    0 
 QiaoJiaSystem/StructureApp/YoloRpcElement.cpp         |   18 -
 QiaoJiaSystem/build/StructureApp                      |    0 
 31 files changed, 478 insertions(+), 116 deletions(-)

diff --git a/QiaoJiaSystem/CMakeLists.txt b/QiaoJiaSystem/CMakeLists.txt
index 0d53a05..24bb196 100644
--- a/QiaoJiaSystem/CMakeLists.txt
+++ b/QiaoJiaSystem/CMakeLists.txt
@@ -14,7 +14,7 @@
     ../../BasicPlatForm/libs/libuuid/include
 )
 
-#add_subdirectory(StructureApp)
+add_subdirectory(StructureApp)
 add_subdirectory(FaceDetectServer)
 add_subdirectory(YoloServer)
 add_subdirectory(FaceSearchServer)
diff --git a/QiaoJiaSystem/DataManagerServer/http_configserver.cpp b/QiaoJiaSystem/DataManagerServer/http_configserver.cpp
index bc399be..bc54682 100644
--- a/QiaoJiaSystem/DataManagerServer/http_configserver.cpp
+++ b/QiaoJiaSystem/DataManagerServer/http_configserver.cpp
@@ -395,6 +395,7 @@
     /*sdk login*/
     ulRet = IMOS_MW_Login(username, passwd, ip, 0, szUserID);
     if (ERR_COMMON_SUCCEED != ulRet) {
+         (VOID) IMOS_MW_Cleanup();
         printf("Login error ulRet[%lu]", ulRet);
         return false;
     }
@@ -402,6 +403,8 @@
     pstBasicInfo = (IMOS_MW_BASIC_DEVICE_INFO_S *) malloc(sizeof(IMOS_MW_BASIC_DEVICE_INFO_S));
     ulRet = IMOS_MW_GetDeviceStatus(szUserID, 0, IMOS_MW_STATUS_BASIC_INFO, (void *) pstBasicInfo);
     if (ERR_COMMON_SUCCEED != ulRet) {
+        (VOID) IMOS_MW_Logout(szUserID);
+        (VOID) IMOS_MW_Cleanup();
         printf("GetDeviceStatus Error[%lu]\n", ulRet);
         return false;
     }
@@ -1048,7 +1051,7 @@
         {
            if(is_exist)
            {
-               return "{\"ret_status\": \"鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
+               return "{\"ret_status\": \"璇峰嬁閲嶅娣诲姞!\"}";
            }
            else
            {
@@ -3043,13 +3046,27 @@
         std::string pass = value["str_password"].asString();
         std::string brand = value["str_brand"].asString();
         std::string rtsp_url = rtspAddrBuild(ip, port, username, pass, brand);
-        if (rtsp_url.empty()) {
+        if (rtsp_url.empty() )
+        {
             return "{\"ret_status\":\"鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
         }
+//        unsigned char serialnumber[SERIALNO_LEN] = {0};
+//        int ret = getDevSerialNumber(ip.c_str(), port,username.c_str(),pass.c_str(),brand.c_str(),serialnumber);
+
+
+//        if ((!ret) || (serialnumber[0] == 0))
+//        {
+//            return "{\"ret_status\": \"鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
+//        }
+
+//        std::string str_cam_dev_id = std::string((char *) serialnumber);//鎽勫儚鏈篿d cam_mac
+
         std::string str_imgName = appConfig.getStringProperty("cutPath");
         if (str_imgName.back() != '/') {
             str_imgName.push_back('/');
         }
+        str_imgName +=ip;
+        str_imgName +="-";
         str_imgName += "snapshot.jpg";
         //admin:a1234567@192.168.1.201:554/h264/ch1/main/av_stream -r 1/25 -f image2 -s 1920*1080 /home/basic/work_src/a.jpg
         std::string cmd("ffmpeg -i " + rtsp_url + " -r 1/25  -f image2 -s 1920*1080 -y " + str_imgName);
diff --git a/QiaoJiaSystem/RapidStructureApp/TriggerElement.cpp b/QiaoJiaSystem/RapidStructureApp/TriggerElement.cpp
index 6f0272d..11233ce 100644
--- a/QiaoJiaSystem/RapidStructureApp/TriggerElement.cpp
+++ b/QiaoJiaSystem/RapidStructureApp/TriggerElement.cpp
@@ -78,7 +78,13 @@
     lastDown = 0;
     triggerType = DOWN;
 }
+void TriggerElement::resetTriggerState()
+{
 
+    //state=false;
+    triggerState=false;
+    triggerTimes=0;
+}
 
 void TriggerElement::timerFunc() {
 
diff --git a/QiaoJiaSystem/RapidStructureApp/TriggerElement.h b/QiaoJiaSystem/RapidStructureApp/TriggerElement.h
index ce6e32d..3c4627f 100644
--- a/QiaoJiaSystem/RapidStructureApp/TriggerElement.h
+++ b/QiaoJiaSystem/RapidStructureApp/TriggerElement.h
@@ -29,6 +29,8 @@
 
     bool getTriggerState() const;
 
+    void resetTriggerState();
+
 private:
     bool state;
     bool triggerState;
diff --git a/QiaoJiaSystem/StructureApp/AppPipeController.cpp b/QiaoJiaSystem/StructureApp/AppPipeController.cpp
index 321f170..457c8db 100644
--- a/QiaoJiaSystem/StructureApp/AppPipeController.cpp
+++ b/QiaoJiaSystem/StructureApp/AppPipeController.cpp
@@ -195,9 +195,9 @@
         mutex.lock();
         cv::Mat imageTemp = videoCaptureElement.getImage();
 
-        std::string strNewTime;
-        strNewTime = AppUtil::getTimeUSecString();
-
+        std::string  strNewTime = AppUtil::getTimeUSecString();;
+        mutex.unlock();
+//DBG("m_camId="<<m_camId<<"  strNewTime="<<strNewTime);
 //        cv::putText(imageTemp, strNewTime, cv::Point(408, 540), cv::HersheyFonts::FONT_HERSHEY_PLAIN, 5,
 //                    cv::Scalar(255, 255, 0), 2);
         if (m_camId.size() > 0) {
@@ -252,7 +252,7 @@
             imageDrawElement.setImage(imageTemp);
             imageDrawElement.submit();
         }
-        mutex.unlock();
+
 //        if (bRecordVideoEnable) {
 //            registerElement(triggerElement);
 //        }
@@ -440,12 +440,14 @@
         {
              leftJudgment.setYoloObjects(yoloRpcElement.getLastScoreRects());
               leftJudgment.setImage(yoloRpcElement.getImage());
+              leftJudgment.submit();
         }
         if(!rightJudgment.isBusy())
         {
             rightJudgment.setYoloObjects(yoloRpcElement.getLastScoreRects());
 
             rightJudgment.setImage(yoloRpcElement.getImage());
+            rightJudgment.submit();
         }
 
     });
diff --git a/QiaoJiaSystem/StructureApp/CMakeLists.txt b/QiaoJiaSystem/StructureApp/CMakeLists.txt
index a06601a..393119d 100644
--- a/QiaoJiaSystem/StructureApp/CMakeLists.txt
+++ b/QiaoJiaSystem/StructureApp/CMakeLists.txt
@@ -17,6 +17,7 @@
     HiredisTool.cpp
     PersonElement.cpp
     PerStaticElement.cpp
+    IntAreaCalcUtil.cpp
 
     TrackingTrigger.cpp
     FaceRpcElement.cpp
diff --git a/QiaoJiaSystem/StructureApp/IntAreaCalcUtil.cpp b/QiaoJiaSystem/StructureApp/IntAreaCalcUtil.cpp
new file mode 100644
index 0000000..e920d72
--- /dev/null
+++ b/QiaoJiaSystem/StructureApp/IntAreaCalcUtil.cpp
@@ -0,0 +1,2 @@
+#include "IntAreaCalcUtil.h"
+
diff --git a/QiaoJiaSystem/StructureApp/IntAreaCalcUtil.h b/QiaoJiaSystem/StructureApp/IntAreaCalcUtil.h
new file mode 100644
index 0000000..5654be8
--- /dev/null
+++ b/QiaoJiaSystem/StructureApp/IntAreaCalcUtil.h
@@ -0,0 +1,238 @@
+#ifndef INTAREACALCUTIL_H
+#define INTAREACALCUTIL_H
+#include <iostream>
+#include <vector>
+#include <map>
+using namespace std;
+struct Point
+{
+    Point(){}
+    Point(int x1,int y1)
+    {
+        x=x1;
+        y=y1;
+    }
+    int x;
+    int y;
+};
+class IntAreaCalcUtil
+{
+
+
+public:
+//鑻ョ偣a澶т簬鐐筨,鍗崇偣a鍦ㄧ偣b椤烘椂閽堟柟鍚�,杩斿洖true,鍚﹀垯杩斿洖false
+static bool PointCmp(const Point &a,const Point &b,const Point &center)
+{
+    if (a.x >= 0 && b.x < 0)
+        return true;
+    if (a.x == 0 && b.x == 0)
+        return a.y > b.y;
+    //鍚戦噺OA鍜屽悜閲廜B鐨勫弶绉�
+    int det = (a.x - center.x) * (b.y - center.y) - (b.x - center.x) * (a.y - center.y);
+    if (det < 0)
+        return true;
+    if (det > 0)
+        return false;
+    //鍚戦噺OA鍜屽悜閲廜B鍏辩嚎锛屼互璺濈鍒ゆ柇澶у皬
+    int d1 = (a.x - center.x) * (a.x - center.x) + (a.y - center.y) * (a.y - center.y);
+    int d2 = (b.x - center.x) * (b.x - center.y) + (b.y - center.y) * (b.y - center.y);
+    return d1 > d2;
+}
+static void ClockwiseSortPoints(std::vector<Point> &vPoints)
+{
+    //璁$畻閲嶅績
+    Point center;
+    double x = 0,y = 0;
+    for (int i = 0;i < vPoints.size();i++)
+    {
+        x += vPoints[i].x;
+        y += vPoints[i].y;
+    }
+    center.x = (int)x/vPoints.size();
+    center.y = (int)y/vPoints.size();
+
+    //鍐掓场鎺掑簭
+    for(int i = 0;i < vPoints.size() - 1;i++)
+    {
+        for (int j = 0;j < vPoints.size() - i - 1;j++)
+        {
+            if (PointCmp(vPoints[j],vPoints[j+1],center))
+            {
+                Point tmp = vPoints[j];
+                vPoints[j] = vPoints[j + 1];
+                vPoints[j + 1] = tmp;
+            }
+        }
+    }
+}
+//  The function will return YES if the point x,y is inside the polygon, or
+//  NO if it is not.  If the point is exactly on the edge of the polygon,
+//  then the function may return YES or NO.
+static bool IsPointInPolygon(std::vector<Point> poly,Point pt)
+{
+    int i,j;
+    bool c = false;
+    for (i = 0,j = poly.size() - 1;i < poly.size();j = i++)
+    {
+        if ((((poly[i].y <= pt.y) && (pt.y < poly[j].y)) ||
+            ((poly[j].y <= pt.y) && (pt.y < poly[i].y)))
+            && (pt.x < (poly[j].x - poly[i].x) * (pt.y - poly[i].y)/(poly[j].y - poly[i].y) + poly[i].x))
+        {
+            c = !c;
+        }
+    }
+    return c;
+}
+//鎺掓枼瀹為獙
+static bool IsRectCross(const Point &p1,const Point &p2,const Point &q1,const Point &q2)
+{
+    bool ret = min(p1.x,p2.x) <= max(q1.x,q2.x)    &&
+                min(q1.x,q2.x) <= max(p1.x,p2.x) &&
+                min(p1.y,p2.y) <= max(q1.y,q2.y) &&
+                min(q1.y,q2.y) <= max(p1.y,p2.y);
+    return ret;
+}
+//璺ㄧ珛鍒ゆ柇
+static bool IsLineSegmentCross(const Point &pFirst1,const Point &pFirst2,const Point &pSecond1,const Point &pSecond2)
+{
+    long line1,line2;
+    line1 = pFirst1.x * (pSecond1.y - pFirst2.y) +
+        pFirst2.x * (pFirst1.y - pSecond1.y) +
+        pSecond1.x * (pFirst2.y - pFirst1.y);
+    line2 = pFirst1.x * (pSecond2.y - pFirst2.y) +
+        pFirst2.x * (pFirst1.y - pSecond2.y) +
+        pSecond2.x * (pFirst2.y - pFirst1.y);
+    if (((line1 ^ line2) >= 0) && !(line1 == 0 && line2 == 0))
+        return false;
+
+    line1 = pSecond1.x * (pFirst1.y - pSecond2.y) +
+        pSecond2.x * (pSecond1.y - pFirst1.y) +
+        pFirst1.x * (pSecond2.y - pSecond1.y);
+    line2 = pSecond1.x * (pFirst2.y - pSecond2.y) +
+        pSecond2.x * (pSecond1.y - pFirst2.y) +
+        pFirst2.x * (pSecond2.y - pSecond1.y);
+    if (((line1 ^ line2) >= 0) && !(line1 == 0 && line2 == 0))
+        return false;
+    return true;
+}
+
+static bool GetCrossPoint(const Point &p1,const Point &p2,const Point &q1,const Point &q2,long &x,long &y)
+{
+    if(IsRectCross(p1,p2,q1,q2))
+    {
+        if (IsLineSegmentCross(p1,p2,q1,q2))
+        {
+            //姹備氦鐐�
+            long tmpLeft,tmpRight;
+            tmpLeft = (q2.x - q1.x) * (p1.y - p2.y) - (p2.x - p1.x) * (q1.y - q2.y);
+            tmpRight = (p1.y - q1.y) * (p2.x - p1.x) * (q2.x - q1.x) + q1.x * (q2.y - q1.y) * (p2.x - p1.x) - p1.x * (p2.y - p1.y) * (q2.x - q1.x);
+
+            x = (int)((double)tmpRight/(double)tmpLeft);
+
+            tmpLeft = (p1.x - p2.x) * (q2.y - q1.y) - (p2.y - p1.y) * (q1.x - q2.x);
+            tmpRight = p2.y * (p1.x - p2.x) * (q2.y - q1.y) + (q2.x- p2.x) * (q2.y - q1.y) * (p1.y - p2.y) - q2.y * (q1.x - q2.x) * (p2.y - p1.y);
+            y = (int)((double)tmpRight/(double)tmpLeft);
+            return true;
+        }
+    }
+    return false;
+}
+static bool PolygonClip(const vector<Point> &poly1,const vector<Point> &poly2, std::vector<Point> &interPoly)
+{
+    if (poly1.size() < 3 || poly2.size() < 3)
+    {
+        return false;
+    }
+
+    long x,y;
+    //璁$畻澶氳竟褰氦鐐箆ector<Point> poly1;
+    for (int i = 0;i < poly1.size();i++)
+    {
+        int poly1_next_idx = (i + 1) % poly1.size();
+        for (int j = 0;j < poly2.size();j++)
+        {
+            int poly2_next_idx = (j + 1) % poly2.size();
+            if (GetCrossPoint(poly1[i],poly1[poly1_next_idx],
+                poly2[j],poly2[poly2_next_idx],
+                x,y))
+            {
+                if(x<0 || y<0) continue;
+                interPoly.push_back(Point(x,y));
+            }
+        }
+    }
+
+    //璁$畻澶氳竟褰㈠唴閮ㄧ偣
+    for(int i = 0;i < poly1.size();i++)
+    {
+        if (IsPointInPolygon(poly2,poly1[i]))
+        {
+            interPoly.push_back(poly1[i]);
+        }
+    }
+    for (int i = 0;i < poly2.size();i++)
+    {
+        if (IsPointInPolygon(poly1,poly2[i]))
+        {
+            interPoly.push_back(poly2[i]);
+        }
+    }
+
+    if(interPoly.size() <= 0)
+        return false;
+
+    //鐐归泦鎺掑簭
+    ClockwiseSortPoints(interPoly);
+    return true;
+}
+static float intAreaCalc(vector<Point> &vecPoly)//姹傝В澶氳竟褰㈢殑闈㈢Н(鐭ラ亾澶氳竟褰㈢殑椤剁偣锛屾寜椤烘椂閽堟垨鑰呴�嗘椂閽�)
+{
+    int  i_count=vecPoly.size();
+   // iCycle=0;
+    int area_temp=0;
+    for(int i=0;i<i_count;i++)
+    {
+        area_temp=area_temp+(vecPoly[i].x*vecPoly[(i+1) % i_count].y-vecPoly[(i+1) % i_count].x*vecPoly[i].y);
+    }
+    return abs(area_temp*100/2);
+}
+
+//int main()
+//{
+//    vector<Point> poly1;
+//    poly1.push_back(Point(1,0));
+//    poly1.push_back(Point(1,2));
+//    poly1.push_back(Point(3,0));
+//  //  poly1.push_back(Point(1,2));
+//    vector<Point> poly2;
+////    poly2.push_back(Point(2,0));
+////    poly2.push_back(Point(7,0));
+////    poly2.push_back(Point(7,5));
+////    poly2.push_back(Point(2,5));
+//    poly2.push_back(Point(0,0));
+//    poly2.push_back(Point(4,0));
+//    poly2.push_back(Point(4,4));
+//    poly2.push_back(Point(0,4));
+//    vector<Point> poly3;
+//    PolygonClip(poly1,poly2,poly3);
+//    float inter = intAreaCalc(poly3);
+//    float total = intAreaCalc(poly2);
+//    int perset1 = (int)(inter / total * 100);
+//    if(ALARM_PERCENT <= perset)
+//    {
+
+//    }
+
+
+
+
+//    for(int i=0;i<poly3.size();++i)
+//    {
+
+//    }
+//    return 0;
+//}
+
+};
+
+#endif // INTAREACALCUTIL_H
diff --git a/QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.cpp b/QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.cpp
index 9c6cda9..bcf0518 100644
--- a/QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.cpp
+++ b/QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.cpp
@@ -10,7 +10,7 @@
 #include <basic/util/app/AppPreference.hpp>
 
 JudgmentRetrogradeTool::JudgmentRetrogradeTool(const SdkRule &rule) :
-    m_triggerElement(rule.nTriggerDelay * 8, 0),
+    m_triggerElement(0, 0),
     m_sdkRule(rule),
     pManagerEsDB(nullptr)
 {
@@ -79,14 +79,9 @@
 }
 
 void JudgmentRetrogradeTool::setYoloObjects(std::vector<ScoredRect> value) {
-    if (!isInWeek(m_sdkRule.weekRuleVec))
-        return;
-    mObjs = value;
-    for (auto &item :value) {
-        if (item.score < m_sdkRule.fSensitivity)continue;
 
-        setPerRect(item.id, item.rect);
-    }
+    mObjs = value;
+
 }
 
 
@@ -118,7 +113,7 @@
 }
 
 bool JudgmentRetrogradeTool::getPerRet(const long &id) {
-    bool ret = (m_mapPerRet.find(id) == m_mapPerRet.end()) ? true : m_mapPerRet[id];
+    bool ret = (m_mapPerRet.find(id) == m_mapPerRet.end()) ? false :m_mapPerRet[id]>=m_sdkRule.nTriggerDelay * 8;
     return ret;
 }
 
@@ -143,6 +138,41 @@
 }
 
 void JudgmentRetrogradeTool::func() {
+    if (!isInWeek(m_sdkRule.weekRuleVec))
+        return;
+    bool state=false;
+    for (auto &scoredRect :mObjs) {
+        if (scoredRect.score < m_sdkRule.fSensitivity)continue;
+
+        if (getPerRet(scoredRect.id))//judgment.bool
+        {
+            DBG("scoredRect.id" << scoredRect.id << " val=" << m_mapPerRet[scoredRect.id]);
+            m_mapPerRet[scoredRect.id] -=2400;
+            auto t_image = image(
+                CvUtil::zoomRectEqual(scoredRect.rect, 1.2, 1.2) & cv::Rect(0, 0, image.cols, image.rows)).clone();
+            //  auto t_image = image(scoredRect.rect& cv::Rect(0, 0, image.cols, image.rows)).clone();
+            std::string imgUrl = uploadImgToFdfs(t_image);
+            saveInfoToEs(imgUrl, scoredRect);
+            state=true;
+
+
+           // break;
+        }
+//          m_triggerElement.triggerOnce();
+//          if(m_triggerElement.getState())
+//          {
+
+//              auto t_image = image(
+//                  CvUtil::zoomRectEqual(scoredRect.rect, 1.2, 1.2) & cv::Rect(0, 0, image.cols, image.rows)).clone();
+//              //  auto t_image = image(scoredRect.rect& cv::Rect(0, 0, image.cols, image.rows)).clone();
+//              std::string imgUrl = uploadImgToFdfs(t_image);
+//              saveInfoToEs(imgUrl, scoredRect);
+//          }
+
+        setPerRect(scoredRect.id, scoredRect.rect);
+    }
+    m_triggerElement.setState(state);
+    m_triggerElement.triggerOnce();
     for (auto &item : m_mapPerDirection) {
         int a = 0;
         int b = 0;
@@ -154,13 +184,18 @@
                 a++;
             }
         }
-        // DBG("id="<<item.first<<" a="<<a<<"  b="<<b);
-        bool ret = a >= b ? true : false;
-        if (!ret) {
-            m_mapPerRet.insert(std::make_pair(item.first, false));
-            // m_mapPerRet[item.first] = false;
+        if(b!=0)
+        {
+            bool ret = a >= b ? true : false;
+           //  DBG("id="<<item.first<<" a="<<a<<"  b="<<b<<" ret="<<ret);
+            if (!ret) {
+                m_mapPerRet[item.first]+=1;
+               // m_mapPerRet.insert(std::make_pair(item.first, false));
+                // m_mapPerRet[item.first] = false;
 
+            }
         }
+
 
 
         if (temp.size() > 9) {
@@ -168,30 +203,7 @@
         }
     }
 
-    for (auto scoredRect:mObjs) {
-        if (!getPerRet(scoredRect.id))//judgment.bool
-        {
-            DBG("scoredRect.id" << scoredRect.id << " val=" << m_mapPerRet[scoredRect.id]);
-            m_mapPerRet[scoredRect.id] = true;
 
-            m_triggerElement.setState(true);
-
-
-            break;
-        } else {
-            m_triggerElement.setState(false);
-
-        }
-          m_triggerElement.triggerOnce();
-          if(m_triggerElement.getTriggerState())
-          {
-              auto t_image = image(
-                  CvUtil::zoomRectEqual(scoredRect.rect, 1.2, 1.2) & cv::Rect(0, 0, image.cols, image.rows)).clone();
-              //  auto t_image = image(scoredRect.rect& cv::Rect(0, 0, image.cols, image.rows)).clone();
-              std::string imgUrl = uploadImgToFdfs(t_image);
-              saveInfoToEs(imgUrl, scoredRect);
-          }
-    }
 
 }
 
@@ -203,7 +215,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);
diff --git a/QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.h b/QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.h
index 9988245..e3cd93f 100644
--- a/QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.h
+++ b/QiaoJiaSystem/StructureApp/JudgmentRetrogradeTool.h
@@ -123,7 +123,8 @@
     std::map<long, std::list<float>> m_mapPerDirection;
 
     //璺熻釜id,閫嗚鐘舵��
-    std::map<long, bool> m_mapPerRet;
+ //  std::map<long, bool> m_mapPerRet;
+     std::map<long, int> m_mapPerRet;
 
     QPolygon m_polygon;
 
diff --git a/QiaoJiaSystem/StructureApp/PerStaticElement.cpp b/QiaoJiaSystem/StructureApp/PerStaticElement.cpp
index 4877fbe..a8156c3 100644
--- a/QiaoJiaSystem/StructureApp/PerStaticElement.cpp
+++ b/QiaoJiaSystem/StructureApp/PerStaticElement.cpp
@@ -80,7 +80,7 @@
             {
                 if(ele.id==obj.id)
                 {
-                    if((obj.rect&ele.rect).area()>ele.rect.area()*0.8)
+                    if((obj.rect&ele.rect).area()>ele.rect.area()*m_sdkRule.fSensitivity)
                     {
                         //not moving
                         obj.isMove = true;
@@ -183,7 +183,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);
diff --git a/QiaoJiaSystem/StructureApp/PerimeterElement.cpp b/QiaoJiaSystem/StructureApp/PerimeterElement.cpp
index 5e480ee..b605b07 100644
--- a/QiaoJiaSystem/StructureApp/PerimeterElement.cpp
+++ b/QiaoJiaSystem/StructureApp/PerimeterElement.cpp
@@ -13,6 +13,7 @@
 #include <uuid/uuid.h>
 #include <jsoncpp/json/json.h>
 
+#define ALARM_PERCENT (10)  //10%
 PerimeterElement::PerimeterElement(const SdkRule &rule) :
     m_sdkRule(rule),
     PipeElement(true),
@@ -41,7 +42,7 @@
 
 void PerimeterElement::threadFunc() {
 
-   // ClockTimer ct("PerimeterElement::threadFunc");
+    //ClockTimer ct("PerimeterElement::threadFunc");
     if (!isInWeek(m_sdkRule.weekRuleVec))
         return;
     int num = 0;
@@ -57,41 +58,72 @@
 
         QRect rect(obj.rect.x, obj.rect.y, obj.rect.width, obj.rect.height);
         QPoint center = rect.center();
-        if (mPolygon.containsPoint(center, Qt::OddEvenFill) || !m_bIsMask) {
-            m_recVec.push_back(obj.rect);
-            if (picDate.empty()) {
-                picDate = obj.properties["time"];
-                // DBG("picDate="<<picDate);
 
+        if (picDate.empty()) {
+            picDate = obj.properties["time"];
+            // DBG("picDate="<<picDate);
+
+        }
+        if (m_sdkRule.nSdkType == PerimeterSdk)
+        {
+
+            if(m_bIsMask)
+            {
+                   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++;
+                   }
             }
 
-            num++;
-
 
         }
-        else
+        else if (mPolygon.containsPoint(center, Qt::OddEvenFill) || !m_bIsMask)
         {
-           // DBG("id="<< obj.properties["id"]<<" no containts x="<<rect.center().x()<<" y="<<rect.center().y());
+            m_recVec.push_back(obj.rect);
+
+
+            num++;
         }
+
 
 
     }
 
     switch (m_sdkRule.nSdkType) {
         case PerimeterSdk:
-            state = num > 0 ;
+            //state = num > 0 ;
+            state =( num !=mRealNum);
+          //  DBG("num="<<num<< "time="<< picDate);
 
 
             break;
         case CrowdSdk:
-            state = num > m_sdkRule.nAlarmNumLowerLimit  ;
+            state = num > m_sdkRule.nAlarmNumLowerLimit && num !=mRealNum;
 
             break;
         case PerHubSdk:
-            state = num > m_sdkRule.nAlarmNumLowerLimit && num < m_sdkRule.nAlarmNumUpperLimit ;
-//         if(m_sdkRule.nAlarmNumLowerLimit>0)
+            state = num > m_sdkRule.nAlarmNumLowerLimit && num < m_sdkRule.nAlarmNumUpperLimit && num !=mRealNum;
+
+
+//         if(m_sdkRule.nAlarmNumLowerLimit>=0)
 //         {
-//             if( m_sdkRule.nAlarmNumUpperLimit>m_sdkRule.nAlarmNumLowerLimit+1)
+//             if( m_sdkRule.nAlarmNumUp2019-01-16 09:49:57perLimit>m_sdkRule.nAlarmNumLowerLimit+1)
 //             {
 
 //                  m_triggerElement.setState(num>m_sdkRule.nAlarmNumLowerLimit && num<m_sdkRule.nAlarmNumUpperLimit);
@@ -122,33 +154,43 @@
 
     m_triggerElement.setState(state);
     m_triggerElement.triggerOnce();
-    //  DBG("imgUrl="<<imgUrl);
-    if (m_triggerElement.getTriggerState() && num!=mRealNum)
+    if (m_triggerElement.getTriggerState() )
     {
-
-        cv::Mat t_image = image(CutMask()).clone();
-        if(t_image.empty())
-        {
-            if(image.empty())
+        if(num > 0) {
+            cv::Mat t_image = image(CutMask()).clone();
+            if(t_image.empty())
             {
-                  DBG("image empty");
+                DBG("t_image empty");
+                return;
             }
-            DBG("t_image empty");
-            return;
+            std::string imgUrl = uploadImgToFdfs(t_image);
+            saveInfoToEs(imgUrl, picDate);
         }
-        std::string imgUrl = uploadImgToFdfs(t_image);
-        saveInfoToEs(imgUrl, picDate);
         DBG("num=" << num << " lastnum=" << mRealNum);
         mRealNum = num;
     }
-//    if(state)
-//DBG("mRealNum=" << mRealNum <<"m_triggerElement.getTriggerState()="<<m_triggerElement.getTriggerState());
+
+//    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;
-    }
+
+//    if(!state)
+//    {
+//        mRealNum = num;
+//    }
 
 
     // DBG("m_sdkRule.nSdkType="<<m_sdkRule.nSdkType<<" num="<<num);
@@ -199,8 +241,16 @@
         QJsonObject obj = jsonValue.toObject();
         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));
+        }
 
-        mPolygon << (QPoint(x, y));
+
 
     }
 }
diff --git a/QiaoJiaSystem/StructureApp/PerimeterElement.h b/QiaoJiaSystem/StructureApp/PerimeterElement.h
index b7a4dfd..3e6e35e 100644
--- a/QiaoJiaSystem/StructureApp/PerimeterElement.h
+++ b/QiaoJiaSystem/StructureApp/PerimeterElement.h
@@ -11,6 +11,7 @@
 #include <basic/util/fastdfs/FastFds.hpp>
 #include "DBStruct.h"
 #include <basic/db/Elasticsearch/EsDBTool.h>
+#include "IntAreaCalcUtil.h"
 class PerimeterElement : public basic::PipeElement
 {
 public:
@@ -83,9 +84,12 @@
 
 
    int npts;
-   vector<cv::Rect> m_recVec;
+   std::vector<cv::Rect> m_recVec;
 
    bool m_bIsMask;
+   std::vector<Point> poly1;
+
+
 };
 
 #endif // PAELEMENT_H
diff --git a/QiaoJiaSystem/StructureApp/YoloRpcElement.cpp b/QiaoJiaSystem/StructureApp/YoloRpcElement.cpp
index a56a7e7..31a2e2f 100644
--- a/QiaoJiaSystem/StructureApp/YoloRpcElement.cpp
+++ b/QiaoJiaSystem/StructureApp/YoloRpcElement.cpp
@@ -64,7 +64,7 @@
 
 void YoloRpcElement::threadFunc()
 {
- //   ClockTimer ct("YoloRpcElement::threadFunc");
+ //  ClockTimer ct("YoloRpcElement::threadFunc");
         triggerScoredRects.clear();
     try {
             auto server = rpcClient.getServer();
@@ -79,17 +79,13 @@
         {
             ERR(e.what())
         }
-        int size=objs.size();
-        if(size>30)
-        {
+//        int size=objs.size();
+//        if(size>30)
+//        {
 
-//              cv::imshow("image", image);
-
-//               cv::waitKey();
-
-            DBG("size="<<size);
-            return;
-        }
+//            DBG("size="<<size);
+//            return;
+//        }
 
         for (auto &obj: objs)
         {
diff --git a/QiaoJiaSystem/VideoAnalysFromHC/CMakeLists.txt b/QiaoJiaSystem/VideoAnalysFromHC/CMakeLists.txt
index d4a83d9..a006a46 100644
--- a/QiaoJiaSystem/VideoAnalysFromHC/CMakeLists.txt
+++ b/QiaoJiaSystem/VideoAnalysFromHC/CMakeLists.txt
@@ -59,6 +59,7 @@
     ../StructureApp/HiredisTool.cpp
      ../StructureApp/PersonElement.cpp
     ../StructureApp/PerStaticElement.cpp
+    ../StructureApp/IntAreaCalcUtil.cpp
 
     ../YoloServer/rpc/YoloServer.cpp
     ../FaceDetectServer/rpc/FaceServer.cpp
diff --git a/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp b/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp
index 828dc70..25b961b 100644
--- a/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp
+++ b/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp
@@ -85,20 +85,29 @@
                 rule.second.strAddr = item.str_addr;
                 rule.second.weekRuleVec = m_lDBTool->searchCameraWeekRuleByCamId(item.str_cam_dev_id, rule.first);
 
-                if(rule.second.nSdkType == FaceSdk) continue;
+                if(rule.second.nSdkType == PerStaticSdk)
+                {
+                    float temp=1-(float)(rule.second.nThreshold)/100;
+                    rule.second.fSensitivity=(75+25*temp)/100;
 
-                if (rule.second.nThreshold < 5 )
-                {
-                    rule.second.fSensitivity=0.95;
                 }
-                else if(rule.second.nThreshold > 95)
+                else if(rule.second.nSdkType != FaceSdk)
                 {
-                     rule.second.fSensitivity=0.05;
+                    float temp=1-(float)(rule.second.nThreshold)/100;
+                     rule.second.fSensitivity=(5+90*temp)/100;
                 }
-                else
-                {
-                    rule.second.fSensitivity = 1-(float) (rule.second.nThreshold) / 100;
-                }
+//                if (rule.second.nThreshold < 5 )
+//                {
+//                    rule.second.fSensitivity=0.95;
+//                }
+//                else if(rule.second.nThreshold > 95)
+//                {
+//                     rule.second.fSensitivity=0.05;
+//                }
+//                else
+//                {
+//                    rule.second.fSensitivity = 1-(float) (rule.second.nThreshold) / 100;
+//                }
 
                 DBG("fSensitivity" << rule.second.fSensitivity);
             }
diff --git a/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp b/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp
index acabafb..93ca3ab 100644
--- a/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp
+++ b/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp
@@ -356,11 +356,23 @@
     pModel_cam.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
     pModel_cam.select();
 
+//    QSqlTableModel pModel_sdk(NULL, m_db);
+//    pModel_sdk.setTable("cam_sdk");
+//    pModel_sdk.setFilter(QObject::tr("cam_dev_id = '%1'").arg(strCamId));
+//    pModel_sdk.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
+//    pModel_sdk.select();
+
     QSqlTableModel pModel_sdk(NULL, m_db);
-    pModel_sdk.setTable("cam_sdk");
-    pModel_sdk.setFilter(QObject::tr("cam_dev_id = '%1'").arg(strCamId));
+    pModel_sdk.setTable("sdk_rule");
+    pModel_sdk.setFilter(QObject::tr("cam_id = '%1'").arg(strCamId));
     pModel_sdk.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
     pModel_sdk.select();
+
+    QSqlTableModel pModel_week(NULL, m_db);
+    pModel_week.setTable("rule_week");
+    pModel_week.setFilter(QObject::tr("camera_id = '%1'").arg(strCamId));
+    pModel_week.setEditStrategy(QSqlTableModel::OnManualSubmit);//OnManualSubmit OnFieldChange
+    pModel_week.select();
 
     int rowCount_cam = pModel_cam.rowCount();
     if (rowCount_cam >= 1) {
@@ -376,17 +388,25 @@
         }
     }
 
+    int rowCount_week = pModel_week.rowCount();
+    if (rowCount_week >= 1) {
+        for (int i = 0; i < rowCount_week; i++) {
+            pModel_week.removeRow(i);//TODO
+        }
+    }
+
     m_db.transaction();//寮�濮嬩簨鍔℃搷浣�
 
     if (pModel_cam.submitAll() && \
-        pModel_sdk.submitAll()) {
+        pModel_sdk.submitAll() && pModel_week.submitAll()) {
         m_db.commit();//鎻愪氦
         return true;
     } else {
         m_db.rollback();//鍥炴粴
         ERR("deleteLDeviceTable err ,Database Error: " \
  << pModel_cam.lastError().text().toStdString() \
- << pModel_sdk.lastError().text().toStdString());
+ << pModel_sdk.lastError().text().toStdString() \
+ << pModel_week.lastError().text().toStdString() );
         //        QMessageBox::warning(NULL,QObject::tr("deleteLDeviceTable"),QObject::tr("Database Error: %1").arg(pModel.lastError().text()));
         return false;
     }
diff --git a/QiaoJiaSystem/YoloServer/YoloDetectServerI.cpp b/QiaoJiaSystem/YoloServer/YoloDetectServerI.cpp
index b270ed1..33ebe72 100644
--- a/QiaoJiaSystem/YoloServer/YoloDetectServerI.cpp
+++ b/QiaoJiaSystem/YoloServer/YoloDetectServerI.cpp
@@ -70,6 +70,7 @@
         int nboxes = 0;
         detection *dets = get_network_boxes(m_net, im.w, im.h, m_thresh, m_hier_thresh, 0, 1, &nboxes);
         if (nboxes > 30) {
+            DBG("nboxes="<<nboxes);
             return objInfos;
         }
         if (m_nms) do_nms_sort(dets, nboxes, l.classes, m_nms);
diff --git a/QiaoJiaSystem/YoloServer/main.cpp b/QiaoJiaSystem/YoloServer/main.cpp
index a69beb9..a44a900 100644
--- a/QiaoJiaSystem/YoloServer/main.cpp
+++ b/QiaoJiaSystem/YoloServer/main.cpp
@@ -24,14 +24,14 @@
 //    adapter->activate();
 //    ich->waitForShutdown();
 
-    if (argc < 3) {
-        ERR("argc error");
-        return -1;
-    }
+//    if (argc < 3) {
+//        ERR("argc error");
+//        return -1;
+//    }
 
-    int gpuindex = atoi(argv[1]);
-    int poolNum = atoi(argv[2]);
-    int portNum = atoi(argv[3]);
+    int gpuindex = 1;
+    int poolNum = 1;
+    int portNum = 10003;
 
     appPref.setIntData("gpu.index", gpuindex);
     appPref.setFloatData("thresh.detect", 0.7);
diff --git a/QiaoJiaSystem/build/DataWebServer b/QiaoJiaSystem/build/DataWebServer
index 3b246c1..e760142 100755
--- a/QiaoJiaSystem/build/DataWebServer
+++ b/QiaoJiaSystem/build/DataWebServer
Binary files differ
diff --git a/QiaoJiaSystem/build/EncodeServer b/QiaoJiaSystem/build/EncodeServer
index b289e10..ea46651 100755
--- a/QiaoJiaSystem/build/EncodeServer
+++ b/QiaoJiaSystem/build/EncodeServer
Binary files differ
diff --git a/QiaoJiaSystem/build/FaceSearchServer b/QiaoJiaSystem/build/FaceSearchServer
index b6c3698..3953b34 100755
--- a/QiaoJiaSystem/build/FaceSearchServer
+++ b/QiaoJiaSystem/build/FaceSearchServer
Binary files differ
diff --git a/QiaoJiaSystem/build/RapidStructureApp b/QiaoJiaSystem/build/RapidStructureApp
index 9a972e5..8e421e7 100755
--- a/QiaoJiaSystem/build/RapidStructureApp
+++ b/QiaoJiaSystem/build/RapidStructureApp
Binary files differ
diff --git a/QiaoJiaSystem/build/RapidStructureAppRtsp b/QiaoJiaSystem/build/RapidStructureAppRtsp
index 1e5921c..83c8c8e 100755
--- a/QiaoJiaSystem/build/RapidStructureAppRtsp
+++ b/QiaoJiaSystem/build/RapidStructureAppRtsp
Binary files differ
diff --git a/QiaoJiaSystem/build/RecordVideo b/QiaoJiaSystem/build/RecordVideo
index 62d159a..f1c34cc 100755
--- a/QiaoJiaSystem/build/RecordVideo
+++ b/QiaoJiaSystem/build/RecordVideo
Binary files differ
diff --git a/QiaoJiaSystem/build/StructureApp b/QiaoJiaSystem/build/StructureApp
index fe02b93..a8e0934 100755
--- a/QiaoJiaSystem/build/StructureApp
+++ b/QiaoJiaSystem/build/StructureApp
Binary files differ
diff --git a/QiaoJiaSystem/build/VideoAnalysFromHC b/QiaoJiaSystem/build/VideoAnalysFromHC
index 51db0de..9e1015b 100755
--- a/QiaoJiaSystem/build/VideoAnalysFromHC
+++ b/QiaoJiaSystem/build/VideoAnalysFromHC
Binary files differ
diff --git a/QiaoJiaSystem/build/YoloDetectClientTest b/QiaoJiaSystem/build/YoloDetectClientTest
new file mode 100755
index 0000000..7d376dd
--- /dev/null
+++ b/QiaoJiaSystem/build/YoloDetectClientTest
Binary files differ
diff --git a/QiaoJiaSystem/build/YoloServer b/QiaoJiaSystem/build/YoloServer
old mode 100644
new mode 100755
index 5f42776..662587b
--- a/QiaoJiaSystem/build/YoloServer
+++ b/QiaoJiaSystem/build/YoloServer
Binary files differ
diff --git a/QiaoJiaSystem/build/config.db b/QiaoJiaSystem/build/config.db
index 32de39c..bb0bacb 100755
--- a/QiaoJiaSystem/build/config.db
+++ b/QiaoJiaSystem/build/config.db
Binary files differ
diff --git a/QiaoJiaSystem/build/scpToSer.sh b/QiaoJiaSystem/build/scpToSer.sh
index cb570db..fda9895 100644
--- a/QiaoJiaSystem/build/scpToSer.sh
+++ b/QiaoJiaSystem/build/scpToSer.sh
@@ -9,7 +9,7 @@
     echo $1
     des_pass=123
     expect -c "
-#    spawn scp -P44100 ${CUR_PATH}"/"$1 dell@58.118.225.79:/home/dell/Apps/QiaoJiaSystem/build 
+#    spawn scp -P41100 ${CUR_PATH}"/"$1 basic@58.118.225.79:/home/basic/Apps/QiaoJiaSystem/build 
     spawn scp  ${CUR_PATH}"/"$1 basic@192.168.1.203:/home/basic/Apps/QiaoJiaSystem/build 
     expect \"password:\"
     send \"${des_pass}\r\"

--
Gitblit v1.8.0