Blame view

src/reprocessing_module/snapshot_reprocessing.cpp 6.44 KB
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
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
  #include "snapshot_reprocessing.h"
  
  #include "../common/logger.hpp"
  #include "../ai_platform/mvpt_process_assist.h"
  #include "../decoder/interface/DeviceMemory.hpp"
  
  
  snapshot_reprocessing::snapshot_reprocessing()
  {
  	m_task_param_manager = task_param_manager::getInstance();
  
  	algor_index_table["human"] = { (int)det_class_label_t::HUMAN };
  	algor_index_table["nonmotor_vehicle"] = { (int)det_class_label_t::BICYCLE, (int)det_class_label_t::MOTOCYCLE, (int)det_class_label_t::TRICYCLE };
  	algor_index_table["vehicle"] = { (int)det_class_label_t::SMALL_CAR, (int)det_class_label_t::LARGE_CAR, (int)det_class_label_t::TRUCK, (int)det_class_label_t::TRACTOR, (int)det_class_label_t::MEDIUM_BUS };
  }
  
  static void box_expansion(video_object_info& obj_info, float expand_ratio, int frame_width, int frame_height){
  	int origin_width = obj_info.right - obj_info.left;
  	int origin_height = obj_info.bottom - obj_info.top;
  
  	int expansion_width = origin_width * expand_ratio;
  	int expansion_height = origin_height * expand_ratio;
  
  	obj_info.left = max(obj_info.left - expansion_width, 0);
  	obj_info.top = max(obj_info.top - expansion_height, 0);
  	obj_info.right = min(obj_info.right + expansion_width, frame_width - 1);
  	obj_info.bottom = min(obj_info.bottom + expansion_height, frame_height - 1);
  }
  
  /* 获取人车物目标快照图 */
  vector<multi_obj_data_t> snapshot_reprocessing::get_vehicle_snapshot(vector<DeviceMemory*> vec_devMem, vector<onelevel_det_result>& ol_det_result, int skip_frame)
  {
  	vector<string> task_in_play_id;
  	sy_img* images;
  
  	// 过滤出车辆
  	filter_vehicle(vec_devMem, ol_det_result);
  
  	map<string, algor_open_config_param> && algor_config_param = m_task_param_manager->get_task_algor_params();
  	map<string, map<algo_type, task_param_manager::algo_param_type_t_*>> && algor_param = m_task_param_manager->get_task_other_params();
  
  	vector<multi_obj_data_t> results;
  	int idx = 0;
  	for (auto memPtr : vec_devMem)
  	{
  		string task_id = memPtr->getId();
  		map<string, std::vector<video_object_info>> taskid_to_obj;
  		if (algor_config_param.count(task_id) && algor_config_param[task_id].vehicle_algors.count(algorithm_type_t::VEHICLE_SNAPSHOT))
  		{
  			task_param_manager::algo_param_type_t_* cur_task_params = algor_param[task_id][algorithm_type_t::VEHICLE_SNAPSHOT];
  
  			// 同一目标间隔多少帧保存
  			int snap_frame_interval = ((algor_config_param_snapshot*)cur_task_params->algor_param)->snap_frame_interval;
  
  			onelevel_det_result &cur_task_ol_detres = ol_det_result[idx];
  
  			for (int c = 0; c < cur_task_ol_detres.obj_count; c++)
  			{
  				det_objinfo det_obj = cur_task_ol_detres.obj[c];
  				if(snap_frame_interval > 0 && det_obj.num % snap_frame_interval >= skip_frame){
  					continue;
  				}
  				int type_index = det_obj.index; 
  				if ((type_index == 4 || type_index == 5 || type_index == 6 || type_index ==7 || type_index ==8)
  					&& snapshot_legal_inarea(cur_task_params->basic_param->algor_valid_rect, det_obj.left, det_obj.top, det_obj.right, det_obj.bottom))
  				{
  					video_object_info obj_info;
  					obj_info.top = det_obj.top;
  					obj_info.left = det_obj.left;
  					obj_info.right = det_obj.right;
  					obj_info.bottom = det_obj.bottom;
  					obj_info.confidence = det_obj.confidence;
  					obj_info.index = type_index;
  					obj_info.object_id = det_obj.id;
  
  					int frame_height = memPtr->getHeight();
  					int frame_width = memPtr->getWidth();
  					box_expansion(obj_info, EXPANSION_PROPORTION, frame_width, frame_height);
  
  					taskid_to_obj[task_id].emplace_back(std::move(obj_info));
  				}
  			}
  
  			if (taskid_to_obj.size() > 0)
  			{
  				static long long gid_ = 0;
  
  				multi_obj_data_t data;
  				data.memPtr = memPtr; // modified byzsh
  				data.task_id = task_id;
  				data.objs = std::move(taskid_to_obj[task_id]);
  				data.id = gid_++;
  				results.emplace_back(std::move(data));
  				LOG_TRACE("{} {} snap_frame_interval:{}", task_id.c_str(), (int)algorithm_type_t::VEHICLE_SNAPSHOT, snap_frame_interval);
  			}
  		}
  
  		idx++;
  	}
  	return results;
  }
  
  void snapshot_reprocessing::screen_effective_snapshot(const vector<string> &taskid_inplay, vector<onelevel_det_result> &_onelevel_det_result){
  	map<string, algor_open_config_param> algor_param = m_task_param_manager->get_task_algor_params();
  
  	int task_count = _onelevel_det_result.size();
  
  	int task_idx = 0;
  
  	for (auto taskid : taskid_inplay)
  	{
  		int effective_count = 0;
  		int effective_idx = 0;
  
  		det_objinfo *tmp_det_objinfo = _onelevel_det_result[task_idx].obj;
  
  		for (int c = 0; c < _onelevel_det_result[task_idx].obj_count; c++)
  		{
  			// if (algor_index_table["human"].find(tmp_det_objinfo[c].index) != algor_index_table["human"].end()
  			// 	&& (!algor_param[taskid].human_algors.empty() || !algor_param[taskid].human_face_algors.empty()))  // 此处行人和人脸存在耦合,若同一路任务配置了人脸没有配置行人,存抓拍图时会出错
  			if (algor_index_table["human"].find(tmp_det_objinfo[c].index) != algor_index_table["human"].end()
  				&& (!algor_param[taskid].human_algors.empty())) // modified by zsh 220714
  			{
  				tmp_det_objinfo[effective_idx++] = tmp_det_objinfo[c];
  				effective_count++;
  			}
  
  			if (algor_index_table["nonmotor_vehicle"].find(tmp_det_objinfo[c].index) != algor_index_table["nonmotor_vehicle"].end()
  				&& !algor_param[taskid].nonmotor_vehicle_algors.empty())
  			{
  				tmp_det_objinfo[effective_idx++] = tmp_det_objinfo[c];
  				effective_count++;
  			}
  
  			if (algor_index_table["vehicle"].find(tmp_det_objinfo[c].index) != algor_index_table["vehicle"].end()
  				&& !algor_param[taskid].vehicle_algors.empty())
  			{
  				tmp_det_objinfo[effective_idx++] = tmp_det_objinfo[c];
  				effective_count++;
  			}
  		}
  
  		_onelevel_det_result[task_idx++].obj_count = effective_count;
  	}
  }
  
  void snapshot_reprocessing::filter_vehicle(vector<DeviceMemory*> vec_devMem, vector<onelevel_det_result> &_onelevel_det_result){
  	map<string, algor_open_config_param> algor_param = m_task_param_manager->get_task_algor_params();
  
  	int task_idx = 0;
  
  	for (auto memPtr : vec_devMem){
  		string taskid = memPtr ->getId();
  
  		int effective_count = 0;
  		int effective_idx = 0;
  
  		det_objinfo *tmp_det_objinfo = _onelevel_det_result[task_idx].obj;
  
  		for (int c = 0; c < _onelevel_det_result[task_idx].obj_count; c++)
  		{
  			if (algor_index_table["vehicle"].find(tmp_det_objinfo[c].index) != algor_index_table["vehicle"].end()
  				&& !algor_param[taskid].vehicle_algors.empty())
  			{
  				tmp_det_objinfo[effective_idx++] = tmp_det_objinfo[c];
  				effective_count++;
  			}
  		}
  
  		_onelevel_det_result[task_idx].obj_count = effective_count;
  		task_idx++;
  	}
  }