#include "MSRegionSurveilanceCpu.h" int IRegionSurveillanceCpu::rs_init(const rs_param ¶m) { return IReginCpu->RSinit(param.image.w_, param.image.h_, param.image.w_, (unsigned char*)(param.image.data_), 1/*param.image.c_*/, 1/*param.channel_deal*/, param.filt_flag, param.min_area, param.max_area); } int IRegionSurveillanceCpu::rs_init_region(int num_roi, region_info* region_infos, bool iflog) { //仅能初始化一个有效区域??? ------ update by mliu 20201129 //RegionInfo reginifos; //reginifos.AlarmInfo = region_infos->alarm_stay; // 1进入禁区 2离开禁区 3单向越界 4双向越界 5徘徊 6丢包 //reginifos.nPointNum = region_infos->point_num; //for (int i = 0; i < MAXVERTEXNUM; ++i) //{ // reginifos.pROI[i].x = region_infos->p_roi[i].x_; // reginifos.pROI[i].y = region_infos->p_roi[i].y_; //} //CMPoint pROI[MAXVERTEXNUM]; //reginifos.nFrameNum = region_infos->frame_num; //reginifos.dirPoint.x = region_infos->dir_point.x_; //reginifos.dirPoint.y = region_infos->dir_point.y_; //reginifos.finaldir = region_infos->finaldir; //reginifos.ArrowStartPoint.x = region_infos->arrow_start_point.x_; //reginifos.ArrowStartPoint.y = region_infos->arrow_start_point.y_; //reginifos.ArrowEndPoint.x = region_infos->arrow_end_point.x_; //箭头的终止端点 箭头指向正方形 //reginifos.ArrowEndPoint.y = region_infos->arrow_end_point.y_; //箭头的终止端点 箭头指向正方形 //return IReginCpu->RSRegion(num_roi, ®inifos, iflog); RegionInfo *reginifos = new RegionInfo[num_roi]; for (int i = 0; i < num_roi; i++) { reginifos[i].AlarmInfo = region_infos[i].alarm_stay; // 1进入禁区 2离开禁区 3单向越界 4双向越界 5徘徊 6丢包 reginifos[i].nPointNum = region_infos[i].point_num; for (int ii = 0; ii < MAXVERTEXNUM; ++ii) { reginifos[i].pROI[ii].x = region_infos[i].p_roi[ii].x_; reginifos[i].pROI[ii].y = region_infos[i].p_roi[ii].y_; } reginifos[i].nFrameNum = region_infos[i].frame_num; reginifos[i].dirPoint.x = region_infos[i].dir_point.x_; reginifos[i].dirPoint.y = region_infos[i].dir_point.y_; reginifos[i].finaldir = region_infos[i].finaldir; reginifos[i].ArrowStartPoint.x = region_infos[i].arrow_start_point.x_; reginifos[i].ArrowStartPoint.y = region_infos[i].arrow_start_point.y_; reginifos[i].ArrowEndPoint.x = region_infos[i].arrow_end_point.x_; //箭头的终止端点 箭头指向正方形 reginifos[i].ArrowEndPoint.y = region_infos[i].arrow_end_point.y_; //箭头的终止端点 箭头指向正方形 } return IReginCpu->RSRegion(num_roi, reginifos, iflog); } int IRegionSurveillanceCpu::rs_init_backgroud(const sy_img &img_data) { IReginCpu->RSinit_backgroud(img_data.w_, img_data.h_, img_data.c_, img_data.data_); return 0; } int IRegionSurveillanceCpu::rs_detect(const sy_img &img_data, region_info* region_infos, int region_count, rs_result *result) { RegionInfo *reginifos = new RegionInfo[region_count]; for (int ii = 0; ii < region_count; ii++) { reginifos[ii].AlarmInfo = region_infos[ii].alarm_stay; // 1进入禁区 2离开禁区 3单向越界 4双向越界 5徘徊 6丢包 reginifos[ii].nPointNum = region_infos[ii].point_num; for (int i = 0; i < MAXVERTEXNUM; ++i) { reginifos[ii].pROI[i].x = region_infos[ii].p_roi[i].x_; reginifos[ii].pROI[i].y = region_infos[ii].p_roi[i].y_; } CMPoint pROI[MAXVERTEXNUM]; reginifos[ii].nFrameNum = region_infos[ii].frame_num; reginifos[ii].dirPoint.x = region_infos[ii].dir_point.x_; reginifos[ii].dirPoint.y = region_infos[ii].dir_point.y_; reginifos[ii].finaldir = region_infos[ii].finaldir; reginifos[ii].ArrowStartPoint.x = region_infos[ii].arrow_start_point.x_; reginifos[ii].ArrowStartPoint.y = region_infos[ii].arrow_start_point.y_; reginifos[ii].ArrowEndPoint.x = region_infos[ii].arrow_end_point.x_; //箭头的终止端点 箭头指向正方形 reginifos[ii].ArrowEndPoint.y = region_infos[ii].arrow_end_point.y_; //箭头的终止端点 箭头指向正方形 } IReginCpu->RSDetect((unsigned char*)(img_data.data_), reginifos); auto ObjCount = IReginCpu->getObjectNum(); result->obj_count = ObjCount > MACDETECTOBJNUM ? MACDETECTOBJNUM : ObjCount; auto * ObjInfo = new MS_ObjectInfo[ObjCount]; IReginCpu->getObjectInfo(ObjCount, ObjInfo); for (int i = 0; i < ObjCount && i obj_infos[i].curPos.x_ = ObjInfo[i].curPos.x; // 当前坐标 result->obj_infos[i].curPos.y_ = ObjInfo[i].curPos.y; // 当前坐标 result->obj_infos[i].trace.trace_num = ObjInfo[i].trace.nTraceNum; // 轨迹及报警状态 for (int j = 0; j < MAXTRACENUM; ++j) { result->obj_infos[i].trace.obj_trace[j].x_ = ObjInfo[i].trace.pObjTrace[j].x; result->obj_infos[i].trace.obj_trace[j].y_ = ObjInfo[i].trace.pObjTrace[j].y; } result->obj_infos[i].unique_id = ObjInfo[i].UniqueID; // 当前目标的特点ID result->obj_infos[i].tar_box.left_ = ObjInfo[i].TarBox.left; // 目标外接矩形 result->obj_infos[i].tar_box.top_ = ObjInfo[i].TarBox.top; result->obj_infos[i].tar_box.height_ = ObjInfo[i].TarBox.Height(); result->obj_infos[i].tar_box.width_ = ObjInfo[i].TarBox.Width(); for (int j = 0; j < MAXROINUM; ++j) { result->obj_infos[i].pb_alarm_state[j] = ObjInfo[i].pbAlarmState[j]; for (int k = 0; k < ALARMTYPENUM; ++k) { result->obj_infos[i].pb_alarm_type[j][k] = ObjInfo[i].pbAlarmType[j][k]; } } } if (reginifos) { delete[] reginifos; reginifos = NULL; } return 0; } int IRegionSurveillanceCpu::rs_get_arrowdir(const sy_point &p_roi0, const sy_point &p_roi1, const sy_point &dir) { CMPoint pROI0; pROI0.x = p_roi0.x_; pROI0.y = p_roi0.y_; CMPoint pROI1; pROI1.x = p_roi1.x_; pROI1.y = p_roi1.y_; CMPoint pdir; pdir.x = dir.x_; pdir.y = dir.y_; return IReginCpu->get_ArrowDir(pROI0, pROI1, pdir); }