From 4d1c2ee860222138fc7932225ea6d91e7483646a Mon Sep 17 00:00:00 2001
From: pansen <pansen626@sina.com>
Date: 星期一, 22 四月 2019 11:18:45 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/1.3nsq' into 1.3nsq

---
 QiaoJiaSystem/VptServer/CMakeLists.txt                            |    3 
 QiaoJiaSystem/build/killAll.sh                                    |    0 
 QiaoJiaSystem/VideoServer/QiaoJia/DB/DBStruct.h                   |    2 
 QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp             |   36 +
 QiaoJiaSystem/StructureApp/PerimeterElement.cpp                   |  187 +++++-----
 QiaoJiaSystem/build/FaceSearchServer                              |    0 
 QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.cpp       |   57 +-
 QiaoJiaSystem/FaceDetectServer/FaceDetectServerI.h                |    8 
 QiaoJiaSystem/build/config.json                                   |   48 +-
 QiaoJiaSystem/build/syncDBClient                                  |    0 
 syncDBTool/ErlangDbTool.cpp                                       |    3 
 QiaoJiaSystem/VideoAnalysFromHC/main.cpp                          |   17 
 QiaoJiaSystem/DataManagerServer/vss/controller/CamDevController.h |   33 +
 QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp             |   27 +
 QiaoJiaSystem/build/DataWebServer                                 |    0 
 QiaoJiaSystem/DataManagerServer/demo.cpp                          |    4 
 QiaoJiaSystem/RapidStructureApp/TriggerElement.cpp                |   10 
 QiaoJiaSystem/StructureApp/PerimeterElement.h                     |    7 
 QiaoJiaSystem/FaceDetectServer/FaceExtractServerI.cpp             |    1 
 QiaoJiaSystem/StructureApp/main.cpp                               |   17 
 QiaoJiaSystem/FaceDetectServer/main_extract.cpp                   |    3 
 QiaoJiaSystem/LocalDBTool/SqliteToolkit.hpp                       |    6 
 QiaoJiaSystem/build/YoloServer                                    |    0 
 QiaoJiaSystem/VideoToImageMulth/RtspCaptureElement.h              |    2 
 QiaoJiaSystem/build/YoloDetectClientTest                          |    0 
 QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp  |   86 ++--
 QiaoJiaSystem/build/FaceDetectServer                              |    0 
 QiaoJiaSystem/StructureApp/FaceRpcElement.cpp                     |    6 
 QiaoJiaSystem/StructureApp/VptRpcElement.cpp                      |   44 +-
 QiaoJiaSystem/VideoToImageMulth/RtspCaptureElement.cpp            |   56 ++-
 QiaoJiaSystem/StructureApp/AppPipeController.cpp                  |    8 
 QiaoJiaSystem/build/FaceDetectResourcesTest                       |    0 
 QiaoJiaSystem/VptServer/VptDetectWrapper.cpp                      |  113 +++--
 QiaoJiaSystem/build/FaceExtractServer                             |    0 
 QiaoJiaSystem/DataManagerServer/http_configserver.cpp             |   45 +
 QiaoJiaSystem/FaceDetectServer/main_detect.cpp                    |    3 
 QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.h         |   45 ++
 QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp                  |    2 
 QiaoJiaSystem/build/VideoAnalysFromHC                             |    0 
 QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h    |    2 
 QiaoJiaSystem/StructureApp/CMakeLists.txt                         |    1 
 QiaoJiaSystem/VideoToImageMulth/RtspImageRedis.cpp                |    6 
 QiaoJiaSystem/DataManagerServer/http_configserver.h               |   78 ++++
 QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.cpp            |   32 -
 QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.h              |   25 +
 QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp            |   24 -
 QiaoJiaSystem/StructureApp/FaceExtractElement.cpp                 |   12 
 47 files changed, 658 insertions(+), 401 deletions(-)

diff --git a/QiaoJiaSystem/DataManagerServer/demo.cpp b/QiaoJiaSystem/DataManagerServer/demo.cpp
index 6a83272..1a0073b 100644
--- a/QiaoJiaSystem/DataManagerServer/demo.cpp
+++ b/QiaoJiaSystem/DataManagerServer/demo.cpp
@@ -14,8 +14,8 @@
     std::string publish_basepath = "rtmp://localhost:1934/live/cam" + std::to_string(554);
     appPref.setIntData("gpu.index", 0);
     appPref.setStringData("publish.basepath", publish_basepath);
-    appPref.setIntData("pulish.width", 640);
-    appPref.setIntData("pulish.height", 360);
+//    appPref.setIntData("pulish.width", 640);
+//    appPref.setIntData("pulish.height", 360);
 
     AppPipeController a(0, json);
     a.start();
diff --git a/QiaoJiaSystem/DataManagerServer/http_configserver.cpp b/QiaoJiaSystem/DataManagerServer/http_configserver.cpp
index e6b8e72..4e61e33 100644
--- a/QiaoJiaSystem/DataManagerServer/http_configserver.cpp
+++ b/QiaoJiaSystem/DataManagerServer/http_configserver.cpp
@@ -262,6 +262,8 @@
     VssDomainUnitTblController::instance()->registerHttpServices(_HttpSrvRetRecieve);
     VssLocalSettingTblController::instance()->registerHttpServices(_HttpSrvRetRecieve);
     CamDevController::instance()->registerHttpServices(_HttpSrvRetRecieve);
+    //todo
+    CamDevController::instance()->nsqMsgProducerSet(nsqMsgProducer);
     VssUpperSvrTblController::instance()->registerHttpServices(_HttpSrvRetRecieve);
 
 
@@ -1164,11 +1166,11 @@
                                         std::string brand) const {
 
     if (brand == "haikang") {
-        bool ret = getHKDevSerialNumber(ip.c_str(), port, username.c_str(), passwd.c_str());
-        if (!ret) {
-            ERR("getHKDevSerialNumber ERR");
-            return false;
-        }
+//        bool ret = getHKDevSerialNumber(ip.c_str(), port, username.c_str(), passwd.c_str());
+//        if (!ret) {
+//            ERR("getHKDevSerialNumber ERR");
+//            return false;
+//        }
         //璋冪敤rtsp娴乺tsp://admin:a1234567@192.168.1.215:554/h264/ch1/main/av_stream
         port = 554;//TODO
 //        std::string rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) +
@@ -1218,11 +1220,11 @@
         return false;//TODO
     } else if (brand == "yushi") {
 //        rtsp://admin:admin@192.168.8.8:554/video1
-        bool ret = getUVDevSerialNumber(ip.c_str(), username.c_str(), passwd.c_str());
-        if (!ret) {
-            ERR("getUVDevSerialNumber ERR");
-            return false;
-        }
+//        bool ret = getUVDevSerialNumber(ip.c_str(), username.c_str(), passwd.c_str());
+//        if (!ret) {
+//            ERR("getUVDevSerialNumber ERR");
+//            return false;
+//        }
 
         port = 554;
 //        std::string rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) +
@@ -2140,9 +2142,12 @@
 //        auto resType = erlangDbTool->findAllTypeInfo();
         string json = "[";
         for (auto &item : resDB) {
+            //-------------------maybe delete ?------------------------
             if (item.second.tableName.find("lt_") == 0) {
                 continue;
             }
+            //-------------------maybe delete end----------------------
+
             string subJson = "{ ";
             subJson.append("\"uuid\":\"" + item.second.uuid + "\",");
             subJson.append("\"tableName\":\"" + item.second.tableName + "\",");
@@ -3027,8 +3032,19 @@
         }
     }
 
-    if (videoStVec.size() >= 1) {
-        std::string strVideoName = strPath + videoStVec[0].ToVideoName();
+    std::vector<VideoName_s_t> videoStVec_;
+    auto imgTm_ = AppUtil::ParseFromHypenTimeStr(imgSt.m_timeStamp);
+    for (auto &item : videoStVec) {
+        auto resTime_ = AppUtil::ParseFromHypenTimeStr(item.m_timeStamp);
+        auto timeRes = difftime(mktime(&resTime_), mktime(&imgTm_));
+        if ((timeRes < 0 && difftime(mktime(&imgTm_), mktime(&resTime_)) >= 30) || (timeRes / 60 >= 3)) {
+            continue;
+        }
+        videoStVec_.emplace_back(item);
+    }
+
+    if (videoStVec_.size() >= 1) {
+        std::string strVideoName = strPath + videoStVec_[0].ToVideoName();
         INFO("ImageName: " << imgKey << "  SingleMatchVideo: " << strVideoName);
         return strVideoName;
     } else {
@@ -3333,6 +3349,10 @@
         rule.strExAreas = value["strExAreas"].asCString();
         rule.strLine = value["strLine"].asCString();
         rule.strExLine = value["strExLine"].asCString();
+
+        if (!value["strPerimeterObjType"].empty()) {
+            rule.strPerimeterObjType = value["strPerimeterObjType"].asCString();
+        }
         if (rule.strCamId.isEmpty()) {
             return "{\"ret_status\":\"鍐呭鏈夎锛岃妫�鏌ワ紒\"}";
         }
@@ -3409,6 +3429,7 @@
                 obj["strExAreas"] = rule.second.strExAreas.toStdString();
                 obj["strLine"] = rule.second.strLine.toStdString();
                 obj["strExLine"] = rule.second.strExLine.toStdString();
+                obj["strPerimeterObjType"] = rule.second.strPerimeterObjType.toStdString();
                 Json::Value weekRuleArray;
 
 
diff --git a/QiaoJiaSystem/DataManagerServer/http_configserver.h b/QiaoJiaSystem/DataManagerServer/http_configserver.h
index 00fff1c..98399e4 100644
--- a/QiaoJiaSystem/DataManagerServer/http_configserver.h
+++ b/QiaoJiaSystem/DataManagerServer/http_configserver.h
@@ -121,7 +121,7 @@
     std::string createDatabase(std::string ip, unsigned int port, std::string content, PResponse &response);
 
     /**
-     *
+     * 鍒犻櫎鏁版嵁 搴曞簱
      * @param ip
      * @param port
      * @param content
@@ -130,23 +130,97 @@
      */
     std::string deleteDatabase(std::string ip, unsigned int port, std::string content, PResponse &response);
 
+    /***
+     * 鏇存柊鏁版嵁 搴曞簱
+     * @param ip
+     * @param port
+     * @param content
+     * @param response
+     * @return
+     */
     std::string updateDatabase(std::string ip, unsigned int port, std::string content, PResponse &response);
 
+    /**
+     * 鏌ヨ鎵�鏈夊悓姝ュ簱
+     * @param ip
+     * @param port
+     * @param content
+     * @param response
+     * @return
+     */
     std::string findAllDatabase(std::string ip, unsigned int port, std::string content, PResponse &response);
 
+    /**
+     * 鏌ヨ鎵�鏈夋湰鍦板簱
+     * @param ip
+     * @param port
+     * @param content
+     * @param response
+     * @return
+     */
     std::string findLocalDatabase(std::string ip, unsigned int port, std::string content, PResponse &response);
 
+    /***
+     * 涓婁紶浜哄憳
+     * @param ip
+     * @param port
+     * @param content
+     * @param response
+     * @return
+     */
     std::string addPerson(std::string ip, unsigned int port, std::string content, PResponse &response);
 
+    //#todo 鎵归噺娣诲姞浜哄憳鍊熷彛
+
+    /***
+     * 鍚戝悓姝ュ簱鎵归噺娣诲姞浜哄憳鍙婃洿鏂颁汉鍛�
+     * feature_addPersonTracking 鍒嗘敮涓洿鏂板姛鑳藉垎绂讳负鏂板�熷彛
+     * @param ip
+     * @param port
+     * @param content
+     * @param response
+     * @return
+     */
     std::string addPersons(std::string ip, unsigned int port, std::string content, PResponse &response);
 
+    /***
+     * 鍒ゆ柇鍚屾搴撲腑浜哄憳鏄惁瀛樺湪
+     * @param ip
+     * @param port
+     * @param content
+     * @param response
+     * @return
+     */
     std::string personIsExists(std::string ip, unsigned int port, std::string content, PResponse &response);
 
+    /**
+     * 鏇存柊鍚屾搴撲腑鐨勪汉鍛�
+     * @param ip
+     * @param port
+     * @param content
+     * @param response
+     * @return
+     */
     std::string updatePersonByOldId(std::string ip, unsigned int port, std::string content, PResponse &response);
 
-
+    /**
+     * 鍒犻櫎浜哄憳
+     * @param ip
+     * @param port
+     * @param content
+     * @param response
+     * @return
+     */
     std::string delPerson(std::string ip, unsigned int port, std::string content, PResponse &response);
 
+    /**
+     * 鍔犺浇鐗瑰緛
+     * @param ip
+     * @param port
+     * @param content
+     * @param response
+     * @return
+     */
     std::string loadFaceFeaData(std::string ip, unsigned int port, std::string content, PResponse &response);
 
 
diff --git a/QiaoJiaSystem/DataManagerServer/vss/controller/CamDevController.h b/QiaoJiaSystem/DataManagerServer/vss/controller/CamDevController.h
index 22aa644..2656b88 100755
--- a/QiaoJiaSystem/DataManagerServer/vss/controller/CamDevController.h
+++ b/QiaoJiaSystem/DataManagerServer/vss/controller/CamDevController.h
@@ -8,6 +8,7 @@
 #include "vss/model/CamDev.h"
 #include "VssBaseController.h"
 #include <mysql++.h>
+#include <NsqMsgTool.hpp>
 
 using namespace std;
 
@@ -24,6 +25,14 @@
     static CamDevController *instance() {
         static CamDevController instance;
         return &instance;
+    }
+
+private:
+    //shared_ptr
+    BasicMsg::Nsq::NsqMsgProducer  *_nsqMsgProducer;
+public:
+    void nsqMsgProducerSet(BasicMsg::Nsq::NsqMsgProducer *nsqMsgProducer){
+        _nsqMsgProducer = nsqMsgProducer;
     }
 
 public:
@@ -163,6 +172,18 @@
             }
 
         }
+
+        {
+            std::string topic = "VideoToImageMulth";
+            std::string topic1 = "VideoAnalysFromHC";
+            Json::Value json_cfg;
+            json_cfg["cam_del"] = content;
+            std::string msg = json_cfg.toStyledString();
+            DBG("msg:" << msg);
+            _nsqMsgProducer->Publish(topic, (void *) (&msg));
+            _nsqMsgProducer->Publish(topic1, (void *) (&msg));
+        }
+
         return responseJsonValue.toStyledString();
     }
 
