main.cpp
11.4 KB
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
#include "../village_pic_interface.h"
#include <vector>
#include <string>
#include <iostream>
#include <dirent.h>
#include<fstream>
#include "../utils/logger.hpp"
#include "../utils/DeviceUtil.hpp"
using namespace std;
void show_result(std::vector<AnalysisResult> r, vector<string> vec_path);
void GetFileNames(string path,vector<string>& filenames)
{
DIR *pDir;
struct dirent* ptr;
if(!(pDir = opendir(path.c_str()))){
cout<<"Folder doesn't Exist!"<<endl;
return;
}
while((ptr = readdir(pDir))!=0) {
if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0){
filenames.push_back(path + "/" + ptr->d_name);
}
}
closedir(pDir);
}
vector<string> GetFilesFromFile(string file_path){
vector<string> vec_files;
fstream infile(file_path);
string text;
while (getline(infile, text)){
// text.erase(text.size() - 1, 1);
vec_files.push_back(text);
}
infile.close();
return vec_files;
}
int main() {
void *vaHandle = NULL;
VillageParam param;
param.dev_id = 0;
param.sdk_path = ".";
param.log_level = 1;
string log_path = param.log_path + "/main.log";
set_default_logger(LogLevel(param.log_level), "PicAnalysis", log_path.c_str(), param.log_mem, param.log_days);
int ret = village_pic_init(&vaHandle, param);
// vector<string> vec_path;
// size_t i = 0;
// // for (i = 1; i < 8; i++)
// {
// string path = "./img/test_road";
// path = path + to_string(i) + ".jpg";
// vec_path.push_back(path);
// }
vector<string> vec_path;
// GetFileNames("/home/share/data/villiage_test/test3", vec_path);
// vec_path = GetFilesFromFile("./files1.log");
{
string path = "/home/share/data/villiage_test/test3/192.168.10.67_01_20230601160330100_15.jpg";
vec_path.push_back(path);
}
size_t last_recoder = 0;
int index = 0;
int max_value = vec_path.size();
// while (true)
{
// for (size_t i = 0; i < vec_path.size(); i++)
{
int first_index = rand() % max_value;
int second_index = rand() % max_value;
vector<string> vec_file_name;
vec_file_name.push_back(vec_path[first_index]);
// vec_file_name.push_back(vec_path[second_index]);
std::vector<AnalysisResult> result = village_pic_analysis_file(vaHandle, vec_file_name);
show_result(result, vec_path);
size_t cur_recoder = GetDeviceMem(0);
if (cur_recoder > last_recoder)
{
// LOG_INFO("memesize cur: {} last:{} file:{} file:{}", cur_recoder, last_recoder, vec_path[first_index], vec_path[second_index]);
LOG_INFO("memesize cur: {} last:{} ", cur_recoder, last_recoder);
}
last_recoder = cur_recoder;
}
// LOG_INFO("第{}次完成:{}", index, vec_path.size());
LOG_INFO("第{}次完成", index);
index++;
}
village_pic_release(&vaHandle);
return 0;
}
static string shot_type[] = {"head", "rear", "motor", "tricycle", "body", "body_nova", "6-行人"};
static string vehicle_type[] = {"person 人", " bike 自行车", "motor 摩托车", "tricycle 三轮车", "car 汽车", "bigbus 大巴", "lorry 货车", "tractor 拖拉机", "midibus 面包/中巴"};
static string plate_status[] = {"无车牌", " 正常车牌", " 遮挡车牌"};
static string plate_type[] = {"0-单排蓝色 ", "1-单排黄色 ", "2-单排白色 ", "3-单排黑色", " 4-双排黄色 ", "5-双排白色 ", "6-新能源黄绿色 ", "7-新能源白绿色"};
static string human_color[] = {"棕", "橙", "灰", "白", "粉", "紫", "红", "绿", "蓝", "银", "青", "黄", "黑","多色", "其他"};
static string line_cls[] = {"未知", "黄实线", " 白实线", "白虚线", "黄虚线", "车道中线"};
static string seg_cls[] = {"未知","行车道/机动车道", "非机动车道", "应急车道", "导流线", "人行横道", "禁停区域", "十字路口区域", "农村道路"};
uint8_t seg_colors[][3] = { {0, 0, 0}, {0, 255, 255}, {128, 255, 0}, {255, 128, 0}, {128, 0, 255}, {255, 0, 128}, {0, 128, 255}, {0, 255, 128}, {128, 255, 255}};
void show_result(std::vector<AnalysisResult> result, vector<string> vec_path){
cv::Mat image = cv::imread(vec_path[0]);
for (size_t i = 0; i < result.size(); i++)
{
LOG_INFO("-------------------------------------------第{}张图---------------------------------------------", i);
std::vector<VehicleInfo> info = result[i].info;
for (size_t j = 0; j < info.size(); j++)
{
auto plate_info = info[j].vehicle_plate_det_recg_res;
std::vector<pendant_info> pendant_res = info[j].vehicle_pendant_det_res;
cv::Rect rc;
rc.x = info[j].vehicle_body_detect_res.rect.left_;
rc.y = info[j].vehicle_body_detect_res.rect.top_;
rc.width = info[j].vehicle_body_detect_res.rect.width_;
rc.height = info[j].vehicle_body_detect_res.rect.height_;
const cv::Scalar color(seg_colors[j][0], seg_colors[j][1], seg_colors[j][2]);
cv::rectangle(image, rc, color);
auto taken_info = info[j].manned_res;
for (size_t k= 0; k < taken_info.hs_count; k++)
{
cv::Rect rc;
rc.x = taken_info.hs_rect[k].rect.left_;
rc.y = taken_info.hs_rect[k].rect.top_;
rc.width = taken_info.hs_rect[k].rect.width_;
rc.height = taken_info.hs_rect[k].rect.height_;
const cv::Scalar color(255, 255, 255);
cv::rectangle(image, rc, color);
}
LOG_INFO("----------------{}---------------", j);
LOG_INFO("位置特征");
LOG_INFO(" 车辆位置:{},{},{},{}", info[j].vehicle_body_detect_res.rect.left_ ,info[j].vehicle_body_detect_res.rect.top_, info[j].vehicle_body_detect_res.rect.width_, info[j].vehicle_body_detect_res.rect.height_);
LOG_INFO(" 拍摄方向:{}", shot_type[info[j].type]);
LOG_INFO("目标类型:{}", vehicle_type[info[j].vpt_type]);
if (info[j].vpt_type > 0)
{
LOG_INFO("车辆特征");
if (plate_info.stain_vp_result.type >= 0 && plate_info.stain_vp_result.type <= 2) {
LOG_INFO(" 号牌状态:{}", plate_status[plate_info.stain_vp_result.type]);
}else {
LOG_INFO(" 号牌状态:未知");
}
LOG_INFO(" 号牌位置:{},{},{},{}", plate_info.rect.left_, plate_info.rect.top_, plate_info.rect.width_, plate_info.rect.height_ );
if (plate_info.type >= 0) {
LOG_INFO(" 号牌种类:{} {}", plate_type[plate_info.type], plate_info.type);
} else {
LOG_INFO(" 号牌种类:未知", plate_type[plate_info.type], plate_info.type);
}
LOG_INFO(" 号牌号码:{}{}{}{}{}{}{}{}", plate_info.recg[0].character, plate_info.recg[1].character, plate_info.recg[2].character, plate_info.recg[3].character, plate_info.recg[4].character, plate_info.recg[5].character, plate_info.recg[6].character, plate_info.recg[7].character);
LOG_INFO(" 号牌可信度:{}", plate_info.detect_score);
LOG_INFO(" 每位号牌可信度: {}:{} {}:{} {}:{} {}:{} {}:{} {}:{} {}:{} {}:{}", plate_info.recg[0].character, plate_info.recg[0].maxprob, plate_info.recg[1].character, plate_info.recg[1].maxprob, plate_info.recg[2].character, plate_info.recg[2].maxprob, plate_info.recg[3].character, plate_info.recg[3].maxprob, plate_info.recg[4].character, plate_info.recg[4].maxprob, plate_info.recg[5].character, plate_info.recg[5].maxprob, plate_info.recg[6].character, plate_info.recg[6].maxprob, plate_info.recg[7].character, plate_info.recg[7].maxprob);
LOG_INFO(" 车辆类型分类:{}", vehicle_type[info[j].vpt_type]);
} else {
LOG_INFO("行人特征");
LOG_INFO(" 上衣颜色:{}", human_color[info[j].human_upper_color]);
LOG_INFO(" 下衣颜色:{}", human_color[info[j].human_lower_color]);
}
if (pendant_res.size() > 0)
{
LOG_INFO("驾乘人员特征");
for (size_t k = 0; k < pendant_res.size(); k++)
{
auto one_pendant = pendant_res[k];
LOG_INFO(" 位置信息:{},{},{},{}", one_pendant.rect.left_, one_pendant.rect.top_, one_pendant.rect.width_, one_pendant.rect.height_ );
LOG_INFO(" 可信度:{}", one_pendant.confidence);
LOG_INFO(" 衣着颜色:{}", human_color[one_pendant.iColor]);
}
}
LOG_INFO("违法行为特征");
LOG_INFO(" 不戴头盔:{} 置信度:{}", info[j].mta_res.motor_driver_helmeted.status, info[j].mta_res.motor_driver_helmeted.confidence);
LOG_INFO(" 违法载人:{}", info[j].motor_manned);
LOG_INFO(" 加装雨棚:{} {}", info[j].rainshed, info[j].rainshed_prob);
LOG_INFO(" 使用手机:{} {}", info[j].phoning, info[j].phoning_prob);
LOG_INFO(" 逆行:{}", info[j].reverse_driving);
LOG_INFO(" 货厢载人:{}", info[j].truck_manned);
LOG_INFO(" 违反禁止标线 压实线:{} 压导流线:{}", info[j].cross_line, info[j].cross_diversion_line);
}
LOG_INFO("标线信息");
std::vector<LineInfo> vec_line = result[i].vec_line;
for (size_t i = 0; i < vec_line.size(); i++)
{
LineInfo one_line = vec_line[i];
LOG_INFO(" 标线类型:{}", line_cls[one_line.line_type]);
string str_line = "";
const cv::Scalar color(seg_colors[i][0], seg_colors[i][1], seg_colors[i][2]);
size_t j = 0;
for (; j < one_line.vec_pt.size() - 1; j++)
{
cv::line(image, one_line.vec_pt[j], one_line.vec_pt[j+1], color, 2, 8);
str_line += to_string(one_line.vec_pt[j].x)+","+to_string(one_line.vec_pt[j].y) + "_";
}
str_line += to_string(one_line.vec_pt[j].x)+","+to_string(one_line.vec_pt[j].y) + "_";
LOG_INFO(" 标线点集:{}", str_line);
}
std::vector<std::vector<cv::Point> > polys;
std::vector<SegInfo> vec_road = result[i].vec_road;
for (size_t i = 0; i < vec_road.size(); i++)
{
SegInfo one_seg = vec_road[i];
LOG_INFO(" 车道类型:{}", seg_cls[one_seg.seg_type]);
string str_line = "";
for (size_t j = 0; j < one_seg.vec_pt.size(); j++)
{
str_line += to_string(one_seg.vec_pt[j].x)+","+to_string(one_seg.vec_pt[j].y) + "_";
}
// polys.push_back(one_seg.vec_pt);
const cv::Scalar color(seg_colors[i][0], seg_colors[i][1], seg_colors[i][2]);
cv::polylines(image, one_seg.vec_pt, true, color, 3);
// cv::fillPoly(image, one_seg.vec_pt, color);
LOG_INFO(" 车道点集:{}", str_line);
}
// const cv::Scalar color(0, 0, 255);
// cv::fillPoly(image, polys, color);
}
cv::imwrite("./show_result.jpg", image);
image.release();
}