#pragma once #include "header.h" #include "RegionSurveillanceProcess.h" #include #include "Sort.h" #include #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 trace_obj; //目标轨迹点集合 }; std::vector vec_traceinfo; struct StayInfo { long nFrameCurr; // 记录当前逗留帧数 int lastFrame; // 上次监测到逗留距离当前的帧数 }; std::map> 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: };