@@ -245,6 +266,18 @@
                                                                               idJsonValue.asString());
             }
         }
+
+        {
+            std::string topic = "VideoToImageMulth";
+            std::string topic1 = "VideoAnalysFromHC";
+            Json::Value json_cfg;
+            json_cfg["cam_edit"] = content;
+            std::string msg = json_cfg.toStyledString();
+            DBG("msg:" << msg);
+            _nsqMsgProducer->Publish(topic, (void *) (&msg));
+            _nsqMsgProducer->Publish(topic1, (void *) (&msg));
+        }
+
         return responseJsonValue.toStyledString();
     }
 
diff --git a/QiaoJiaSystem/FaceDetectServer/FaceDetectServerI.h b/QiaoJiaSystem/FaceDetectServer/FaceDetectServerI.h
index 09dfe1a..fed2cdb 100644
--- a/QiaoJiaSystem/FaceDetectServer/FaceDetectServerI.h
+++ b/QiaoJiaSystem/FaceDetectServer/FaceDetectServerI.h
@@ -10,6 +10,10 @@
     ~FaceDetectServerI();
     // FaceDetectServer interface
 public:
+    /**
+     * 浜鸿劯妫�娴�
+     * @return
+     */
     virtual FaceDetect::Faces faceDetect(Ice::Int, Ice::Int, const std::string &, const Ice::Current &) override;
 
 private:
@@ -19,6 +23,10 @@
 
     // FaceDetectServer interface
 public:
+    /**
+     * 浜鸿劯浜屾灞炴�ф彁鍙�
+     * @return
+     */
     virtual FaceDetect::ThftResult faceProperty(Ice::Int, Ice::Int, const FaceDetect::FacePos &, const std::string &, const Ice::Current &) override;
 
 private:
diff --git a/QiaoJiaSystem/FaceDetectServer/FaceExtractServerI.cpp b/QiaoJiaSystem/FaceDetectServer/FaceExtractServerI.cpp
index 0485c6a..c8918da 100644
--- a/QiaoJiaSystem/FaceDetectServer/FaceExtractServerI.cpp
+++ b/QiaoJiaSystem/FaceDetectServer/FaceExtractServerI.cpp
@@ -50,5 +50,6 @@
         ERR("shareMemory attach faild");
 //        throw std::runtime_error("shareMemory attach faild");
     }
+    return feature;
 
 }
diff --git a/QiaoJiaSystem/FaceDetectServer/main_detect.cpp b/QiaoJiaSystem/FaceDetectServer/main_detect.cpp
index bf9f733..7fdaea5 100644
--- a/QiaoJiaSystem/FaceDetectServer/main_detect.cpp
+++ b/QiaoJiaSystem/FaceDetectServer/main_detect.cpp
@@ -57,7 +57,8 @@
     IceRpcServer<FaceDetectServerI> server("faceServer", appPref.getIntData("RpcFDPort"), "tcp");
     server.setMessageSizeMax(1024 * 1024 * 50);
     server.setPoolInitSize(appPref.getIntData("thread.max"));
-    server.setPoolMaxSize(appPref.getIntData("thread.max"));
+    DBG("MaxPoolSize: " << std::max(appPref.getIntData("thread.max")*2, 32));
+    server.setPoolMaxSize(std::max(appPref.getIntData("thread.max")*2, 32));
     server.runWaitShutDown();
     return 0;
 }
diff --git a/QiaoJiaSystem/FaceDetectServer/main_extract.cpp b/QiaoJiaSystem/FaceDetectServer/main_extract.cpp
index 712f421..10046ca 100644
--- a/QiaoJiaSystem/FaceDetectServer/main_extract.cpp
+++ b/QiaoJiaSystem/FaceDetectServer/main_extract.cpp
@@ -58,7 +58,8 @@
     IceRpcServer<FaceExtractServerI> server("faceExtractServer", appPref.getIntData("RpcFEPort"), "tcp");
     server.setMessageSizeMax(1024 * 1024 * 50);
     server.setPoolInitSize(appPref.getIntData("thread.max"));
-    server.setPoolMaxSize(appPref.getIntData("thread.max"));
+    DBG("MaxPoolSize: " << std::max(appPref.getIntData("thread.max")*2, 32));
+    server.setPoolMaxSize(std::max(appPref.getIntData("thread.max")*2, 32));
     server.runWaitShutDown();
     return 0;
 }
diff --git a/QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.cpp b/QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.cpp
index 1c7ca29..3281d1c 100644
--- a/QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.cpp
+++ b/QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.cpp
@@ -62,6 +62,7 @@
     DBG("m_dbRWLocks ok");
     m_dbRWLocks_Lock.unlock();
 //    ClockTimer clockTimer("compare ");
+    //淇濇姢 t_compareResults
     RWLock t_rwLock;
 
     m_rwLock.rdlock();
@@ -80,12 +81,15 @@
             FaceResult tface{0, data.uuid, alarmData->tableName, sc, data.faceUrl, data.idcard, ""};
             t_rwLock.wrlock();
             //#todo
+            // 瀵规瘮缁撴灉淇濆瓨
             if (sc < t_compareResults.end()->second.confidence) {
                 t_rwLock.unlock();
                 return;
             }
+            // 淇濆瓨瀵规瘮缁撴灉
             t_compareResults.insert(make_pair(tface.confidence, tface));
             //#todo 10
+            // 鍙繚鐣欐渶楂樼殑n涓姣旂粨鏋�
             if (t_compareResults.size() > topN) {
                 t_compareResults.erase((--t_compareResults.end()), t_compareResults.end());
             }
@@ -123,6 +127,7 @@
     auto &t_topResult = topResult[key];
     DBG("topResult[key] ok");
     t_topResult.clear();
+    // 瀵规瘮缁撴灉杞崲
     for (auto &item : t_compareResults) {
         auto &it = item.second;
         //#todo
@@ -203,16 +208,8 @@
             m_tableName = str_tab.substr(1, str_tab.length() - 2);//.append("_fea");
             DBG("m_tableName is  " << m_tableName);
 
-//            string tet = "./syncDBClient ";
-//            string str_json = writer.write(t_json);
-//            tet.append("\"" + str_json.substr(0, str_json.length() - 1) + "\" ");
-//            INFO(tet);
-//            system(tet.c_str());
             dataMap.clear();
             try {
-                // init
-//                BISTL::BiMapFeaData biMapFeaData(m_tableName);
-//                auto mymap = biMapFeaData.getMap();
 
                 auto mymap = m_erlangDbTool->loadFaceFeaData(m_tableName);
                 DBG(m_tableName << "  db size is  " << mymap.size());
@@ -231,29 +228,10 @@
                     test.enabled = it.enable;
                     test.monLevel = it.monLevel;
                 }
-//                //#todo
-//                for (auto it = mymap->begin(); it != mymap->end(); it++) {
-//                    string str_uuid(it->second.m_id.data());
-//                    string ft(it->second.m_feature.data());
-//                    string imgUrl(it->second.m_imgUrl.data());
-//                    string strIdCard(it->second.m_idcard.data());
-//                    string str2;
-//                    str2 = base64.Decode(ft.data(), ft.length());
-//                    std::vector<unsigned char> t_fea;
-//                    t_fea.resize(str2.size());
-//                    memcpy(t_fea.data(), str2.data(), str2.size());
-//                    auto &test = dataMap[str_uuid];
-//                    test.uuid = str_uuid;
-//                    test.features.push_back(t_fea);
-//                    test.faceUrl = imgUrl;
-//                    test.idcard = strIdCard;
-//                }
             } catch (const std::exception &e) {
                 printf("Exception:%s\n", e.what());
-//                BISTL::shared_memory_object::remove(m_tableName.c_str());
             }
             appPref.setIntData(m_tableName, 1);
