pansen
2019-04-09 a69649804af1cdef936258aab4a5f719cdb32154
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
//
// Created by ps on 19-4-9.
//
 
#include <basic/debug/Debug.h>
#include "VptDetectWrapper.h"
 
VptDetectWrapper::VptDetectWrapper() {
    init();
}
 
VptDetectWrapper::VptDetectWrapper(int _gpuIdx, string _dbFilePath) : m_gpuIdx(_gpuIdx),
                                                                      m_dbFilePath(_dbFilePath) {
    init();
}
 
VptDetectWrapper::~VptDetectWrapper() {
    vpt_pic_release(&m_handle);
}
 
void VptDetectWrapper::init() {
    m_param.mode = DEVICE_GPU;
    m_param.gpuid = m_gpuIdx;
    m_param.hp_recg_config = SY_CONFIG_OPEN;
    m_param.hcp_recg_config = SY_CONFIG_OPEN;
    m_param.vehicle_color_config = SY_CONFIG_OPEN;
    m_param.vehicle_recg_config = SY_CONFIG_OPEN;
    m_param.vehicle_pendant_det_recg_config = SY_CONFIG_OPEN;
    m_param.dbPath = const_cast<char *>(m_dbFilePath.data());
    m_param.log = SY_CONFIG_OPEN;
    vpt_pic_init(&m_handle, m_param);
}
 
void VptDetectWrapper::process_image(cv::Mat &_img) {
    m_results.clear();
 
    sy_img img;
    img.set_data(_img.cols, _img.rows, _img.channels(), _img.data);
 
    vptpic_result result;
    result.info = new vptobj_info[MAX_DET_COUNT];
 
    int ret = vpt_pic_process(m_handle, img, &result);
 
 
    int size = result.count;
    for (int i = 0; i < size; i++) {
 
        char str_i[100];
        int colorIndex = result.info[i].obj_index;
 
        if (colorIndex < 0 || colorIndex >= 9)continue;
//        sprintf(str_i, "%s:%.2f", type[colorIndex].c_str(), result.info[i].obj_score);
 
//        rectangle(process_image,
//                  cvPoint(result.info[i].obj_rect.left_ - 5, result.info[i].obj_rect.top_ - 15),
//                  cvPoint(result.info[i].obj_rect.left_ + result.info[i].obj_rect.width_ + 5,
//                          result.info[i].obj_rect.top_ + result.info[i].obj_rect.height_ + 10),
//                  cv::Scalar(color[colorIndex][0], color[colorIndex][1], color[colorIndex][2]), 3, 1);
//
//        cv::putText(process_image, str_i,
//                    cv::Point(result.info[i].obj_rect.left_, result.info[i].obj_rect.top_),
//                    fontFace, fontScale,
//                    cv::Scalar(color[colorIndex][0], color[colorIndex][1], color[colorIndex][2]), thickness, 8);
 
        //输出二次属性分析结果
        if (result.info[i].analysis_res != NULL) {
            m_results.emplace_back(std::move(changeAnalysisRes(colorIndex, result.info[i].analysis_res)));
            m_results.back().bskRect.setRect(result.info[i].obj_rect.left_, result.info[i].obj_rect.top_,
                                             result.info[i].obj_rect.width_, result.info[i].obj_rect.height_);
        } else {}
    }
    DBG(m_results.size());
}
 
VptDetectResults VptDetectWrapper::changeAnalysisRes(int index, void *result) {
 
    VptDetectResults vptDetectResults;
    vptDetectResults.sdkDetectType = static_cast<SDKDetectType>(index);
//    vptDetectResults.vptDetectRes.carDetectRes;
    switch (vptDetectResults.sdkDetectType) {
        case SDKDetectType::person : {
            hp_res *cur_res = (hp_res *) result;
            memcpy(vptDetectResults.vptDetectRes.personDetectRes.res_objs, cur_res->res_objs,
                   sizeof(classfy_boj_res) * HP_FIR_INDEX_SIZE);
            //test code
            for (int i = 0; i < HP_FIR_INDEX_SIZE; i++) {
                int resIndex = vptDetectResults.vptDetectRes.personDetectRes.res_objs[i].res_index;
                cout << vptDetectResults.vptDetectRes.personDetectRes.res_objs[i].res_prob << "  ";
                cout << HpResStr[i][resIndex] << " " << endl;
            }
            //test code end
        };
            break;
        case SDKDetectType::bike:
        case SDKDetectType::motor : {
            hcp_res *cur_res = (hcp_res *) result;
            memcpy(vptDetectResults.vptDetectRes.perRideCarDetectRes.res_objs, cur_res->res_objs,
                   sizeof(classfy_boj_res) * HCP_FIR_INDEX_SIZE);
            for (int i = 0; i < HCP_FIR_INDEX_SIZE; i++) {
                int resIndex = vptDetectResults.vptDetectRes.perRideCarDetectRes.res_objs[i].res_index;
                cout << vptDetectResults.vptDetectRes.perRideCarDetectRes.res_objs[i].res_prob << "  ";
                cout << HpResStr[i][resIndex] << " " << endl;
            }
            cout << endl << endl;
        };
            break;
        case SDKDetectType::car :
        case SDKDetectType::bigbus :
        case SDKDetectType::lorry :
        case SDKDetectType::midibus : {
            vehicle_res *cur_res = (vehicle_res *) result;
            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 (cur_res->vr_res.vehicle_brand != NULL) {
//                cout << "  车辆品牌 - " << cur_res->vr_res.vehicle_brand << endl;
                carRes.vehicle_brand = std::move(string(cur_res->vr_res.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 = std::move(string(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 = std::move(string(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 = std::move(string(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 = std::move(string(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;
 
                for (int m = 0; m < 7; m++) {
//                    printf("%s", cur_res->vp_res.recg[m].character);
                    carRes.carPlate.append(cur_res->vp_res.recg[m].character);
                }
                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;
    }
    return vptDetectResults;
}