MSRegionSurveilanceCpu.cpp 5.61 KB
#include "MSRegionSurveilanceCpu.h"
int IRegionSurveillanceCpu::rs_init(const rs_param &param)
{
	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, &reginifos, 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 <MACDETECTOBJNUM; ++i)
	{
		result->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);
}