派生自 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
#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>
 
 
YoloRpcElement::YoloRpcElement(std::string shareMemoryName) :
    rpcClient(appPref.getStringData("yolo.proxy"), appPref.getStringData("yolo.ip"),
              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();
    }
 
    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;
        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;
}
 
 
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;
            }
            objs = server->YoloDetect(image.cols, image.rows, sharedMemory->key().toStdString());//TODO
        }
        catch (std::exception &e)
        {
            ERR(e.what())
        }
//        int size=objs.size();
//        if(size>30)
//        {
 
//            DBG("size="<<size);
//            return;
//        }
 
        for (auto &obj: objs)
        {
            if (obj.type != 0)
                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;
            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];
                trackingTrigger->getLastRect().properties["time"] = getProperty("time");
                trackingTrigger->getLastRect().properties["imgKey"]=getProperty("imgKey");
              //  DBG("time)"<<getProperty("time"));
                triggerScoredRects.push_back(trackingTrigger->getLastRect());
            }
        }
        trackingTrigger->triggerLine();
//        if(trackingTrigger->getLastScoreRects().size()>20)
//        {
//            DBG("");
//        }
        fireConnectors();
}