派生自 development/c++

pansen
2019-03-07 d3b7bbe7102cd089680a828f5d8f6402c8cf6342
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "YoloRpcElement.h"
#include <basic/util/app/AppPreference.hpp>
#include <QtCore/QSharedMemory>
#include <QtCore/QString>
#include <basic/timer_counter/Clocktimer.h>
#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) :
    rpcClient(appPref.getStringData("yolo.proxy"), appPref.getStringData("yolo.ip"),
              appPref.getIntData("yolo.port"), "tcp"), fdfsClient(nullptr), sharedMemory(nullptr),
    m_triggerElement(0, 50), trackingTrigger(nullptr) {
    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();
    }
    catch (std::exception &e) {
        ERR(e.what())
    }
}
 
YoloRpcElement::~YoloRpcElement() {
    if (sharedMemory) {
        delete sharedMemory;
    }
    if (trackingTrigger) {
        delete trackingTrigger;
    }
}
 
void YoloRpcElement::threadFunc() {
    ClockTimer ct("YoloRpcElement::threadFunc");
    triggerMats.clear();
    try {
        auto server = rpcClient.getServer();
        if (!server) {
            ERR("server is null");
            return;
        }
        objs = server->YoloDetect(image.cols, image.rows, sharedMemory->key().toStdString());//TODO
 
        DBG("objs size is " << objs.size());
        if (objs.size() <= 0) {
            m_triggerElement.setState(false);
            m_triggerElement.triggerOnce(false);
            trackingTrigger->triggerLine();
            return;
        } else {
            m_triggerElement.setState(true);
        }
        string t_camIdex = getProperty("dev_id") + getProperty("ch_id");
        float t_det_sc = 0.75;
//            appPref.getFloatData(t_camIdex + "yolo.det") == -1 ? 0.75 : appPref.getFloatData(t_camIdex + "yolo.det");
 
        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;
            int y = obj.rcObj.top * image.rows;
            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)) {
                trackingTrigger->getLastRect().properties["id"] = to_string(scoredRect.id);
                trackingTrigger->getLastRect().properties["type"] = cocoData[obj.type];
                trackingTrigger->getLastRect().properties["score"] = to_string(scoredRect.score);
                auto t_image = image(scoredRect.rect & cv::Rect(0, 0, image.cols, image.rows)).clone();
                triggerMats.push_back(t_image);
            }
        }
        trackingTrigger->triggerLine();
        m_triggerElement.triggerOnce(false);
        if (triggerMats.size() > 0)fireConnectors("YoloTrigger");
        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();
}