#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 snapshot_reprocessing::get_vehicle_snapshot(vector vec_devMem, vector& ol_det_result, int skip_frame) { vector task_in_play_id; sy_img* images; // 过滤出车辆 filter_vehicle(vec_devMem, ol_det_result); map && algor_config_param = m_task_param_manager->get_task_algor_params(); map> && algor_param = m_task_param_manager->get_task_other_params(); vector results; int idx = 0; for (auto memPtr : vec_devMem) { string task_id = memPtr->getId(); map> 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 &taskid_inplay, vector &_onelevel_det_result){ map 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 vec_devMem, vector &_onelevel_det_result){ map 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++; } }