MSRegionSurveilanceBase.h 3.2 KB
#pragma once
#include "header.h"

#include "RegionSurveillanceProcess.h"
#include <fstream>
#include "Sort.h"
#include <map>
#define MAX_OBJ_COUNT 100
struct TaskTracker
{
	int TaskID;
	double ratioWidth;
	double ratioHeight;
	Sort tracker;
};

typedef struct VPT_Result
{
	int objCount;
	VPT_ObjInfo obj[MAX_OBJ_COUNT];
}VPT_Result;

class  IRegionSurveillanceBase : public RegionSurveillanceProcess {
public:
	IRegionSurveillanceBase();
	
	// 模型初始化
	virtual int rs_init(const rs_param & param) override;
	// ROI区域初始化
	virtual int rs_init_region(int numROI, region_info* region_infos, bool iflog) override;
	//// 每一帧图像检测
	int rs_detect(const sy_img &img_data, region_info* region_infos, int region_count, rs_result *result)override;
	////计算方向和箭头绘制的两个端点
	virtual int rs_get_arrowdir(const sy_point &p_roi0, const sy_point &p_roi1, const sy_point &dir) override;
protected:
	void vibeMask(int num, sy_point *pPointList, bool *pRegion);
	void printAlarmType(std::fstream *file, int style_human);
	void AddTaskTracker(const int taskID, const double rWidth, const double rHeight);
/***************************************处理函数**********************************************************/
	void AccessToRestrictedAreas(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result);       //进入禁区
	void LeaveTheRestrictedAreas(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result);        //离开禁区
	void OneWayCrossBorder(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result);             //单向越界
	void TwoWayCrossBorder(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result);           //双向越界
	void WanderMonitoring(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result);              //徘徊
	void StayMonitoring(const VPT_Result & vptResult, const region_info* region_infos, rs_result *result);              //丢包
/**********************************************************************************************************/
	virtual int init(const rs_param & param) = 0;                                                                      //回调子类初始化模块
	virtual int detect(const sy_img &img_data, VPT_Result & vptResult) = 0;											   //回调子类获取人车物检测,头肩检测信息						                                       //回调子类人车物检测或头肩检测
	virtual void release() = 0;																						   //回调子类用于释放
private:

	void RSrelease();                                                                   
protected:
	struct TraceInfo
	{
		unsigned int id;                       //目标唯一id
		unsigned int num;                      //目标轨迹长度
		std::deque<sy_point> trace_obj;        //目标轨迹点集合
	};
	std::vector<TraceInfo> vec_traceinfo;
	struct StayInfo
	{
		long nFrameCurr;    // 记录当前逗留帧数
		int  lastFrame;     // 上次监测到逗留距离当前的帧数
	};
	std::map<unsigned int, std::map<unsigned int, StayInfo>> mp_stayinfo;    //区域索引, 目标唯一id, 目标逗留帧数
	int GlobelWidth = 0;
	int GlobelHeight = 0;
	TaskTracker taskTrackers;
	sy_point pStart, pEnd; //by zl 用于存储可通行方向箭头的两个端点
	int m_numROI = 0;
	bool** pRegion;
	int* pAlarmInfo;
private:
	
	
};