派生自 development/c++

pansen
2019-03-07 d3b7bbe7102cd089680a828f5d8f6402c8cf6342
QiaoJiaSystem/StructureApp/YoloRpcElement.cpp
@@ -6,24 +6,20 @@
#include <basic/util/opencv/CvUtil.h>
#include <basic/db/Elasticsearch/EsDBTool.h>
#include <uuid/uuid.h>
#include <jsoncpp/json/json.h>
#include <QtCore/QJsonDocument>
#include <QtCore/QJsonObject>
YoloRpcElement::YoloRpcElement(string shareMemoryName) :
YoloRpcElement::YoloRpcElement(std::string shareMemoryName) :
    rpcClient(appPref.getStringData("yolo.proxy"), appPref.getStringData("yolo.ip"),
              appPref.getIntData("yolo.port"), "tcp"), fdfsClient(nullptr), sharedMemory(nullptr),
    m_triggerElement(0, 50), trackingTrigger(nullptr) {
              appPref.getIntData("yolo.port"), "tcp"),
    sharedMemory(nullptr),
    trackingTrigger(nullptr)
{
     trackingTrigger = new TrackingTrigger(0.5);
    sharedMemory = new QSharedMemory(QString(shareMemoryName.c_str()));
//    DBG(shareMemoryName);
    //1520 x 2688   1080 x 1920 //2560 * 1440 * 4
    if (!sharedMemory->create(4608 * 2592 * 4)) {
        sharedMemory->attach();
    }
    trackingTrigger = new TrackingTrigger(0.5);
    try {
        auto server = rpcClient.getServer();
        cocoData = server->getCocoData();
@@ -37,39 +33,65 @@
    if (sharedMemory) {
        delete sharedMemory;
    }
    if (trackingTrigger) {
    if(trackingTrigger)
    {
        delete trackingTrigger;
        trackingTrigger=nullptr;
    }
}
void YoloRpcElement::setImage(const cv::Mat &value)
{
    if (value.size != image.size)
    {
        image = cv::Mat(value.rows, value.cols, CV_8UC3, sharedMemory->data());
    }
    value.copyTo(image);
}
::YoloDetect::ObjInfos YoloRpcElement::getObjects() const
{
    return objs;
}
void YoloRpcElement::threadFunc() {
//    ClockTimer ct("YoloRpcElement::threadFunc");.
    triggerMats.clear();
std::vector<ScoredRect> YoloRpcElement::getLastScoreRects() const {
    return trackingTrigger->getLastScoreRects();
}
 cv::Mat YoloRpcElement::getImage() const
{
    return image;
}
void YoloRpcElement::threadFunc()
{
 //  ClockTimer ct("YoloRpcElement::threadFunc");
        triggerScoredRects.clear();
    try {
        auto server = rpcClient.getServer();
        if (!server) {
            ERR("server is null");
            return;
            auto server = rpcClient.getServer();
            if (!server)
            {
                ERR("server is null");
                return;
            }
            objs = server->YoloDetect(image.cols, image.rows, sharedMemory->key().toStdString());//TODO
        }
        objs = server->YoloDetect(image.cols, image.rows, sharedMemory->key().toStdString());//TODO
        if (objs.size() <= 0) {
            m_triggerElement.setState(false);
            m_triggerElement.triggerOnce(false);
            trackingTrigger->triggerLine();
            return;
        } else {
            m_triggerElement.setState(true);
        catch (std::exception &e)
        {
            ERR(e.what())
        }
        string t_camIdex = getProperty("dev_id") + getProperty("ch_id");
        float t_det_sc =
            appPref.getFloatData(t_camIdex + "yolo.det") == -1 ? 0.75 : appPref.getFloatData(t_camIdex + "yolo.det");
//        int size=objs.size();
//        if(size>30)
//        {
        for (auto &obj: objs) {
//            DBG("size="<<size);
//            return;
//        }
        for (auto &obj: objs)
        {
            if (obj.type != 0)
                continue;
            if (obj.prob < t_det_sc) {
                continue;
            }
            ScoredRect scoredRect;
            int x = obj.rcObj.left * image.cols;
@@ -77,122 +99,29 @@
            int w = (obj.rcObj.right - obj.rcObj.left) * image.cols;
            int h = (obj.rcObj.bottom - obj.rcObj.top) * image.rows;
            scoredRect.rect = cv::Rect(x, y, w, h);
            scoredRect.score = scoredRect.rect.area() > 0 ? obj.prob : 0;
            if (trackingTrigger->triggerOnce(scoredRect)) {
            scoredRect.properties["time"] = getProperty("time");
            scoredRect.properties["imgKey"]=getProperty("imgKey");
            if (trackingTrigger->triggerOnce(scoredRect))
            {
                trackingTrigger->getLastRect().properties["id"] = to_string(scoredRect.id);
                trackingTrigger->getLastRect().properties["type"] = cocoData[obj.type];
                auto t_image = image(scoredRect.rect & cv::Rect(0, 0, image.cols, image.rows)).clone();
                triggerMats.push_back(t_image);
                std::string strImgUrl = "http://";
                if (fdfsClient != nullptr && fdfsClient->fastFds != nullptr) {
                    fdfsClient->rwLock.rdlock();
                    std::vector<unsigned char> buffer;
                    CvUtil::cvMat2Buffer(t_image, buffer);
                    std::string strImgUrlTmp = "";
                    fdfsClient->fastFds->uploadFile(buffer, strImgUrlTmp, "jpg");
                    strImgUrl.append(fdfsClient->fastFds->getIp() + "/" + strImgUrlTmp);
                    strImgUrl.clear();
                    strImgUrl = strImgUrlTmp;
//                    strImgUrl.append("/").append(strImgUrlTmp);
                    fdfsClient->rwLock.unlock();
                }
                //使用的时候将false改为ture
                {
                    //#todo
                    EsDBTool pManagerEsDB(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort"));
                    string str_uuid;
                    uuid_t t_uuid;
                    char str[36];
                    uuid_generate(t_uuid);
                    uuid_unparse(t_uuid, str);
                    str_uuid = str;
//                jsonyolo.insert("HardCamId","");//硬盘摄像机id  ???拿不到
//                jsonyolo.insert("ChannlId","");//通道id ??? 拿不到
//                jsonyolo.insert("Time","");//时间 可以获取当前时间 明确时间是获取当前的还是传过来的  ??? 拿不到
//                jsonyolo.insert("ImgUrl","");//图像img路径  ??? 拿不到
//                jsonyolo.insert("Image","");//快照  ??? 拿不到
//                jsonyolo.insert("DataType",obj.type);//检测的类型
//                jsonyolo.insert("Score",obj.prob);//检测的得分
                    Json::Value t_json;
                    t_json["Id"] = str_uuid; //主键
//#todo
                    t_json["picName"] = "wait todo";
                    t_json["DataType"] = cocoData[obj.type];
                    t_json["Score"] = obj.prob;
                    t_json["personPicUrl"] = "wait todo";//人员图片 store
                    t_json["likeDate"] = AppUtil::getTimeSecString();//比较时间
                    t_json["picAddress"] = getProperty("str_addr");//抓拍地址
                    t_json["picMaxUrl"] = "wait todo";//大图路径
                    t_json["picLocalUrl"] = "wait todo";//本地路径
                    t_json["picSmUrl"] = strImgUrl;//人员抓小图
//                    faceRpcElement.setProperty("frame_number", frame_number);
                    t_json["picDate"] = getProperty("time");
                    t_json["content"] = "wait todo";
                    t_json["viType"] = "2";//只有4种类型 1:personface 2:personbody 3:car 4:bicycle 5:none 未知类型
                    t_json["personIsHub"] = "4";//1: 报警  2: 可疑  3: 安全  4: 未知
                    t_json["videoIp"] = getProperty("local_ip");//当前服务器IP地址
                    t_json["videoNum"] = 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["indeviceid"] = appPref.getStringData("fxDevID");
                    t_json["indevicename"] = appPref.getStringData("fxDevNAME");
                    DBG(t_json.toStyledString());
                    bool retface = false;
                    retface = pManagerEsDB.insertData("yolodet", "info", t_json.toStyledString(), str_uuid);
                    if (retface) {
                        INFO("facedb success");
                    } else {
                        ERR("facedb fail");
                    }
                }
                trackingTrigger->getLastRect().properties["time"] = getProperty("time");
                trackingTrigger->getLastRect().properties["imgKey"]=getProperty("imgKey");
              //  DBG("time)"<<getProperty("time"));
                triggerScoredRects.push_back(trackingTrigger->getLastRect());
            }
        }
        trackingTrigger->triggerLine();
        m_triggerElement.triggerOnce(false);
        if (triggerMats.size() > 0)fireConnectors("YoloTrigger");
//        if(trackingTrigger->getLastScoreRects().size()>20)
//        {
//            DBG("");
//        }
        fireConnectors();
    } catch (std::exception &e) {
        ERR(e.what())
    }
}
::YoloDetect::ObjInfos YoloRpcElement::getObjects() const {
    return objs;
}
bool YoloRpcElement::getTrigger() const {
    return (objs.size() > 0 ? true : false);
}
std::vector<cv::Mat> YoloRpcElement::getTriggerMats() {
    return triggerMats;
}
std::vector<ScoredRect> YoloRpcElement::getLastScoreRects() const {
    return trackingTrigger->getLastScoreRects();
}
void YoloRpcElement::setImage(const cv::Mat &value) {
    if (value.size != image.size) {
        image = cv::Mat(value.rows, value.cols, CV_8UC3, sharedMemory->data());
    }
    value.copyTo(image);
}
bool YoloRpcElement::getTriggerState() const {
    return m_triggerElement.getTriggerState();
}