-//            BISTL::shared_memory_object::remove(m_tableName.c_str());
         } else {
             //#todo get sqlite3 data
             m_tableName = t_json["tableName"].asCString();
diff --git a/QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.h b/QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.h
index 0667bbf..6ec4fae 100644
--- a/QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.h
+++ b/QiaoJiaSystem/FaceSearchServer/FaceDBCompareServer.h
@@ -21,19 +21,35 @@
 public:
     FaceDBCompareServer();
 
+    /**
+     * 鏈湴搴撴瀯閫�
+     */
     FaceDBCompareServer(SqliteFaceEncap *);
 
+    /***
+     * 鍚屾搴撴瀯閫�
+     */
     FaceDBCompareServer(ErlangTool::ErlangDbTool *);
 
     ~FaceDBCompareServer();
 
     virtual bool compare(std::thread::id key, AlarmData *alarmData, int topN);
 
+    /***
+     * @deprecated
+     * @param key
+     * @param alarmData
+     * @return
+     */
     bool compare(std::thread::id key, AlarmData *alarmData);
 
     FaceResults getTopResult(std::thread::id key);
 
 private:
+    /**
+     * 鍔犺浇鐗瑰緛
+     * @param str_config
+     */
     virtual void loadDBData(std::string str_config);
 
 protected:
@@ -41,10 +57,14 @@
     std::string m_tableName;
 
     int fea_size;
+    // 淇濇姢鐖剁被鐨刣ataMap
     RWLock m_rwLock;
     std::mutex topResultMtx;
     std::map<std::thread::id, FaceResults> topResult;
+
+    // 淇濇姢m_dbRWLocks
     RWLock m_dbRWLocks_Lock;
+    // 淇濇姢 topResult
     std::map<std::thread::id, RWLock> m_dbRWLocks;
 
     ErlangTool::ErlangDbTool *m_erlangDbTool;
@@ -54,8 +74,9 @@
 
 static bool getRet(std::string startTime, std::string endTime) {
     auto crrentTime = AppUtil::getTimeSecString();
-
-    if (crrentTime.compare(startTime) > 0 && (crrentTime.compare(endTime) < 0 || endTime == "0000-00-00 00:00:00")) {
+    // 鏍规嵁褰撳墠鏃堕棿鏄惁鍦ㄨ缃殑鏃堕棿鍐呮垨姘镐箙鐢熸晥
+    if (crrentTime.compare(startTime) > 0 && (crrentTime.compare(endTime) < 0
+                                              || endTime == "0000-00-00 00:00:00")) {
         return true;
     }
     return false;
diff --git a/QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.cpp b/QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.cpp
index 30fed97..e37f88a 100644
--- a/QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.cpp
+++ b/QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.cpp
@@ -123,14 +123,25 @@
 }
 
 //#todo 浼樺寲
+/**
+ *
+ * @param feature 闇�瑕佸姣旂殑鐗瑰緛
+ * @param info_json 闇�瑕佹彃鍏ユ暟鎹簱鐨刯son瀛楁
+ * @param topN 鑾峰彇鍓嶅嚑浣�
+ * @param score 瀵规瘮鐨勯槇鍊�
+ * @return
+ */
 ::FaceSearch::FaceResults
 FaceFeatureSearchServerI::faceSearchTopN(const ::FaceSearch::Data &feature, const ::std::string &info_json,
                                          ::Ice::Int topN, ::Ice::Float score, const ::Ice::Current &) {
     ClockTimer clockTimer("faceSearchTopN  " + to_string(score) + "  :");
     INFO("faceSearchTopN start");
+    // 鑾峰彇褰撳墠绾跨▼id
     thread::id key = std::this_thread::get_id();
     ::FaceSearch::FaceResults results;
     FaceResults t_TableCompareResult;
+
+    // 杩涜瀵规瘮鐨勬暟鎹粨鏋�
     AlarmData featureData;
     featureData.num = topN;
     featureData.feature.resize(feature.size());
@@ -142,14 +153,19 @@
     if (reader.parse(info_json, value)) {
         //#todo
         m_rwLock.rdlock();
+        // 鐗瑰緛杞寲涓篵ase64瀛樺叆鍒癹son涓�
         std::string feature_base64;
         feature_base64 = base64.Encode(feature.data(), feature.size());
         value["FaceFeature"] = feature_base64;
+        //---------------------------
+
         DBG("auto &it : m_faceFCMAP start " << m_faceFCMAP.size());
         //#todo lock
+        // 閬嶅巻涓嶅悓鐨勫簳搴撹繘琛屾瘮瀵�
         for (auto &it : m_faceFCMAP) {
             auto &t_FaceFC = it.second;
             auto t_tableInfo = m_tableType[it.first];
+            // 鑾峰彇搴曞簱鐨勬姤璀︾姸鎬�
             bool ret = getRet(t_tableInfo.startTime, t_tableInfo.endTime);
             if (ret) {
                 string t_alarmRet = t_tableInfo.bwType;
@@ -157,10 +173,12 @@
                 //#todo 闈炲悓姝ュ簱鏄惁闇�瑕佹瘮杈冿紵
 
                 DBG("m_faceFCMAP compare start " << it.first);
+                // 瀵规瘮
                 t_FaceFC->compare(key, &featureData, topN);
                 DBG("m_faceFCMAP compare end " << it.first);
-
+                // 鏍规嵁褰撳墠绾跨▼id鑾峰彇瀵规瘮缁撴灉
                 auto t_results = t_FaceFC->getTopResult(key);
+                // 瀵规瘮缁撴灉杞崲
                 for (auto &t_item : t_results) {
                     t_item.tableName = it.first;
                     t_item.alarmRet = t_alarmRet;
@@ -176,6 +194,7 @@
 
         DBG("t_TableCompareResult size" << t_TableCompareResult.size());
         //sort_all_results
+        // 鎺掑簭
         for (auto itor = t_TableCompareResult.begin(); itor != t_TableCompareResult.end(); ++itor) {
             float new_confidence = itor->confidence;
             auto rtTR = results.rbegin();
@@ -194,6 +213,7 @@
                 ERR("topResult is null");
             }
             auto itTR(rtTR.base());
+            // 鏁版嵁杞寲
             ::FaceSearch::FaceResult t_faceCR;
             t_faceCR.id = itor->id;
             t_faceCR.uuid = itor->uuid;
@@ -208,9 +228,10 @@
             results.insert(itTR, t_faceCR);
         }
         bool retface = true;
-//        cout << __FUNCTION__ << " -> " << __LINE__ << " ->  " << results.size() << endl;
         //#todo send message
         if (results.size() > 0) {
+            // 鏍规嵁浼犲叆鐨勫姣旈槇鍊煎仛绛涢��
+            // 鏈垎鏀彧淇濆瓨浜嗙涓�涓姣旂粨鏋�
             for (auto &item : results) {
                 //#todo 寰楀垎姣旇緝锛屽簲璇ュ湪compare涓繘琛�
                 if (item.confidence < score) {
@@ -226,15 +247,6 @@
                     break;
                 }
                 value["personId"] = item.uuid.size() > 0 ? item.uuid : "";//鍏宠仈搴曞簱浜哄憳id,浜鸿劯id
-
-//                string tmp_tableName = item.tableName;
-//                if (tmp_tableName.find("lt_") == 0) {
-//                    tmp_tableName = tmp_tableName.insert(tmp_tableName.find("lt_") + 3, "::");
-//                    value["BaseName"] = tmp_tableName;//鍏宠仈搴曞簱琛ㄥ悕
-//                } else {
-//                    value["BaseName"] = item.tableName.size() > 0 ? item.tableName : "";//鍏宠仈搴曞簱琛ㄥ悕
-//                }
-
                 value["BaseName"] = item.tableName.size() > 0 ? item.tableName : "";//鍏宠仈搴曞簱琛ㄥ悕
 
                 value["likePer"] = item.confidence > 0 ? item.confidence : 0.0;
@@ -244,10 +256,8 @@
                 value["personIsHub"] = item.alarmRet.size() > 0 ? item.alarmRet : "4";
 
                 auto str_uuid = value["Id"].asString();
-//                DBG(value.toStyledString());
 
-                cout << __FUNCTION__ << " -> " << __LINE__ << " ->  " << "value.toStyledString()  "
-                     << value.toStyledString() << "\n score   " << score << endl;
+                DBG("value.toStyledString()  " << value.toStyledString() << "\n score   " << score);
 //                DBG("score  " << score);
                 retface = pManagerEsDB.insertData("videopersons", "perVideoPicture", value.toStyledString(),
                                                   str_uuid);
@@ -258,37 +268,35 @@
             value["personIsHub"] = "4";
             value["likePer"] = 0.0;
             DBG(value.toStyledString());
-//            cout << __FUNCTION__ << " -> " << __LINE__ << " ->  " << "value.toStyledString()  "
-//                 << value.toStyledString() << endl;
             retface = pManagerEsDB.insertData("videopersons", "perVideoPicture", value.toStyledString(),
                                               str_uuid);
         }
         if (!retface) {
             ERR("insert error");
         } else {
-            cout << __FUNCTION__ << " -> " << __LINE__ << " ->  " << "retface  " << retface << endl;
+            ERR("retface  " << retface);
         };
     } else {
         ERR("json is error" << info_json);
     }
 
 
-
-
-//    for (auto &item : t_tables) {
-//        DBG(item);
-//    }
     return results;
 }
 
 bool FaceFeatureSearchServerI::loadFeatureData(FaceFeatureSearchServerI *faceFea) {
+    // 鍔犺浇搴曞簱鏁版嵁
     ErlangTool::map_TabDataCache dataBaseCache = faceFea->m_erlangDbTool.findAllDatabase();
     if (dataBaseCache.size() < 0 && faceFea->m_retUpdatePthread) {
+        // 杩欓噷杩涗笉鏉ュ惂锛�
         faceFea->m_retUpdatePthread = false;
+        //鎺у埗涓嬫柟绾跨▼鍙惎鍔ㄤ竴娆�
         std::thread thd(dataUpdate, faceFea);
         thd.detach();
     }
+    // 鑾峰彇琛ㄤ俊鎭�
     auto typeInfoCache = faceFea->m_erlangDbTool.findAllTypeInfo();
+    //娓呴櫎鏃ф暟鎹�
     faceFea->m_tableType.clear();
     string str_config = faceFea->m_erlangDbTool.getConfigJsonString();
 
@@ -368,6 +376,7 @@
     faceFea->m_inTime = getTimeLong();
     if (faceFea->m_retUpdatePthread) {
         faceFea->m_retUpdatePthread = false;
+        //鎺у埗涓嬫柟绾跨▼鍙惎鍔ㄤ竴娆�
         std::thread thd(dataUpdate, faceFea);
 
 //        faceFea->m_erlangDbTool.test(faceFea, erlangCallBackFunc);
@@ -418,6 +427,10 @@
 //    pthread_mutex_unlock(&(func_cond_mutex));
 //}
 
+/**
+ * 绛夊緟搴曞簱鍔犺浇瀹屾垚锛屽苟绛夊緟淇″彿瑙﹀彂鏂扮殑鏁版嵁鍒锋柊
+ * @param faceFea
+ */
 void FaceFeatureSearchServerI::dataUpdate(FaceFeatureSearchServerI *faceFea) {
     long inTime = faceFea->m_inTime;
     // modify all db ready start update, <10s
diff --git a/QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.h b/QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.h
index 7a1c16b..8a70b5c 100644
--- a/QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.h
+++ b/QiaoJiaSystem/FaceSearchServer/FaceFeatureSearchServerI.h
@@ -24,6 +24,8 @@
 //};
 
 static bool t_live_ret = true;
+
+//鍏ㄥ眬鐨勪俊鍙烽噺锛屽鏋滄暟鎹埛鏂板欢杩熻繃楂樺彲浠ユ敼涓轰娇鐢╪sq娑堟伅闃熷垪銆�
 static pthread_cond_t func_cond(PTHREAD_COND_INITIALIZER);
 static pthread_mutex_t func_cond_mutex(PTHREAD_MUTEX_INITIALIZER);
 
@@ -39,44 +41,71 @@
     virtual ~FaceFeatureSearchServerI();
 
 public:
+    /**
+     * @deprecated
+     * @return
+     */
     virtual ::FaceSearch::FaceResults faceSearchMax(const ::FaceSearch::Data &, const ::std::string &,
                                                     const ::Ice::Current & = ::Ice::emptyCurrent);
 
+    /***
+     * 瀵规瘮鑾峰彇绗琻澶х殑浜哄憳
+     * @return
+     */
     virtual ::FaceSearch::FaceResults
     faceSearchTopN(const ::FaceSearch::Data &, const ::std::string &, ::Ice::Int, ::Ice::Float,
                    const ::Ice::Current & = ::Ice::emptyCurrent);
 
 private:
+    /**
+     * @deprecated
+     * @param nodeName
+     * @param cookie
+     * @return
+     */
     bool initErlang(std::string nodeName, std::string cookie);
 
-    //#todo delete cache
 
     //#todo loadData
+    /**
+     * 鍔犺浇浜鸿劯灞炴��
+     * @param faceFea
+     * @return
+     */
     static bool loadFeatureData(FaceFeatureSearchServerI *faceFea);
 
+    /**
+     * 鏁版嵁鏇存柊绾跨▼锛屾湁淇″彿瑙﹀彂鎵嶄細鏇存柊
+     * @param faceFea
+     */
     static void dataUpdate(FaceFeatureSearchServerI *faceFea);
 
+    /***
+     * 绛夊緟搴曞簱琛ㄥ姞杞芥垚鍔�
+     * @param faceFea
+     * @param loop
+     */
     static void waitTables(FaceFeatureSearchServerI *faceFea, int loop = -1);
-
-//    void erlangCallBackFunc(std::string);
 
 private:
     long m_inTime;
+    // 鐗瑰緛瀵规瘮绫�
     std::map<std::string, FaceDBCompareServer *> m_faceFCMAP;
+    // 搴曞簱绫诲瀷锛岀敓鏁堟椂闂寸瓑
     std::map<std::string, TableInfo> m_tableType;
 
+    // 瀵� m_faceFCMAP 鍔犺鍐欓攣
+    // 褰撳姣旀椂锛屾暟鎹埛鏂颁細绛夊緟
     RWLock m_rwLock;
+
     ErlangTool::ErlangDbTool m_erlangDbTool;
+
     SqliteFaceEncap m_sqliteFaceEncap;
+
     std::mutex m_mutex;
     bool m_retUpdatePthread;
 
     Base64 base64;
-//    Ice::ObjectPrx base_FaceMemoryData;
-//    IceRpcClient<::FaceSearch::FaceMemoryDataPrx> m_faceMemoryClient;
-//    ::FaceSearch::FaceMemoryDataPrx serverFaceMemoryData;
-
-//    func_cond_mutex(PTHREAD_MUTEX_INITIALIZER), func_cond(PTHREAD_COND_INITIALIZER)
 
     EsDBTool pManagerEsDB;//(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort"));
 };
diff --git a/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp b/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp
index f1386f5..7787821 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp
+++ b/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp
@@ -5,7 +5,6 @@
 #include <zconf.h>
 #include <opencv2/opencv.hpp>
 #include "FFmpegDecoderJPG.h"
-#include <cstring>
 
 void BASICGB28181::initFFmpeg() {
     av_register_all();
@@ -280,19 +279,9 @@
 //        BASICGB28181::avframe_to_cvmat(frame).copyTo(p_this->m_image);
             p_this->m_image = std::move(BASICGB28181::avframe_to_cvmat(p_this->frame));
             if(p_this->m_image.empty()) {
-                ERR("camID:" << p_this->m_camIdx << " frameW:" << p_this->frame->width << "frame.data.len" << strlen(p_this->frame->data[0]));
+                ERR("camID:" << p_this->m_camIdx << " frameW:" << p_this->frame->width);
                 continue;
             }
-//            else {
-//                static int count =0;
-//                count ++;
-//                if(count > 100){
-//                    ERR("camID:" << p_this->m_camIdx << " cols:" << p_this->m_image.cols <<\
-//        " rows:" << p_this->m_image.rows << " channels:" << p_this->m_image.channels());
-//                    count = 0;
-//                }
-//
-//            }
 //            灏唅甯т繚瀛樹负蹇収
             if (p_this->m_SnapshotNotSaveRet && (p_this->pkt.flags & AV_PKT_FLAG_KEY)) {
                 try {
@@ -332,7 +321,6 @@
 #endif
             //瑙﹀彂涓婂眰淇″彿
             gSignalLock.emitSigal(p_this->m_camIdx + "DecoderImageOK");
-//            DBG("emitSigal: " << p_this->m_camIdx);
 //#ifdef TestCode
 //        DBG("emitSigal(\"DecoderImageOK\") after");
 //#endif
@@ -385,7 +373,7 @@
 
 bool BASICGB28181::FFmpegDecoderJPG::stopThd() {
     TryCath(
-        DBG(m_camIdx << "  FFmpegDecoderJPG stopThd ... " << m_camIdx);
+        DBG("FFmpegDecoderJPG stopThd ... " << m_camIdx);
         m_running = false;
     );
     return true;
@@ -450,7 +438,7 @@
         if (!m_packetsVec.empty()) {
             auto iter = m_packetsVec.begin();
             while (iter->m_frameId < lastFrameId) {
-                INFO("DropFrame: " << iter->m_frameId);
+//                INFO("DropFrame: " << iter->m_frameId);
                 delete iter->m_packet.data;
                 iter = m_packetsVec.erase(iter);
             }
@@ -480,7 +468,7 @@
 
 bool BASICGB28181::FFmpegDecoderJPG::SaveVideo(std::string path, int64_t lastFrameId) {
     std::lock_guard<std::mutex> lock(g_mutex);
-    INFO("SaveVideo: " << path << "m_packetsVec.size : " << m_packetsVec.size());
+//    INFO("SaveVideo: " << path << "m_packetsVec.size : " << m_packetsVec.size());
     if (!m_packetsVec.empty()) {
         startWrite(path.c_str());
         int64_t firstKeyFramePts = m_packetsVec[0].m_packet.pts;
@@ -488,7 +476,7 @@
         unsigned long int frame_index = 0;
         for (const auto &item:m_packetsVec) {
             if (item.m_frameId < lastFrameId) {
-                DBG("item.m_frameId < lastFrameId   " << item.m_frameId << "  " << lastFrameId);
+//                DBG("item.m_frameId < lastFrameId   " << item.m_frameId << "  " << lastFrameId);
                 conversion(const_cast<AVPacket *> (&item.m_packet), firstKeyFramePts, firstKeyFrameDts, video_st,
                            frame_index);
                 frame_index++;
@@ -634,7 +622,7 @@
         AVPacket *pkg = static_cast<AVPacket *>(packet);
 
 
-        DBG("frame_index==%d\n" << frame_index);
+//        DBG("frame_index==\n" << frame_index);
         //Write PTS
         AVRational time_base1 = inStream->time_base;
         //Duration between 2 frames (us)
diff --git a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
index fdd97a4..cedc675 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
+++ b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
@@ -49,40 +49,52 @@
                 DBG("waitSignal(\"DecoderImageOK\") begin");
 #endif
                 //绛夊緟淇″彿瑙﹀彂
-//                DBG("waitSignal before: " << p_this->m_chanPubID);
                 gSignalLock.waitSignal(p_this->m_chanPubID + "DecoderImageOK");
-//                DBG("waitSignal: " << p_this->m_chanPubID);
 #ifdef TestCode
                 DBG("waitSignal(\"DecoderImageOK\") after");
 #endif
+                {
+                    if (p_this->m_publishVideoRet) {
+                        if (p_this->videoPublishElement == nullptr) {
+                            string path = appConfig.getStringProperty("srsAddr") + "cam" + p_this->m_chanPubID + ".flv";
+                            cv::Size size_(appConfig.getIntProperty("pulish.width"), appConfig.getIntProperty("pulish.height"));
+                            int gupIdx = appPref.getIntData("gpu.index");
+                            DBG("videoPublishpath: "  << p_this->m_chanPubID << path << " h:" << size_.height);
+                            p_this->videoPublishElement = new ffmpeg::VideoPublishElement(path, size_, "flv", 25, gupIdx);
+                            p_this->videoPublishElement->start();
+                        } else {
+//                            DBG("videoPublishElement->setImage() : " << p_this->m_chanPubID);
+                            if (!p_this->m_image.empty()) {
+                                p_this->videoPublishElement->setImage(p_this->m_image);
+                            } else {
+                                ERR("m_image.empty()");
+                            }
+                        }
+                    } else {
+                        if (p_this->videoPublishElement != nullptr) {
+                            DBG("videoPublishElement->stop() :"  << p_this->m_chanPubID);
+                            p_this->videoPublishElement->stop();
+                            p_this->videoPublishElement->wait();
+                            delete p_this->videoPublishElement;
+                            p_this->videoPublishElement = nullptr;
+                        }else{
+//                            DBG("videoPublishElement null :" << p_this->m_chanPubID);
+                        }
+                    }
+                }
 
+                /****褰曞儚妯″潡浠g爜*****/
+                p_this->m_picCount++;
+                //鍑犲紶閫変竴寮犳斁鍏edis
+                if (p_this->m_picCount % m_nPicsPickOne != 0) {
+                    continue;
+                } else {
+                    p_this->m_picCount.store(0);
+                }
 
 //            浠巉fmpeg瑙g爜绫讳腑鑾峰彇鍥剧墖
                 p_this->m_fFmpegDecoderJPG.getImage().copyTo(p_this->m_image);
-                /****debug*****///todo
-                if (p_this->m_image.empty()) {
-                    ERR("camID:" << p_this->m_chanPubID);
-                    continue;
-                }
-//                else {
-//                    static int count =0;
-//                    count ++;
-//                    if(count > 100){
-//                        ERR("camID:" << p_this->m_chanPubID << " cols:" << p_this->m_image.cols <<\
-//        " rows:" << p_this->m_image.rows << " channels:" << p_this->m_image.channels());
-//                        count = 0;
-//                    }
-//                }
-
                 {
-                    /****褰曞儚妯″潡浠g爜*****/
-                    p_this->m_picCount++;
-                    //鍑犲紶閫変竴寮犳斁鍏edis
-                    if (p_this->m_picCount % m_nPicsPickOne != 0) {
-                        continue;
-                    } else {
-                        p_this->m_picCount.store(0);
-                    }
                     cv::Mat copyMat;
                     std::string imageName = p_this->m_fFmpegDecoderJPG.GetImageName();
                     p_this->m_image.copyTo(copyMat);
@@ -142,19 +154,19 @@
                     } else {
 
                         // 鏍规嵁reopenTime鍒ゆ柇鏄惁闇�瑕侀噸鍚�
-                        if (reopenTime < 0) {
+                        if (p_this->reopenTime < 0) {
                             p_this->m_running = false;
                             stop();
                             INFO("grabFrame faild, element stopping");
-                            break;
                         } else {
                             //todo 涓氬姟姝婚攣
-                            usleep((6 - reopenTime--) * 1000000);
-                            INFO("grabFrame faild, try reopen video: ");
+                            usleep((6 - p_this->reopenTime--) * 1000000);
+                            INFO("grabFrame faild, try reopen video, reopenTime:" << p_this->reopenTime);
 
                             //鍏抽棴ffmpeg瑙g爜妯″潡
                             p_this->m_fFmpegDecoderJPG.stopThd();
                             //鍚姩ffmpeg瑙g爜妯″潡
+                            DBG("m_chanPubID:"<<p_this->m_chanPubID << " m_fps:" << p_this->m_fps);
                             p_this->m_fFmpegDecoderJPG.startThd(p_this->m_chanPubID, p_this->m_fps, p_this->m_gpuIdx);
                             continue;
                         }
@@ -223,20 +235,6 @@
 
 void BASICGB28181::VideoCaptureElementWithRtp::threadFunc() {
 
-    if (m_publishVideoRet) {
-        if (videoPublishElement == nullptr) {
-            string path = appConfig.getStringProperty("srsAddr") + "cam" + m_chanPubID + ".flv";
-            cv::Size size_(appConfig.getIntProperty("pulish.width"), appConfig.getIntProperty("pulish.height"));
-            int gupIdx = appPref.getIntData("gpu.index");
-            videoPublishElement = new ffmpeg::VideoPublishElement(path, size_, "flv", 25, gupIdx);
-        } else {
-            videoPublishElement->stop();
-            videoPublishElement->wait();
-            delete videoPublishElement;
-            videoPublishElement = nullptr;
-        }
-    }
-
     fireConnectors();
 }
 
@@ -261,7 +259,7 @@
 
 void BASICGB28181::VideoCaptureElementWithRtp::SaveVideo(const std::string &strImageName) {
 
-    INFO("SaveVideo: " << strImageName);
+//    INFO("SaveVideo: " << strImageName);
     std::string strTimeStamp = AppUtil::getTimeUSecString();
     std::string strPath = MakeDir(strTimeStamp);
     m_fFmpegDecoderJPG.SaveVideoByImageName(strPath, strImageName);
diff --git a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h
index 1eaf254..8e0a92c 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h
+++ b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h
@@ -78,7 +78,7 @@
         //鐢ㄦ潵淇濆瓨褰曞儚瑙嗛鐨勮矾寰�
         std::string m_cutPath;
         std::atomic<bool> m_publishVideoRet{false};
-        ffmpeg::VideoPublishElement * videoPublishElement;
+        ffmpeg::VideoPublishElement * videoPublishElement{nullptr};
     private:
         /***
          * 鍚姩瀹炴椂娴佹帴鏀舵暟鎹嚎绋�
diff --git a/QiaoJiaSystem/LocalDBTool/SqliteToolkit.hpp b/QiaoJiaSystem/LocalDBTool/SqliteToolkit.hpp
index 9c893a7..5710c71 100644
--- a/QiaoJiaSystem/LocalDBTool/SqliteToolkit.hpp
+++ b/QiaoJiaSystem/LocalDBTool/SqliteToolkit.hpp
@@ -273,6 +273,10 @@
             return "tableName is NULL";
         }
         // 浜哄憳淇℃伅琛�
+        //ALTER TABLE '0cd82a8b-5285-5737-ab19-8c07247c797e' ADD COLUMN uploadFlag varchar(255) DEFAULT 0;
+        //ALTER TABLE '0cd82a8b-5285-5737-ab19-8c07247c797e' ADD COLUMN cmpThreshold varchar(255) DEFAULT 60;
+        //ALTER TABLE '0cd82a8b-5285-5737-ab19-8c07247c797e' ADD COLUMN enabled varchar(255) DEFAULT 1;
+        //ALTER TABLE '0cd82a8b-5285-5737-ab19-8c07247c797e' ADD COLUMN monitorLevel    varchar(255)      DEFAULT 0;
         std::string sql = "CREATE TABLE " + g_dbName + ".'";
         sql.append(tableName);
         sql.append("' (  uuid        varchar(255) PRIMARY KEY,");
@@ -286,6 +290,8 @@
         sql.append("create_by   varchar(255) DEFAULT NULL,");
         sql.append("del_flag    INTEGER      DEFAULT 0,");
         sql.append("monitorLevel    varchar(255)      DEFAULT 0,");
+        sql.append("uploadFlag  varchar(255) DEFAULT 0,");
+        sql.append("cmpThreshold    varchar(255) DEFAULT 60,");
         sql.append("enabled     varchar(255) DEFAULT 1");
         sql.append(");");
         // 浜鸿劯鐗瑰緛琛�
diff --git a/QiaoJiaSystem/RapidStructureApp/TriggerElement.cpp b/QiaoJiaSystem/RapidStructureApp/TriggerElement.cpp
index 11233ce..541c29f 100644
--- a/QiaoJiaSystem/RapidStructureApp/TriggerElement.cpp
+++ b/QiaoJiaSystem/RapidStructureApp/TriggerElement.cpp
@@ -5,7 +5,7 @@
 //    TimerElement(1),
     triggerState(false),
     tolerance(tolerance), delay(delay),
-    triggerType(DOWN), triggerTimes(0),lastDown(0),lastUp(0) {
+    triggerType(DOWN), triggerTimes(0), lastDown(0), lastUp(0) {
 
 }
 
@@ -78,12 +78,12 @@
     lastDown = 0;
     triggerType = DOWN;
 }
-void TriggerElement::resetTriggerState()
-{
+
+void TriggerElement::resetTriggerState() {
 
     //state=false;
-    triggerState=false;
-    triggerTimes=0;
+    triggerState = false;
+    triggerTimes = 0;
 }
 
 void TriggerElement::timerFunc() {
diff --git a/QiaoJiaSystem/StructureApp/AppPipeController.cpp b/QiaoJiaSystem/StructureApp/AppPipeController.cpp
index fcddc04..14bfad1 100644
--- a/QiaoJiaSystem/StructureApp/AppPipeController.cpp
+++ b/QiaoJiaSystem/StructureApp/AppPipeController.cpp
@@ -95,7 +95,7 @@
     perHubElement(ruleMap[PerHubSdk]),
     leftJudgment(ruleMap[KeepRightSdk]),
     rightJudgment(ruleMap[KeepRightSdk]),
-    bRecordVideoEnable(RecordVideoEnable),
+//    bRecordVideoEnable(RecordVideoEnable),
     m_sdkRuleMap(ruleMap),
     m_bSetWH(false) {
     DBG("camId" << camId);
@@ -292,7 +292,7 @@
                 //#todo
                 faceRpcElement.setProperty("time", strNewTime);
                 faceRpcElement.setProperty("imgKey", imgKey);
-                INFO("Write To FaceRPC  ES time:" << strNewTime << "    ImgKey: " << imgKey);
+//                INFO("Write To FaceRPC  ES time:" << strNewTime << "    ImgKey: " << imgKey);
                 faceRpcElement.setImage(imageTemp);
                 faceRpcElement.submit();
             }
@@ -302,7 +302,7 @@
                 //#todo
                 yoloRpcElement.setProperty("time", strNewTime);
                 yoloRpcElement.setProperty("imgKey", imgKey);
-                INFO("Write To YoloES time:" << strNewTime << "    ImgKey: " << imgKey);
+//                INFO("Write To YoloES time:" << strNewTime << "    ImgKey: " << imgKey);
                 yoloRpcElement.setImage(imageTemp);
                 yoloRpcElement.submit();
             }
@@ -530,7 +530,7 @@
 #else
     vptRpcElement.registerConnector([&] {
         if (!perimeterElement.isBusy()) {
-            perimeterElement.setYoloObjects(vptRpcElement.getLastHpRects());
+            perimeterElement.setYoloObjects(vptRpcElement.getLastScoreRects());
             perimeterElement.setImage(vptRpcElement.getImage());
             perimeterElement.submit();
         }
diff --git a/QiaoJiaSystem/StructureApp/CMakeLists.txt b/QiaoJiaSystem/StructureApp/CMakeLists.txt
index 8eaf3c2..b15b23e 100644
--- a/QiaoJiaSystem/StructureApp/CMakeLists.txt
+++ b/QiaoJiaSystem/StructureApp/CMakeLists.txt
@@ -44,7 +44,6 @@
     ../../../BasicPlatForm/basic/util/curl/HttpRequestWithCrul.hpp
     ../../../BasicPlatForm/basic/util/net_config/net_config.cpp
     ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
-
     )
 
 SET(LIBS
diff --git a/QiaoJiaSystem/StructureApp/FaceExtractElement.cpp b/QiaoJiaSystem/StructureApp/FaceExtractElement.cpp
index f965ded..4a49548 100644
--- a/QiaoJiaSystem/StructureApp/FaceExtractElement.cpp
+++ b/QiaoJiaSystem/StructureApp/FaceExtractElement.cpp
@@ -61,12 +61,12 @@
 }
 
 void FaceExtractElement::timerFunc() {
-    INFO("MYH Run Here");
+//    INFO("MYH Run Here");
     std::vector<FaceToExtract> faceExtractQueueTmp;
     {
         std::lock_guard<std::mutex> lg(imageQueueMutex);
         if (faceExtractQueue.empty()) {
-            ERR("faceExtractQueue.empty ");
+//            ERR("faceExtractQueue.empty ");
             return;
         }
         faceExtractQueueTmp.swap(faceExtractQueue);
@@ -78,7 +78,7 @@
         float t_com_sc = m_sdkRule.nThreshold == 0 ? 75 : m_sdkRule.nThreshold;
 
 
-        DBG(" TESTCODE getValue" << t_camIdex << "  " << t_com_sc << "  " << t_com_sc / 100);
+//        DBG(" TESTCODE getValue" << t_camIdex << "  " << t_com_sc << "  " << t_com_sc / 100);
 
         t_com_sc = t_com_sc / 100;
 
@@ -108,7 +108,7 @@
 
             unsigned long size = faceExtractQueueTmp[i].facesPos.size();
             for (int j = 0; j < size; j++) {
-                auto feature = extractServer->faceExtract(image.cols, image.rows, faceExtractQueueTmp[i].facesPos[j],
+				auto feature = extractServer->faceExtract(image.cols, image.rows, faceExtractQueueTmp[i].facesPos[j],
                                                           sharedMemory->key().toStdString());
 //                {
 //                    //#todo
@@ -118,7 +118,7 @@
 //                    cv::imwrite(string1, image);
 //                }
                 if (feature.empty()) {
-                    INFO("No Face Find: " << getProperty("imgKey"));
+//                    INFO("No Face Find: " << getProperty("imgKey"));
                     continue;
                 }
                 features.clear();
@@ -131,7 +131,7 @@
                     std::string strImgUrlTmp = "";
                     fdfsClient->fastFds->uploadFile(buffer, strImgUrlTmp, "jpg");
                     //  strImgUrl.append(fdfsClient->fastFds->getIp() + "/" + strImgUrlTmp);
-                    DBG("strImgUrlTmp=" << strImgUrlTmp);
+//                    DBG("strImgUrlTmp=" << strImgUrlTmp);
                     strImgUrl.clear();
                     strImgUrl = strImgUrlTmp;
 //                    strImgUrl.append("/").append(strImgUrlTmp);
diff --git a/QiaoJiaSystem/StructureApp/FaceRpcElement.cpp b/QiaoJiaSystem/StructureApp/FaceRpcElement.cpp
index 8ff149f..67fa6d1 100644
--- a/QiaoJiaSystem/StructureApp/FaceRpcElement.cpp
+++ b/QiaoJiaSystem/StructureApp/FaceRpcElement.cpp
@@ -82,7 +82,7 @@
 }
 
 void FaceRpcElement::threadFunc() {
-    INFO("MYH Run Here");
+//    INFO("MYH Run Here");
 //    ClockTimer ct("FaceRpcElement::threadFunc");
 //    {
 //
@@ -135,12 +135,12 @@
                     CvUtil::zoomRectEqual(scoredRect.rect, 1.5, 1.5) & cv::Rect(0, 0, image.cols, image.rows)).clone());
                 triggerScoredRects.push_back(trackingTrigger->getLastRect());
             } else {
-                INFO("No Face Find: " << getProperty("imgKey"));
+//                INFO("No Face Find: " << getProperty("imgKey"));
 //                DBG("trackingTrigger->triggerOnce(scoredRect) is false  ");
             }
         }
         if (faces.empty()) {
-            INFO("No Face Find: " << getProperty("imgKey"));
+//            INFO("No Face Find: " << getProperty("imgKey"));
         }
         trackingTrigger->triggerLine();
         //        DBG("faces.size  " << faces.size());
diff --git a/QiaoJiaSystem/StructureApp/PerimeterElement.cpp b/QiaoJiaSystem/StructureApp/PerimeterElement.cpp
index c637c6d..5358abe 100644
--- a/QiaoJiaSystem/StructureApp/PerimeterElement.cpp
+++ b/QiaoJiaSystem/StructureApp/PerimeterElement.cpp
@@ -14,19 +14,19 @@
 #include <jsoncpp/json/json.h>
 
 #define ALARM_PERCENT (25)  //25%
+
 PerimeterElement::PerimeterElement(const SdkRule &rule) :
     m_sdkRule(rule),
     PipeElement(true),
     trackingTrigger(nullptr),
     mRealNum(0),
     //姣忕鍑犲紶,灏变箻浠ュ嚑
-    m_triggerElement(rule.nTriggerDelay*3,0),
+    m_triggerElement(rule.nTriggerDelay * 3, 0),
     pManagerEsDB(nullptr),
     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,67 +79,65 @@
             // DBG("picDate="<<picDate);
 
         }
-        if(imgKey.empty())
-        {
-            imgKey =obj.properties["imgKey"];
+        if (imgKey.empty()) {
+            imgKey = obj.properties["imgKey"];
         }
-        if (m_sdkRule.nSdkType == PerimeterSdk)
-        {
-
-            if(m_bIsMask)
+        if (m_sdkRule.nSdkType == PerimeterSdk) {
+            //todo 瑙f瀽sdkrule 骞跺拰妫�娴嬬粨鏋滃姣�
+            if (m_sdkRule.strPerimeterObjType.toStdString().find(obj.properties["type"]) ==
+                m_sdkRule.strPerimeterObjType.toStdString().npos)//椤甸潰娌℃湁閰嶇疆浜嗚绠楁硶
             {
-                   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);
+                continue;
+            }
 
-                   if(ALARM_PERCENT <= per)
-                   {
-                       //DBG("per 1="<<per1<<" per2="<<per2<<" per="<<per);
-                       m_recVec.push_back(obj.rect);
-                       num++;
-                   }
+            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);
+                    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) {
         case PerimeterSdk:
             //state = num > 0 ;
-            state =( num !=mRealNum);
-          //  DBG("num="<<num<< "time="<< picDate);
-            INFO("SDK Type: PerimeterSdk");
+            state = (num != mRealNum);
+            //  DBG("num="<<num<< "time="<< picDate);
+//            INFO("SDK Type: PerimeterSdk");
 
             break;
         case CrowdSdk:
-            state = num > m_sdkRule.nAlarmNumLowerLimit && num !=mRealNum;
-            INFO("SDK Type: CrowdSdk");
+            state = num > m_sdkRule.nAlarmNumLowerLimit && num != mRealNum;
+//            INFO("SDK Type: CrowdSdk");
 
             break;
         case PerHubSdk:
-            state = num > m_sdkRule.nAlarmNumLowerLimit && num < m_sdkRule.nAlarmNumUpperLimit && num !=mRealNum;
-            INFO("SDK Type: PerHubSdk");
+            state = num > m_sdkRule.nAlarmNumLowerLimit && num < m_sdkRule.nAlarmNumUpperLimit && num != mRealNum;
+//            INFO("SDK Type: PerHubSdk");
 
 //         if(m_sdkRule.nAlarmNumLowerLimit>=0)
 //         {
@@ -166,24 +169,32 @@
         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())
-    {
-        if(num > 0) {
-            if(pointArray!=nullptr)
-            {
-                const cv::Point2i* ppt[1] = { pointArray };
+    DBG("m_triggerElement.getTriggerState():" << m_triggerElement.getTriggerState());
+    if (m_triggerElement.getTriggerState()) {
+        if (num > 0) {
+            if (pointArray != nullptr) {
+                const cv::Point2i *ppt[1] = {pointArray};
 
-                int npt[]={npts};
+                int npt[] = {npts};
 
-                cv::polylines(image, ppt,npt, 1, true,cv::Scalar(255,255,0), 2);
+                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())
@@ -192,7 +203,7 @@
 //                return;
 //            }
             std::string imgUrl = uploadImgToFdfs(image);
-            saveInfoToEs(imgUrl, picDate,imgKey);
+            saveInfoToEs(imgUrl, picDate, imgKey);
         }
         DBG("num=" << num << " lastnum=" << mRealNum);
         mRealNum = num;
@@ -262,31 +273,28 @@
 void PerimeterElement::setMask(std::string mask) {
     QJsonArray arrayAreas = getJsonArrayFromQString(QString::fromStdString(mask));
     if (arrayAreas.isEmpty() && m_sdkRule.nSdkType != PerimeterSdk) {
-        m_bIsMask=false;
+        m_bIsMask = false;
         return;//do not detect
     }
     int size = arrayAreas.size();
     npts = size;
-    float sizeW=(float)appPref.getIntData(m_sdkRule.strCamId.toStdString()+"width")/480;
-    float sizeH=(float)appPref.getIntData(m_sdkRule.strCamId.toStdString()+"height")/270;
-    pointArray=new cv::Point2i[npts];
+    float sizeW = (float) appPref.getIntData(m_sdkRule.strCamId.toStdString() + "width") / 480;
+    float sizeH = (float) appPref.getIntData(m_sdkRule.strCamId.toStdString() + "height") / 270;
+    pointArray = new cv::Point2i[npts];
     for (int i = 0; i < size; ++i) {
 
         QJsonValue jsonValue = arrayAreas[i];
         QJsonObject obj = jsonValue.toObject();
-        int x = obj.value("x").toDouble() *sizeW;
-        int y = obj.value("y").toDouble() *sizeH;
-        pointArray[i]={x,y};
-        if(m_sdkRule.nSdkType == PerimeterSdk)
-        {
-             poly1.push_back(Point(x,y));
+        int x = obj.value("x").toDouble() * sizeW;
+        int y = obj.value("y").toDouble() * sizeH;
+        pointArray[i] = {x, y};
+        if (m_sdkRule.nSdkType == PerimeterSdk) {
+            poly1.push_back(Point(x, y));
+        } else {
+            mPolygon << (QPoint(x, y));
         }
-        else
-        {
-             mPolygon << (QPoint(x, y));
-        }
-        DBG("width="<<sizeW);
-        DBG("height="<<sizeH);
+//        DBG("width="<<sizeW);
+//        DBG("height="<<sizeH);
 
 
     }
@@ -295,7 +303,7 @@
 QJsonArray PerimeterElement::getJsonArrayFromQString(const QString &strJson) {
     QJsonDocument jsonDocument = QJsonDocument::fromJson(strJson.toLocal8Bit());
     if (jsonDocument.isNull()) {
-        DBG("please check the string" << strJson.toStdString());
+        ERR("please check the string" << strJson.toStdString());
         return QJsonArray();
     }
     QJsonArray jsonArray = jsonDocument.array();
@@ -307,10 +315,9 @@
 //        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;
+        m_bSetWH = true;
     }
 
 }
@@ -327,7 +334,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);
@@ -336,7 +343,7 @@
     return strImgUrl;
 }
 
-bool PerimeterElement::saveInfoToEs(const std::string &imgUrl, const std::string &time,const std::string& imgKey) {
+bool PerimeterElement::saveInfoToEs(const std::string &imgUrl, const std::string &time, const std::string &imgKey) {
 
     string str_uuid;
     uuid_t t_uuid;
@@ -361,13 +368,13 @@
     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());
+    DBG("picAddress=" << m_sdkRule.strAddr.toStdString());
     t_json["picMaxUrl"] = ""; // 澶у浘璺緞
 
 
     //   t_json["Age"] ="wait todo";
     t_json["picDate"] = time; // 鎶撴媿鏃堕棿锛屽繀椤绘湁
-     DBG("picDate="<<time);
+    DBG("picDate=" << time);
     t_json["picLocalUrl"] = "";  // 鏈湴璺緞
     t_json["isDelete"] = "1";//榛樿1 ,0鏃犳晥 1鏈夋晥
 
@@ -389,20 +396,18 @@
     t_json["imgKey"] = imgKey;
     try {
         auto server = m_rpcClient.getServer();
-        if (!server)
-        {
+        if (!server) {
             ERR("server is null");
             //return false;
         }
-        INFO("Record Video "<<imgKey);
+        INFO("Record Video " << imgKey);
         server->recordVideo(imgKey);
     }
-    catch (std::exception &e)
-    {
-        ERR("Record Video Err: "<<imgKey <<"   Message: "<<e.what());
+    catch (std::exception &e) {
+        ERR("Record Video Err: " << imgKey << "   Message: " << e.what());
         //return false;
     }
-    INFO("SaveImgKeyToES: "<<imgKey);
+    INFO("SaveImgKeyToES: " << imgKey);
     bool retface = false;
     if (pManagerEsDB)
         retface = pManagerEsDB->insertData("personaction", "perVideoAction", t_json.toStyledString(), str_uuid);
diff --git a/QiaoJiaSystem/StructureApp/PerimeterElement.h b/QiaoJiaSystem/StructureApp/PerimeterElement.h
index df6deca..cdc80d7 100644
--- a/QiaoJiaSystem/StructureApp/PerimeterElement.h
+++ b/QiaoJiaSystem/StructureApp/PerimeterElement.h
@@ -85,7 +85,12 @@
 
 
     int npts;
-   std::vector<cv::Rect> m_recVec;
+    std::vector<cv::Rect> m_recVec;
+
+   //todo debug
+    std::vector<float> m_scoreVec;
+    std::vector<std::string> m_objTypeVec;
+
 
    bool m_bIsMask;
    std::vector<Point> poly1;
diff --git a/QiaoJiaSystem/StructureApp/VptRpcElement.cpp b/QiaoJiaSystem/StructureApp/VptRpcElement.cpp
index 8607438..3168bf2 100644
--- a/QiaoJiaSystem/StructureApp/VptRpcElement.cpp
+++ b/QiaoJiaSystem/StructureApp/VptRpcElement.cpp
@@ -10,6 +10,7 @@
                                                                         appPref.getStringData("vpt.ip"),
                                                                         appPref.getIntData("vpt.port"), "tcp"),
                                                             m_sharedMemory(nullptr), m_trackingTrigger(nullptr) {
+    init();
 
 }
 
@@ -63,9 +64,9 @@
     }
 
     for (auto &obj: m_objs) {
-        //#todo 浜�/浜洪獞杞�/杞�
-        if (obj.sdkDetectType != 0)
-            continue;
+//        //#todo 浜�/浜洪獞杞�/杞�
+//        if (obj.sdkDetectType != 0)
+//            continue;
 
         ScoredRect scoredRect;
 
@@ -80,24 +81,25 @@
             m_trackingTrigger->getLastRect().properties["time"] = getProperty("time");
             m_trackingTrigger->getLastRect().properties["imgKey"] = getProperty("imgKey");
             m_triggerScoredRects.push_back(m_trackingTrigger->getLastRect());
-            switch (obj.sdkDetectType) {
-                case 0 :
-                    m_HPScoredRects.push_back(m_trackingTrigger->getLastRect());
-                    break;
-                case 1:
-                case 2 :
-                    m_HCPScoredRects.push_back(m_trackingTrigger->getLastRect());
-                    break;
-                case 4 :
-                case 5 :
-                case 6 :
-                case 8 :
-                    m_CarScoredRects.push_back(m_trackingTrigger->getLastRect());
-                    break;
-            }
+
         }
     }
     m_trackingTrigger->triggerLine();
+    auto res_ = m_trackingTrigger->getLastScoreRects();
+    for (auto &obj: res_) {
+        if(obj.properties["type"] == "person") {
+            m_HPScoredRects.push_back(obj);
+            DBG("person:" << obj.score);
+        }else if((obj.properties["type"] == "bike") ||
+                (obj.properties["type"] == "motor")){
+            m_HCPScoredRects.push_back(obj);
+            DBG("bike or moto:" << obj.score);
+        }else{
+            m_CarScoredRects.push_back(obj);
+            DBG("car:" << obj.score);
+        }
+    }
+
     fireConnectors();
 }
 
@@ -113,9 +115,9 @@
 
     try {
         auto server = m_rpcClient.getServer();
-        m_HpResStr = server->getStr(0);      // 妫�娴嬬绫�   case 0
-        m_HcpResStr = server->getStr(1);      // 妫�娴嬬绫�   case 1
-        m_TypeStr = server->getStr(2)[0];        // 妫�娴嬬绫�   case 2
+        m_HpResStr = server->getStr(0);      // 琛屼汉浜屾灞炴��   case 0
+        m_HcpResStr = server->getStr(1);      // 浜洪獞杞︿簩娆″睘鎬�   case 1
+        m_TypeStr = server->getStr(2)[0];        // VPT妫�娴嬬绫�   case 2
         m_colorLabelStr = server->getStr(3)[0];    // 杞︾墝棰滆壊   case 3
     }
     catch (std::exception &e) {
diff --git a/QiaoJiaSystem/StructureApp/main.cpp b/QiaoJiaSystem/StructureApp/main.cpp
index 7d62bc9..454701c 100644
--- a/QiaoJiaSystem/StructureApp/main.cpp
+++ b/QiaoJiaSystem/StructureApp/main.cpp
@@ -21,13 +21,18 @@
     appPref.setIntData("gpu.index", 0);
     appPref.setIntData("show.image", 0);
 
-    //yolo server
-    appPref.setStringData("yolo.proxy", "yoloServer");
-    //#todo
-    appPref.setStringData("yolo.ip", "");
-    appPref.setIntData("yolo.port", 10003);
-//    rpcClient(appPref.getStringData("yolo.proxy"), appPref.getStringData("yolo.ip"), appPref.getLongData("yolo.port"),"tcp"),
+//    //yolo server
+//    appPref.setStringData("yolo.proxy", "yoloServer");
+//    //#todo
+//    appPref.setStringData("yolo.ip", "");
+//    appPref.setIntData("yolo.port", 10003);
+////    rpcClient(appPref.getStringData("yolo.proxy"), appPref.getStringData("yolo.ip"), appPref.getLongData("yolo.port"),"tcp"),
 
+//vpt server
+    appPref.setStringData("vpt.proxy", "VptServer");
+    //#todo
+    appPref.setStringData("vpt.ip", "");
+    appPref.setIntData("vpt.port", appPref.getIntData("RpcVptPort"));
 
     //face detect server
     appPref.setStringData("faceDete.proxy", "faceServer");
diff --git a/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp b/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp
index 6432932..9900ab5 100644
--- a/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp
+++ b/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp
@@ -102,7 +102,17 @@
             //#todo 浣跨敤绛栫暐妯″紡?鍙戦�佺澶氫釜鎸囦护绱Н鍚庡彂閫�?
             if (itor_json->isString() && reader.parse(itor_json->asString(), cfg_val)) {
                 if (itor_json.name() == "cam_edit" || itor_json.name() == "editSdkRule") {
-                    string cam_idx = cfg_val["str_cam_dev_id"].asString();
+					string cam_idx = "";
+					if(itor_json.name() == "cam_edit"){
+                        if (pthis->m_GB28181_Enable){
+	                        cam_idx = cfg_val["equipCode"].asString();
+	                    }else{
+	                        cam_idx = cfg_val["str_cam_dev_id"].asString();
+	                    }
+					} else {
+						cam_idx = cfg_val["strCamId"].asString();
+					}
+
                     if (pthis->controllers.find(cam_idx) != pthis->controllers.end()) {
                         if (pthis->m_GB28181_Enable) {
                             auto lst = pthis->m_lDBTool->searchCamDevTableByType(1);
@@ -126,7 +136,13 @@
                         }
                     }
                 } else if (itor_json.name() == "cam_del") {
-                    string cam_idx = cfg_val["str_cam_dev_id"].asString();
+//                    string cam_idx = cfg_val["str_cam_dev_id"].asString();
+                    string cam_idx = "";
+                    if(cfg_val["equipCode"].asString().size()){
+                        cam_idx = cfg_val["equipCode"].asString();
+                    }else if(cfg_val["str_cam_dev_id"].asString().size()){
+                        cam_idx = cfg_val["str_cam_dev_id"].asString();
+                    }
                     pthis->removeCamera(cam_idx);
                 }
             } else {
@@ -254,14 +270,16 @@
         rule.second.strAddr = item.str_addr;
         rule.second.weekRuleVec = m_lDBTool->searchCameraWeekRuleByCamId(item.str_cam_dev_id, rule.first);
 
-        if (rule.second.nSdkType == PerStaticSdk) {
-            float temp = 1 - (float) (rule.second.nThreshold) / 100;
-            rule.second.fSensitivity = (75 + 25 * temp) / 100;
+//        if (rule.second.nSdkType == PerStaticSdk || rule.second.nSdkType == PerimeterSdk
+//            || rule.second.nSdkType == KeepRightSdk || rule.second.nSdkType == KeepRightSdk) {
+            float temp = (float)1 - (float) (rule.second.nThreshold) / 100;
+            rule.second.fSensitivity = (temp * 50 + 50) / 100;
+//            rule.second.fSensitivity = (temp * 25 + 75) / 100;
 
-        } else if (rule.second.nSdkType != FaceSdk) {
-            float temp = 1 - (float) (rule.second.nThreshold) / 100;
-            rule.second.fSensitivity = (5 + 90 * temp) / 100;
-        }
+//        } else if (rule.second.nSdkType != FaceSdk) {
+//            float temp = (float)1 - (float) (rule.second.nThreshold) / 100;
+//            rule.second.fSensitivity = (temp * 90 + 5) / 100;
+//        }
         DBG("fSensitivity" << rule.second.fSensitivity);
     }
     appPref.setStringData(t_camIdex + "rtsp", rtsp_url);
diff --git a/QiaoJiaSystem/VideoAnalysFromHC/main.cpp b/QiaoJiaSystem/VideoAnalysFromHC/main.cpp
index 6edf3bf..d5a83dd 100644
--- a/QiaoJiaSystem/VideoAnalysFromHC/main.cpp
+++ b/QiaoJiaSystem/VideoAnalysFromHC/main.cpp
@@ -86,7 +86,7 @@
     appPref.setIntData("gpu.index", atoi(argv[2]));
     appPref.setIntData("CamStartNO", atoi(argv[3]));
     appPref.setIntData("CamEndNO", atoi(argv[4]));
-    appPref.setIntData("RpcYOLOPort", atoi(argv[5]));
+    appPref.setIntData("RpcVptPort", atoi(argv[5]));
     appPref.setIntData("RpcFDPort", atoi(argv[6]));
     appPref.setIntData("RpcFEPort", atoi(argv[7]));
     appPref.setIntData("RpcFSPort", atoi(argv[8]));
@@ -102,12 +102,17 @@
     appPref.setIntData("ipPort", appConfig.getIntProperty("ES_PORT"));
 
     //yolo server
-    appPref.setStringData("yolo.proxy", "yoloServer");
-    //#todo
-    appPref.setStringData("yolo.ip", "");
-    appPref.setIntData("yolo.port", appPref.getIntData("RpcYOLOPort"));
-//    rpcClient(appPref.getStringData("yolo.proxy"), appPref.getStringData("yolo.ip"), appPref.getLongData("yolo.port"),"tcp"),
+//    appPref.setStringData("yolo.proxy", "yoloServer");
+//    //#todo
+//    appPref.setStringData("yolo.ip", "");
+//    appPref.setIntData("yolo.port", appPref.getIntData("RpcYOLOPort"));
+////    rpcClient(appPref.getStringData("yolo.proxy"), appPref.getStringData("yolo.ip"), appPref.getLongData("yolo.port"),"tcp"),
 
+//vpt server
+    appPref.setStringData("vpt.proxy", "vptServer");
+    //#todo
+    appPref.setStringData("vpt.ip", "");
+    appPref.setIntData("vpt.port", appPref.getIntData("RpcVptPort"));
 
     //face detect server
     appPref.setStringData("faceDete.proxy", "faceServer");
diff --git a/QiaoJiaSystem/VideoServer/QiaoJia/DB/DBStruct.h b/QiaoJiaSystem/VideoServer/QiaoJia/DB/DBStruct.h
index 44e7822..5f7aa3a 100644
--- a/QiaoJiaSystem/VideoServer/QiaoJia/DB/DBStruct.h
+++ b/QiaoJiaSystem/VideoServer/QiaoJia/DB/DBStruct.h
@@ -299,6 +299,7 @@
         strExAreas = "";
         strLine = "";
         strAddr = "";
+        strPerimeterObjType = "";
     }
 
     int nSdkType;
@@ -318,6 +319,7 @@
     int nAlarmNumUpperLimit; //鎶ヨ浜烘暟锛堜汉鍛樻嫢鎸わ級
     int nAlarmNumLowerLimit;
     int nIsRun;
+    QString strPerimeterObjType;//鍏ヤ镜绫诲瀷
 
     std::vector<LActRuleWeekRecord> weekRuleVec;
 };
diff --git a/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp b/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp
index cba8280..d9bb45b 100644
--- a/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp
+++ b/QiaoJiaSystem/VideoServer/QiaoJia/DB/LDBTool.cpp
@@ -2688,6 +2688,7 @@
     rec.setValue("is_run", sdkRule.nIsRun);
     rec.setValue("img_threshold", sdkRule.nThreshold);
     rec.setValue("img_quality", sdkRule.nQuality);
+    rec.setValue("perimeter_obj_type", sdkRule.strPerimeterObjType);
 
     int rowCount = pModel.rowCount();
     if (rowCount == 0) {
@@ -2734,6 +2735,7 @@
         rule.nAlarmNumUpperLimit = rec.value("alarm_num_upper").toInt();
         rule.nAlarmNumLowerLimit = rec.value("alarm_num_lower").toInt();
         rule.strBroadcast = rec.value("broadcast_area").toString();
+        rule.strPerimeterObjType = rec.value("perimeter_obj_type").toString();
         rule.nIsRun = rec.value("is_run").toInt();
         rule.nSdkType = rec.value("sdk_type").toInt();
         ruleMap[rule.nSdkType] = rule;
diff --git a/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp b/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp
index 36b2df4..295ad0b 100644
--- a/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp
+++ b/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp
@@ -90,7 +90,13 @@
                         }
                     }
                 } else if (itor_json.name() == "cam_edit") {
-                    string cam_idx = cfg_val["str_cam_dev_id"].asString();
+                    string cam_idx = "";
+                    if(pthis->m_GB28181_Enable){
+                        cam_idx = cfg_val["equipCode"].asString();
+                    }else{
+                        cam_idx = cfg_val["str_cam_dev_id"].asString();
+                    }
+
                     if (pthis->m_GB28181_Enable) {
                         if (pthis->m_controllers_videoCapElem.find(cam_idx) !=
                             pthis->m_controllers_videoCapElem.end()) {
@@ -108,19 +114,24 @@
                         }
                     }
                 } else if (itor_json.name() == "cam_del") {
-                    string cam_idx = cfg_val["str_cam_dev_id"].asString();
+                    string cam_idx = "";
+                    if(pthis->m_GB28181_Enable){
+                        cam_idx = cfg_val["equipCode"].asString();
+                    }else{
+                        cam_idx = cfg_val["str_cam_dev_id"].asString();
+                    }
                     pthis->removeCamera(cam_idx);
                 } else if (itor_json.name() == "cam_startPublish") {
                     string cam_idx = cfg_val["id"].asString();
                     if (pthis->m_GB28181_Enable) {
                         if (pthis->m_controllers_videoCapElem.find(cam_idx) !=
                             pthis->m_controllers_videoCapElem.end()) {
-                            INFO("cam add is " << cfg_val["str_addr"].asString());
+                            INFO("cam add is " << cam_idx);
                             pthis->m_controllers_videoCapElem[cam_idx]->startPublishVideo();
                         }
                     } else {
                         if (pthis->m_controllers.find(cam_idx) != pthis->m_controllers.end()) {
-                            INFO("cam add is " << cfg_val["str_addr"].asString());
+                            INFO("cam add is " << cam_idx);
                             pthis->m_controllers[cam_idx]->startPublishVideo();
                         }
                     }
@@ -325,7 +336,7 @@
         //    auto lst = m_lDBTool->searchCamDevTableAll();
         Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
         if (m_controllers.find(index) == m_controllers.end()) {
-            INFO("MYH DEBUG HERE");
+//            INFO("MYH DEBUG HERE");
             if (m_currentCount >= m_maxCount) {
                 ERR("addCamera faild, camera's num is full!")
                 return -1;
@@ -356,7 +367,7 @@
  * @return 鎬绘槸0
  */
 int RtspAnalysManager::removeCamera(const std::string &index) {
-    INFO("MYH DEBUG HERE");
+//    INFO("MYH DEBUG HERE");
     if (m_GB28181_Enable) {
         if (m_controllers_videoCapElem.find(index) == m_controllers_videoCapElem.end())return -1;
         auto controller = m_controllers_videoCapElem[index];
@@ -382,7 +393,7 @@
     delete imgRedis;
     m_imgRedisControllers.erase(index);
     m_imgRedisCRwLock.unlock();
-    INFO("MYH DEBUG HERE");
+//    INFO("MYH DEBUG HERE");
     return 0;
 }
 
@@ -443,7 +454,7 @@
 
 //褰曞彇瑙嗛鐨凴PC鐨勬帴鍙e嚱鏁�
 ::std::string RtspAnalysManager::recordVideo(const ::std::string &name, const ::Ice::Current &) {
-    INFO("Record Video For: " << name);
+//    INFO("Record Video For: " << name);
     ImageName_s_t nameSt = ImageName_s_t::fromString(name);
     if (nameSt.Valid()) {
         if (m_GB28181_Enable) {
diff --git a/QiaoJiaSystem/VideoToImageMulth/RtspCaptureElement.cpp b/QiaoJiaSystem/VideoToImageMulth/RtspCaptureElement.cpp
index 374529b..38fcecb 100644
--- a/QiaoJiaSystem/VideoToImageMulth/RtspCaptureElement.cpp
+++ b/QiaoJiaSystem/VideoToImageMulth/RtspCaptureElement.cpp
@@ -39,39 +39,57 @@
         }
     }
 
-    m_picCount++;
-    //鍑犲紶閫変竴寮犳斁鍏edis
-    if (m_picCount % m_nPicsPickOne != 0) {
-        return;
-    } else {
-        m_picCount.store(0);
-    }
+    u_char *data;
+    int width = 0, height = 0, step = 0, cn = 0;
+    cv::Mat copyMat;
 
-    {
-        u_char *data;
-        int width = 0, height = 0, step = 0, cn = 0;
-        m_capture->retrieveFrame(0, &data, &step, &width, &height, &cn);
-
-        cv::Mat img(height, width, CV_8UC3, data, step);
-        cv::Mat copyMat;
-        img.copyTo(copyMat);
-        std::string imageName = m_capture->GetImageName();
-        m_pManager->SaveImageToRedis(m_camId, imageName, copyMat);
-    }
-    //#todo publish Video
+    //#publish Video
     if (m_publishVideoRet) {
         if (videoPublishElement == nullptr) {
             string path = appConfig.getStringProperty("srsAddr") + "cam" + m_camId + ".flv";
             cv::Size size_(appConfig.getIntProperty("pulish.width"), appConfig.getIntProperty("pulish.height"));
             int gupIdx = appPref.getIntData("gpu.index");
             videoPublishElement = new ffmpeg::VideoPublishElement(path, size_, "flv", 25, gupIdx);
+            videoPublishElement->start();
         } else {
+//            DBG("videoPublishElement->setImage()");
+            m_capture->retrieveFrame(0, &data, &step, &width, &height, &cn);
+            cv::Mat img(height, width, CV_8UC3, data, step);
+            img.copyTo(copyMat);
+
+            if (!copyMat.empty()) {
+                videoPublishElement->setImage(copyMat);
+            } else {
+                DBG("copyMat.empty()");
+            }
+        }
+    } else {
+        if (videoPublishElement != nullptr) {
+            DBG("videoPublishElement->stop()");
             videoPublishElement->stop();
             videoPublishElement->wait();
             delete videoPublishElement;
             videoPublishElement = nullptr;
         }
     }
+
+    //鍑犲紶閫変竴寮犳斁鍏edis
+    m_picCount++;
+    if (m_picCount % m_nPicsPickOne != 0) {
+//        return;
+    } else {
+        m_picCount.store(0);
+
+        if (copyMat.empty()) {
+//        ERR("copyMat.empty()");
+            m_capture->retrieveFrame(0, &data, &step, &width, &height, &cn);
+            cv::Mat img(height, width, CV_8UC3, data, step);
+            img.copyTo(copyMat);
+        }
+        std::string imageName = m_capture->GetImageName();
+        m_pManager->SaveImageToRedis(m_camId, imageName, copyMat);
+    }
+
     fireConnectors();
 }
 
diff --git a/QiaoJiaSystem/VideoToImageMulth/RtspCaptureElement.h b/QiaoJiaSystem/VideoToImageMulth/RtspCaptureElement.h
index 36fa3ea..af806a5 100644
--- a/QiaoJiaSystem/VideoToImageMulth/RtspCaptureElement.h
+++ b/QiaoJiaSystem/VideoToImageMulth/RtspCaptureElement.h
@@ -56,7 +56,7 @@
 
 
     std::atomic<bool> m_publishVideoRet{false};
-    ffmpeg::VideoPublishElement *videoPublishElement;
+    ffmpeg::VideoPublishElement *videoPublishElement{nullptr};
     // Redis鐨勫伐鍏风被
 //        HiredisTool m_redisTool;
 
diff --git a/QiaoJiaSystem/VideoToImageMulth/RtspImageRedis.cpp b/QiaoJiaSystem/VideoToImageMulth/RtspImageRedis.cpp
index 871bda6..7e7e804 100644
--- a/QiaoJiaSystem/VideoToImageMulth/RtspImageRedis.cpp
+++ b/QiaoJiaSystem/VideoToImageMulth/RtspImageRedis.cpp
@@ -30,13 +30,13 @@
 //缁ф壙鑷埗绫�,绾跨▼鍒濆鍖栫殑涓�浜涘伐浣�
 void RtspImageRedisElement::threadInitial()
 {
-    INFO("MYH DEBUG HERE");
+//    INFO("MYH DEBUG HERE");
 }
 
 //缁ф壙鑷埗绫�,绾跨▼缁撴潫鐨勬椂鍊欒皟鐢�
 void RtspImageRedisElement::threadClosing()
 {
-    INFO("MYH DEBUG HERE");
+//    INFO("MYH DEBUG HERE");
 }
 
 //淇濆瓨鍥剧墖鍒伴槦鍒椾腑,
@@ -50,7 +50,7 @@
         m_imageQueue.push(NameImagePair_s_t(imageName,img));
     }
     else{
-        ERR("SaveImage Failed ImgName:"<<imageName);
+//        ERR("SaveImage Failed ImgName:"<<imageName);
     }
     return true;
 }
diff --git a/QiaoJiaSystem/VptServer/CMakeLists.txt b/QiaoJiaSystem/VptServer/CMakeLists.txt
index b7ccfac..91e237a 100644
--- a/QiaoJiaSystem/VptServer/CMakeLists.txt
+++ b/QiaoJiaSystem/VptServer/CMakeLists.txt
@@ -36,6 +36,9 @@
     VptServerI.cpp
     VptDetectWrapper.cpp
     ./rpc/VptServer.cpp
+
+    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.h
+    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
     #    GlobalSignalWaitLock.hpp
     )
 
diff --git a/QiaoJiaSystem/VptServer/VptDetectWrapper.cpp b/QiaoJiaSystem/VptServer/VptDetectWrapper.cpp
index 8b6b353..f49d7cf 100644
--- a/QiaoJiaSystem/VptServer/VptDetectWrapper.cpp
+++ b/QiaoJiaSystem/VptServer/VptDetectWrapper.cpp
@@ -4,6 +4,7 @@
 
 #include <basic/debug/Debug.h>
 #include "VptDetectWrapper.h"
+#include <basic/timer_counter/Clocktimer.h>
 
 VptDetectWrapper::VptDetectWrapper() {
     init();
@@ -43,6 +44,7 @@
 }
 
 list<VptDetectResults> VptDetectWrapper::process_image(cv::Mat &_img) {
+    ClockTimer ct("VptDetectWrapper::process_image");
     m_results.clear();
 
     sy_img img;
@@ -61,6 +63,9 @@
         int colorIndex = result.info[i].obj_index;
 
         if (colorIndex < 0 || colorIndex >= 9)continue;
+        if(colorIndex==4) DBG("detect a car, score =" << result.info[i].obj_score);
+        if(colorIndex==1) DBG("detect a bike, score =" << result.info[i].obj_score);
+        if(colorIndex==2) DBG("detect a moto, score =" << result.info[i].obj_score);
 //        sprintf(str_i, "%s:%.2f", type[colorIndex].c_str(), result.info[i].obj_score);
 
 //        rectangle(process_image,
@@ -100,7 +105,7 @@
         delete[] result.info;
         result.info = NULL;
     }
-    DBG(m_results.size());
+//    DBG(m_results.size());
     return m_results;
 }
 
@@ -146,62 +151,68 @@
             auto &carRes = vptDetectResults.vptDetectRes.carDetectRes;
 
             // 杞﹂鑹�
-            carRes.colorLabel = static_cast<ColorLabel>(cur_res->vc_res.res_index);
-            carRes.colorLabelProb = cur_res->vc_res.res_prob;
+            if(m_param.vehicle_color_config == SY_CONFIG_OPEN) {
+                carRes.colorLabel = static_cast<ColorLabel>(cur_res->vc_res.res_index);
+                carRes.colorLabelProb = cur_res->vc_res.res_prob;
+            }
 
             // 杞﹀瀷璇嗗埆
-            if (cur_res->vr_res.vehicle_brand != NULL) {
-                cout << "  杞﹁締鍝佺墝 - " << cur_res->vr_res.vehicle_brand << endl;
-                carRes.vehicle_brand = cur_res->vr_res.vehicle_brand;
+            if(m_param.vehicle_recg_config == SY_CONFIG_OPEN) {
+                if (cur_res->vr_res.vehicle_brand != NULL) {
+                    cout << "  杞﹁締鍝佺墝 - " << cur_res->vr_res.vehicle_brand << endl;
+                    carRes.vehicle_brand = cur_res->vr_res.vehicle_brand;
 //                carRes.vehicle_brand = string(cur_res->vr_res.vehicle_brand);
 //                carRes.vehicle_brand = "鍙�";
-                delete[] cur_res->vr_res.vehicle_brand;
-                cur_res->vr_res.vehicle_brand = NULL;
-            }
-            if (cur_res->vr_res.vehicle_subbrand != NULL) {
-                cout << "  杞﹁締瀛愬搧鐗� - " << cur_res->vr_res.vehicle_subbrand << endl;
-                carRes.vehicle_subbrand = cur_res->vr_res.vehicle_subbrand;
-//                carRes.vehicle_subbrand = cur_res->vr_res.vehicle_subbrand;
-                delete[] cur_res->vr_res.vehicle_subbrand;
-                cur_res->vr_res.vehicle_subbrand = NULL;
-            }
-            if (cur_res->vr_res.vehicle_issue_year != NULL) {
-                cout << "  杞﹁締骞存 - " << cur_res->vr_res.vehicle_issue_year << endl;
-                carRes.vehicle_issue_year = cur_res->vr_res.vehicle_issue_year;
-                delete[] cur_res->vr_res.vehicle_issue_year;
-                cur_res->vr_res.vehicle_issue_year = NULL;
-            }
-            if (cur_res->vr_res.vehicle_type != NULL) {
-                cout << "  杞﹁締绫诲瀷 - " << cur_res->vr_res.vehicle_type << endl;
-                carRes.vehicle_type = cur_res->vr_res.vehicle_type;
-                delete[] cur_res->vr_res.vehicle_type;
-                cur_res->vr_res.vehicle_type = NULL;
-            }
-            if (cur_res->vr_res.freight_ton != NULL) {
-                cout << "  璐ц溅鍚ㄧ骇 - " << cur_res->vr_res.freight_ton << endl;
-                carRes.freight_ton = cur_res->vr_res.freight_ton;
-                delete[] cur_res->vr_res.freight_ton;
-                cur_res->vr_res.freight_ton = NULL;
-            }
-//            cout << " " << cur_res->vr_res.name_score << endl;
-            carRes.vehicle_score = cur_res->vr_res.name_score;
-
-            // 杞︾墝
-            if (cur_res->vp_res.rect.height_ != 0 && cur_res->vp_res.rect.width_ != 0) {
-                cout << "杞︾墝浣嶇疆: " << cur_res->vp_res.rect.left_ << " " << cur_res->vp_res.rect.top_ << " "
-                     << cur_res->vp_res.rect.width_ << " " << cur_res->vp_res.rect.height_ << endl;
-                carRes.carPlateRect.setRect(cur_res->vp_res.rect.left_, cur_res->vp_res.rect.top_,
-                                            cur_res->vp_res.rect.width_, cur_res->vp_res.rect.height_);
-                carRes.carPlateRectScore = cur_res->vp_res.detectScore;
-                std::string _carPlate;
-                for (int m = 0; m < 7; m++) {
-                    printf("%s", cur_res->vp_res.recg[m].character);
-                    _carPlate.append(cur_res->vp_res.recg[m].character);
+                    delete[] cur_res->vr_res.vehicle_brand;
+                    cur_res->vr_res.vehicle_brand = NULL;
                 }
-                carRes.carPlate = const_cast<char *>(_carPlate.c_str());
-                carRes.carPlateRectScore = cur_res->vp_res.numScore;
-                carRes.carPlatetype = cur_res->vp_res.type;
+                if (cur_res->vr_res.vehicle_subbrand != NULL) {
+                    cout << "  杞﹁締瀛愬搧鐗� - " << cur_res->vr_res.vehicle_subbrand << endl;
+                    carRes.vehicle_subbrand = cur_res->vr_res.vehicle_subbrand;
+//                carRes.vehicle_subbrand = cur_res->vr_res.vehicle_subbrand;
+                    delete[] cur_res->vr_res.vehicle_subbrand;
+                    cur_res->vr_res.vehicle_subbrand = NULL;
+                }
+                if (cur_res->vr_res.vehicle_issue_year != NULL) {
+                    cout << "  杞﹁締骞存 - " << cur_res->vr_res.vehicle_issue_year << endl;
+                    carRes.vehicle_issue_year = cur_res->vr_res.vehicle_issue_year;
+                    delete[] cur_res->vr_res.vehicle_issue_year;
+                    cur_res->vr_res.vehicle_issue_year = NULL;
+                }
+                if (cur_res->vr_res.vehicle_type != NULL) {
+                    cout << "  杞﹁締绫诲瀷 - " << cur_res->vr_res.vehicle_type << endl;
+                    carRes.vehicle_type = cur_res->vr_res.vehicle_type;
+                    delete[] cur_res->vr_res.vehicle_type;
+                    cur_res->vr_res.vehicle_type = NULL;
+                }
+                if (cur_res->vr_res.freight_ton != NULL) {
+                    cout << "  璐ц溅鍚ㄧ骇 - " << cur_res->vr_res.freight_ton << endl;
+                    carRes.freight_ton = cur_res->vr_res.freight_ton;
+                    delete[] cur_res->vr_res.freight_ton;
+                    cur_res->vr_res.freight_ton = NULL;
+                }
+//            cout << " " << cur_res->vr_res.name_score << endl;
+                carRes.vehicle_score = cur_res->vr_res.name_score;
+            }
+
+            if(m_param.vehicle_pendant_det_recg_config == SY_CONFIG_OPEN) {
+                // 杞︾墝
+                if (cur_res->vp_res.rect.height_ != 0 && cur_res->vp_res.rect.width_ != 0) {
+                    cout << "杞︾墝浣嶇疆: " << cur_res->vp_res.rect.left_ << " " << cur_res->vp_res.rect.top_ << " "
+                         << cur_res->vp_res.rect.width_ << " " << cur_res->vp_res.rect.height_ << endl;
+                    carRes.carPlateRect.setRect(cur_res->vp_res.rect.left_, cur_res->vp_res.rect.top_,
+                                                cur_res->vp_res.rect.width_, cur_res->vp_res.rect.height_);
+                    carRes.carPlateRectScore = cur_res->vp_res.detectScore;
+                    std::string _carPlate;
+                    for (int m = 0; m < 7; m++) {
+                        printf("%s", cur_res->vp_res.recg[m].character);
+                        _carPlate.append(cur_res->vp_res.recg[m].character);
+                    }
+                    carRes.carPlate = const_cast<char *>(_carPlate.c_str());
+                    carRes.carPlateRectScore = cur_res->vp_res.numScore;
+                    carRes.carPlatetype = cur_res->vp_res.type;
 //                printf(" numScore = %.2f, detectScore = %.2f\n", cur_res->vp_res.numScore, cur_res->vp_res.detectScore);
+                }
             }
         };
             break;
diff --git a/QiaoJiaSystem/build/DataWebServer b/QiaoJiaSystem/build/DataWebServer
index 664c46a..159d12e 100755
--- a/QiaoJiaSystem/build/DataWebServer
+++ b/QiaoJiaSystem/build/DataWebServer
Binary files differ
diff --git a/QiaoJiaSystem/build/FaceDetectResourcesTest b/QiaoJiaSystem/build/FaceDetectResourcesTest
index f9ddeb1..92a5db2 100755
--- a/QiaoJiaSystem/build/FaceDetectResourcesTest
+++ b/QiaoJiaSystem/build/FaceDetectResourcesTest
Binary files differ
diff --git a/QiaoJiaSystem/build/FaceDetectServer b/QiaoJiaSystem/build/FaceDetectServer
index 0bc5e41..80b8a99 100755
--- a/QiaoJiaSystem/build/FaceDetectServer
+++ b/QiaoJiaSystem/build/FaceDetectServer
Binary files differ
diff --git a/QiaoJiaSystem/build/FaceExtractServer b/QiaoJiaSystem/build/FaceExtractServer
index e2aeb11..fddc622 100755
--- a/QiaoJiaSystem/build/FaceExtractServer
+++ b/QiaoJiaSystem/build/FaceExtractServer
Binary files differ
diff --git a/QiaoJiaSystem/build/FaceSearchServer b/QiaoJiaSystem/build/FaceSearchServer
index 5a2e1ea..eac0e3f 100755
--- a/QiaoJiaSystem/build/FaceSearchServer
+++ b/QiaoJiaSystem/build/FaceSearchServer
Binary files differ
diff --git a/QiaoJiaSystem/build/VideoAnalysFromHC b/QiaoJiaSystem/build/VideoAnalysFromHC
index 6343aa6..260d802 100755
--- a/QiaoJiaSystem/build/VideoAnalysFromHC
+++ b/QiaoJiaSystem/build/VideoAnalysFromHC
Binary files differ
diff --git a/QiaoJiaSystem/build/YoloDetectClientTest b/QiaoJiaSystem/build/YoloDetectClientTest
index 216cd5e..3310f97 100755
--- a/QiaoJiaSystem/build/YoloDetectClientTest
+++ b/QiaoJiaSystem/build/YoloDetectClientTest
Binary files differ
diff --git a/QiaoJiaSystem/build/YoloServer b/QiaoJiaSystem/build/YoloServer
index 43d76f7..156a647 100755
--- a/QiaoJiaSystem/build/YoloServer
+++ b/QiaoJiaSystem/build/YoloServer
Binary files differ
diff --git a/QiaoJiaSystem/build/config.json b/QiaoJiaSystem/build/config.json
index f009670..9f0e3e5 100755
--- a/QiaoJiaSystem/build/config.json
+++ b/QiaoJiaSystem/build/config.json
@@ -1,26 +1,26 @@
 {
-  "mainServerIp": "192.168.1.182",
-  "mainServerPort": "3697",
-  "logPath": "/home/basic/work/log/",
-  "DEV_ID": "DSVAD010120181119",
-  "ES_IP": "192.168.1.182",
-  "ES_PORT": 9200,
-  "FaceSeachSleepTime": 60,
-  "TotalLoadSize": "500",
-  "buildAddr": "/home/basic/Apps/QiaoJiaSystem/build/",
-  "cutPath": "/home/basic/work/qiaojia/cut",
-  "erlCookie": "",
-  "erlFatherNode": "",
-  "erlNode": "",
-  "erlPath": "",
-  "loadPath": "/home/basic/work/qiaojia/load",
-  "localPasswd": "123456",
-  "netIfName": "enp3s0",
-  "srsAddr": "rtmp://192.168.1.122:1934/live/",
-  "webPort": 11111,
-  "redis_ip": "127.0.0.1",
-  "redis_buf_len": 750,
-  "encode_thread_num": 2,
-  "FaceDetectionSampleSize": 720,
-  "clusterID" : "sssss"
+   "DEV_ID" : "DSVAD010120181119",
+   "ES_IP" : "192.168.1.182",
+   "ES_PORT" : 9200,
+   "FaceDetectionSampleSize" : 720,
+   "FaceSeachSleepTime" : 60,
+   "TotalLoadSize" : "500",
+   "buildAddr" : "/home/basic/Apps/QiaoJiaSystem/build/",
+   "clusterID" : "sssss",
+   "cutPath" : "/home/basic/work/qiaojia/cut",
+   "encode_thread_num" : 2,
+   "erlCookie" : "",
+   "erlFatherNode" : "",
+   "erlNode" : "",
+   "erlPath" : "",
+   "loadPath" : "/home/basic/work/qiaojia/load",
+   "localPasswd" : "123456",
+   "logPath" : "/home/basic/work/log/",
+   "mainServerIp" : "192.168.1.182",
+   "mainServerPort" : "3697",
+   "netIfName" : "enp3s0",
+   "redis_buf_len" : 750,
+   "redis_ip" : "127.0.0.1",
+   "srsAddr" : "rtmp://192.168.1.122:1934/live/",
+   "webPort" : 11111
 }
diff --git a/QiaoJiaSystem/build/killAll.sh b/QiaoJiaSystem/build/killAll.sh
old mode 100644
new mode 100755
diff --git a/QiaoJiaSystem/build/syncDBClient b/QiaoJiaSystem/build/syncDBClient
index 32115d0..01cc242 100755
--- a/QiaoJiaSystem/build/syncDBClient
+++ b/QiaoJiaSystem/build/syncDBClient
Binary files differ
diff --git a/syncDBTool/ErlangDbTool.cpp b/syncDBTool/ErlangDbTool.cpp
index 173fd83..b42a94b 100755
--- a/syncDBTool/ErlangDbTool.cpp
+++ b/syncDBTool/ErlangDbTool.cpp
@@ -190,7 +190,6 @@
 
     // c erlang init
     erl_init(NULL, 0);
-
     struct in_addr addr;
     addr.s_addr = inet_addr("127.0.0.1");
 
@@ -231,7 +230,6 @@
             std::cout << m_ret << std::endl;
             // 鍒ゆ柇鑺傜偣鏄惁鍚姩鎴愬姛
             m_ret = waitNode();
-//            erl_close_connection(m_fd);
             resetConn();
             return m_ret;
         } else {
@@ -1623,6 +1621,7 @@
             "Select a.uuid as id ,a.faceUrl as img,a.feature,b.idCard as idcard,b.enabled,b.monitorLevel from '" +
             str_tableUuid +
             "_fea' as a ,'" + str_tableUuid + "' as b  where a.uuid = b.uuid and ( a.del_flag=0 AND b.del_flag=0);");
+        //Select a.uuid as id ,a.faceUrl as img,a.feature,b.idCard as idcard,b.enabled,b.monitorLevel from '0cd82a8b-5285-5737-ab19-8c07247c797e_fea' as a ,'0cd82a8b-5285-5737-ab19-8c07247c797e' as b  where a.uuid = b.uuid and ( a.del_flag=0 AND b.del_flag=0);
         QSqlQuery query(g_syncDbFile);
         query.prepare(sql);
         if (!query.exec()) {

--
Gitblit v1.8.0