派生自 development/c++

chenshijun
2019-04-10 b5ac5f7d1e0f79d332dcddc3dabd8709b1e2a2ea
QiaoJiaSystem/StructureApp/FaceExtractElement.cpp
@@ -37,8 +37,8 @@
    faceSearchRpcClient(appPref.getStringData("faceSear.proxy"), appPref.getStringData("faceSear.ip"),
                        appPref.getIntData("faceSear.port"), "tcp"),
//    faceSearchRpcClient("faceCmServer", "", 10004, "tcp")
    m_sdkRule(rule)
{
    m_sdkRule(rule),
    m_rpcClient("RtspAnalysServer", "127.0.0.1", appPref.getIntData("RpcVTIMPort"), "tcp") {
    sharedMemory = new QSharedMemory(QString(shareMemoryName.c_str()));
    if (!sharedMemory->create(4608 * 2592 * 4)) {
        sharedMemory->attach();
@@ -61,10 +61,14 @@
}
void FaceExtractElement::timerFunc() {
//    INFO("MYH Run Here");
    std::vector<FaceToExtract> faceExtractQueueTmp;
    {
        std::lock_guard<std::mutex> lg(imageQueueMutex);
        if (faceExtractQueue.empty())return;
        if (faceExtractQueue.empty()) {
            ERR("faceExtractQueue.empty ");
            return;
        }
        faceExtractQueueTmp.swap(faceExtractQueue);
        faceExtractQueue.clear();
    }
@@ -74,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;
@@ -88,6 +92,20 @@
            auto sharedImage = cv::Mat(image.rows, image.cols, CV_8UC3, sharedMemory->data());
            image.copyTo(sharedImage);
            // 上传大图
            string strBigImgUrl;
            if (fdfsClient != nullptr && fdfsClient->fastFds != nullptr) {
                fdfsClient->rwLock.rdlock();
                std::vector<unsigned char> buffer;
                CvUtil::cvMat2Buffer(image, buffer);
                fdfsClient->fastFds->uploadFile(buffer, strBigImgUrl, "jpg");
                fdfsClient->rwLock.unlock();
            } else {
                strBigImgUrl = "";
                ERR("fdfsClient is nullptr ???");
            }
            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],
@@ -100,12 +118,11 @@
//                    cv::imwrite(string1, image);
//                }
                if (feature.empty()) {
                    ERR("feature is empty");
//                    INFO("No Face Find: " << getProperty("imgKey"));
                    continue;
                }
                features.clear();
                features.emplace_back(feature);
                std::string strImgUrl = "http://";
                if (fdfsClient != nullptr && fdfsClient->fastFds != nullptr) {
                    fdfsClient->rwLock.rdlock();
@@ -113,121 +130,18 @@
                    CvUtil::cvMat2Buffer(faceExtractQueueTmp[i].faceImages[j], buffer);
                    std::string strImgUrlTmp = "";
                    fdfsClient->fastFds->uploadFile(buffer, strImgUrlTmp, "jpg");
                  //  strImgUrl.append(fdfsClient->fastFds->getIp() + "/" + strImgUrlTmp);
                    DBG("strImgUrlTmp="<<strImgUrlTmp);
                    //  strImgUrl.append(fdfsClient->fastFds->getIp() + "/" + strImgUrlTmp);
//                    DBG("strImgUrlTmp=" << strImgUrlTmp);
                    strImgUrl.clear();
                    strImgUrl = strImgUrlTmp;
//                    strImgUrl.append("/").append(strImgUrlTmp);
                    fdfsClient->rwLock.unlock();
                }
                //拼接json
                string str_uuid;
                uuid_t t_uuid;
                char str[36];
                uuid_generate(t_uuid);
                uuid_unparse(t_uuid, str);
                str_uuid = str;
                Json::Value t_json;
                t_json["Id"] = str_uuid; //主键
                //#在对比中添加特征值
                t_json["FaceFeature"] = "base64";
                t_json["personId"] = "wait todo";//关联底库人员id,人脸id
                t_json["BaseName"] = "wait todo";//关联底库表名
                //#end
//                t_json["likePer"] = faceExtractQueueTmp[i].scoredRects[j].score;//人员相似度 Score
                t_json["likeDate"] = AppUtil::getTimeSecString();//"2018-01-01 01:01:01";//比较时间
                t_json["picName"] = "wait todo";
                t_json["personPicUrl"] = "wait todo";//人员图片 store
                t_json["picAddress"] = getProperty("str_addr");//抓拍地址
                  DBG("picAddress="<< t_json["picAddress"] );
                t_json["picMaxUrl"] = "wait todo";//大图路径
                t_json["picLocalUrl"] = "wait todo";//本地路径
                t_json["picSmUrl"] = strImgUrl;//人员抓小图
                //#todo
                t_json["picDate"] = faceExtractQueueTmp[i].scoredRects[j].properties["time"];
                DBG("picDate=" << t_json["picDate"].asString());
//                DBG("timeC ::::B" << t_json["picDate"m_bIsMask].asString());
//                t_json["picDate"] = AppUtil::getTimeSecString();
                t_json["content"] = "wait todo";
                t_json["viType"] = "1";//只有4种类型 1:personface 2:personbody 3:car 4:bicycle 5:none 未知类型
                t_json["personIsHub"] = "4";//1: 报警  2: 可疑  3: 安全  4: 未知
                t_json["cluster_id"] = appPref.getStringData("clusterID");
                t_json["ack_alarm"] = "0";
                //faceExtractElement.setProperty("dev_id", str_device_id);
                //faceExtractElement.setProperty("cg_id", str_ch_id);
                t_json["videoNum"] = getProperty("dev_id");//Video设备编号//getProperty("path");//Vide编号 外键
                t_json["videoReqNum"] = getProperty("dev_id");//Video设备编号
                t_json["ChannlId"] = getProperty("ch_id");//通道id
                t_json["isDelete"] = "1";//默认1 ,0无效 1有效
                //人脸属性
                t_json["Age"] = atoi(
                    faceExtractQueueTmp[i].scoredRects[j].properties["age"].c_str());//检测的年龄  应该为空 无检测结果
                //#todo 优化 get vector<string> from json
                t_json["Gender"] = faceExtractQueueTmp[i].scoredRects[j].properties["gender"];//检测的性别 为空 无检测结果
                switch (atoi(faceExtractQueueTmp[i].scoredRects[j].properties["gender"].c_str())) {
                    case 0:
                        t_json["Gender"] = "女";
                        break;
                    case 1:
                        t_json["Gender"] = "男";
                        break;
                }
                t_json["BeautyLevel"] = faceExtractQueueTmp[i].scoredRects[j].properties["beauty"];//检测的美化水平 为空 无检测结果
                t_json["SimleLevel"] = faceExtractQueueTmp[i].scoredRects[j].properties["smile"];//检测的微笑水平 为空 无检测结果
                t_json["Race"] = "";//检测的种族  应该为空 无检测结果
                t_json["videoIp"] = getProperty("local_ip");//当前服务器IP地址
                t_json["cluster_id"] = appConfig.getStringProperty("clusterID");//集群id
                t_json["ack_alarm"] = "0";//ack_alarm是否报警
                //#todo 优化 get vector<string> from json
                switch (atoi(faceExtractQueueTmp[i].scoredRects[j].properties["race"].c_str())) {
                    case 1:
                        t_json["Race"] = "白人";
                        break;
                    case 2:
                        t_json["Race"] = "黄人";
                        break;
                    case 3:
                        t_json["Race"] = "黑人";
                        break;
                }
//                DBG(t_json.toStyledString());
                t_json["indeviceid"] = appPref.getStringData("fxDevID");
                t_json["indevicename"] = appPref.getStringData("fxDevNAME");
                auto faceSearchServer = faceSearchRpcClient.getServer();
                if (!faceSearchServer) {
                    ERR("faceSearchServer is null");
                    EsDBTool pManagerEsDB(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort"));
                    bool retface = false;
                    retface = pManagerEsDB.insertData("videopersons", "perVideoPicture", t_json.toStyledString(),
                                                      str_uuid);
//                    if (retface) {
//                        INFO("facedb success");
//                    } else {
//                        ERR("facedb fail");
//                    }
                } else {
                    INFO("send faceSearchTopN ");
                    auto faceSearchResults = faceSearchServer->faceSearchTopN(feature, t_json.toStyledString(), 2,
                                                                              t_com_sc);
                    strImgUrl = "";
                    ERR("fdfsClient is nullptr ???");
                }
                InsertToESDB(faceExtractQueueTmp, t_com_sc, i, j, feature, strImgUrl, strBigImgUrl);
            }
        }
    } catch (std::exception &e) {
@@ -236,7 +150,140 @@
    if (!features.empty())fireConnectors();
}
void FaceExtractElement::InsertToESDB(const vector<FaceToExtract> &faceExtractQueueTmp, float t_com_sc, int i, int j,
                                      FaceDetect::Data &feature, string &strImgUrl, string &strBigImgUrl) {
    //拼接json
    string str_uuid;
    uuid_t t_uuid;
    char str[36];
    uuid_generate(t_uuid);
    uuid_unparse(t_uuid, str);
    str_uuid = str;
    Json::Value t_json;
    t_json["Id"] = str_uuid; //主键
    string feature_base64;
    feature_base64 = base64.Encode(feature.data(), feature.size());
    //#在对比中添加特征值
    t_json["FaceFeature"] = feature_base64;
    t_json["personId"] = "";//关联底库人员id,人脸id
    t_json["BaseName"] = "";//关联底库表名
//#end
//                t_json["likePer"] = faceExtractQueueTmp[i].scoredRects[j].score;//人员相似度 Score
    t_json["likeDate"] = AppUtil::getTimeSecString();//"2018-01-01 01:01:01";//比较时间
    t_json["picName"] = "";
    t_json["personPicUrl"] = "";//人员图片 store
    t_json["picAddress"] = getProperty("str_addr");//抓拍地址
    DBG("picAddress=" << t_json["picAddress"]);
    t_json["picMaxUrl"] = strBigImgUrl;//大图路径
    t_json["picLocalUrl"] = "";//本地路径
    t_json["picSmUrl"] = strImgUrl;//人员抓小图
//#todo
    t_json["picDate"] = faceExtractQueueTmp[i].scoredRects[j].properties["time"];
    DBG("picDate=" << t_json["picDate"].asString());
//                DBG("timeC ::::B" << t_json["picDate"m_bIsMask].asString());
//                t_json["picDate"] = AppUtil::getTimeSecString();
    t_json["content"] = "";
    //t_json["viType"] = "2";//只有4种类型 1:personface 2:personbody 3:car 4:bicycle 5:none 未知类型
    t_json["sdkType"] = to_string(
        m_sdkRule.nSdkType);//只有4种类型 1:personface 2:personbody 3:car 4:bicycle 5:none 未知类型
    t_json["personIsHub"] = "4";//1: 报警  2: 可疑  3: 安全  4: 未知
    t_json["cluster_id"] = appPref.getStringData("clusterID");
    t_json["ack_alarm"] = "0";
    //faceExtractElement.setProperty("dev_id", str_device_id);
//faceExtractElement.setProperty("cg_id", str_ch_id);
    t_json["videoNum"] = getProperty("dev_id");//Video设备编号//getProperty("path");//Vide编号 外键
    t_json["videoReqNum"] = getProperty("dev_id");//Video设备编号
    t_json["ChannlId"] = getProperty("ch_id");//通道id
    t_json["isDelete"] = "1";//默认1 ,0无效 1有效
    //人脸属性
    t_json["Age"] = atoi(
        faceExtractQueueTmp[i].scoredRects[j].properties["age"].c_str());//检测的年龄  应该为空 无检测结果
    //#todo 优化 get vector<string> from json
    t_json["Gender"] = faceExtractQueueTmp[i].scoredRects[j].properties["gender"];//检测的性别 为空 无检测结果
    switch (atoi(faceExtractQueueTmp[i].scoredRects[j].properties["gender"].c_str())) {
        case 0:
            t_json["Gender"] = "女";
            break;
        case 1:
            t_json["Gender"] = "男";
            break;
    }
    t_json["BeautyLevel"] = faceExtractQueueTmp[i].scoredRects[j].properties["beauty"];//检测的美化水平 为空 无检测结果
    t_json["SimleLevel"] = faceExtractQueueTmp[i].scoredRects[j].properties["smile"];//检测的微笑水平 为空 无检测结果
    t_json["Race"] = "";//检测的种族  应该为空 无检测结果
    t_json["videoIp"] = getProperty("local_ip");//当前服务器IP地址
    t_json["cluster_id"] = appConfig.getStringProperty("clusterID");//集群id
    t_json["ack_alarm"] = "0";//ack_alarm是否报警
    //#todo 优化 get vector<string> from json
    switch (atoi(faceExtractQueueTmp[i].scoredRects[j].properties["race"].c_str())) {
        case 1:
            t_json["Race"] = "白人";
            break;
        case 2:
            t_json["Race"] = "黄人";
            break;
        case 3:
            t_json["Race"] = "黑人";
            break;
    }
//                DBG(t_json.toStyledString());
    t_json["indeviceid"] = appPref.getStringData("fxDevID");
    t_json["indevicename"] = appPref.getStringData("fxDevNAME");
    string strImageKey = faceExtractQueueTmp[i].scoredRects[j].properties["imgKey"];
    INFO("SaveImageKey To ES: " << strImageKey);
    t_json["imgKey"] = strImageKey;
    try {
        auto server = m_rpcClient.getServer();
        if (!server) {
            ERR("server is null");
            //return;
        }
        INFO("Record Video " << strImageKey);
        server->recordVideo(strImageKey);
    } catch (exception &e) {
        ERR("Record Video Err: " << strImageKey << "   Message: " << e.what());
        //return;
    }
    auto faceSearchServer = faceSearchRpcClient.getServer();
    if (!faceSearchServer) {
        ERR("faceSearchServer is null");
        EsDBTool pManagerEsDB(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort"));
        bool retface = false;
        retface = pManagerEsDB.insertData("videopersons", "perVideoPicture", t_json.toStyledString(),
                                          str_uuid);
//                    if (retface) {
//                        INFO("facedb success");
//                    } else {
//                        ERR("facedb fail");
//                    }
    } else {
        INFO("send faceSearchTopN ");
        auto faceSearchResults = faceSearchServer->faceSearchTopN(feature, t_json.toStyledString(), 2,
                                                                  t_com_sc);
    }
}
std::vector<::FaceDetect::Data> FaceExtractElement::getFeatures() const {
    return features;
}