#pragma once #include "Arith_Common.hpp" #include "Arith_TrackSAObj.h" #include "KCF/API_KCF_Tracker.h" #include "Arith_BkgMonitor.h" #include "API_MOT_PipeProc.h" #include "SVM/svm.h" #include "Matcher/Fast_Matcher.h" // 决策行为 enum Act { Credit = 1, //采信 Reset = -1, //重置 Adjust = 2, //重置位置,不更新跟踪模型 Remain = 0, //保持,不做处理 }; // 决策策略 struct DecPolicy { Act Act_SATracker; Act Act_KCFTracker; }; //邻居目标特征 + 邻居目标与主跟踪目标的关系结构体,单帧信息 typedef struct tagFrmAlarmInfo { BBOOL bLost; //邻居目标当前状态是否在记忆 UINT32 unFrmId; //当前帧编号 POINT32F pfCenPos; //区域的中心点坐标 ANGLE32F afAngle; //目标方位角、俯仰角 SIZE16S snSize; //目标宽高 FLOAT32 fRelationIOU; //主跟踪目标上下帧之间的IOU DIST32F fCenDisXY; //主跟踪目标的中心点上下帧距离 }FrmAlarmInfo; //邻居目标与主跟踪目标的关系结构体,仅统计观测区域范围内,代表一个周围目标的多帧信息 typedef struct tagPipeMainAlarmInfo { BBOOL bOccupy; //表示被占用标记 UBYTE8 ubEnd; //队列尾(控制角度位置,实时刷新) UBYTE8 ubJudgePoint; //判别点,设置判别点间隔进行输出 UINT16 nCountNum; //实际队列占用,可用于标识队列是否占满 SINT32 nAlarmBatchID; //管道告警编号 FrmAlarmInfo frmAlarmInfo[MAIN_ALARM_DEPTH_MAX];//单帧 }PipeMainAlarmInfo; class SkyTracker { public: SkyTracker(SINT32 nWidth, SINT32 nHeight); SkyTracker(SINT32 nWidth, SINT32 nHeight, Param_SkyTracker para); ~SkyTracker(); // 跟踪参数,可接收外部传入 Param_SkyTracker mTrakingPara; // 跟踪初始化:统一使用管道作为接口 bool Init(GD_VIDEO_FRAME_S img, PIPE* pLockPipe, GLB_INPUT* g_GLB_Input); // 跟踪 bool Track(GD_VIDEO_FRAME_S img, GLB_INPUT* g_GLB_Input, API_MOT_PIPE* g_GLB_PipeProc, ARIDLL_PARMA* g_stArithPara); // 跟踪器解锁 void Cancle(); // 强制记忆跟踪 void SetMemTrack(bool bMemFlag); // 设置跟踪参数 void SetSkyParam(Param_SkyTracker PARA); // 获取跟踪参数 Param_SkyTracker GetSkyParam(); // 跟踪结果,用于输出 OBJECTSTATUS ObjStatus; // 输出小面目标跟踪波门 CENTERRECT getSATracker_SrBox(); // 输出kcf波门 CENTERRECT getKCFTracker_SrBox(); // 输出小面目标类型 SizeType getSATracker_SizeType(); public: // 输出跟踪阶段小面目标列表 TARGET_OBJECT* getTrackerSATargetList(SINT32& num); //返回小目标跟踪极值点 POINT16S* GetDST_MaxPoint_Sky(); PIPE* m_LockingPipe;//锁定管道指针,指向PIPE队列锁定目标,初始化赋值 TARGET_OBJECT mTargetFusion;//跟踪器的输出"目标",广义的单帧跟踪结果 // 跟踪融合 bool TrackDecision(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input); // 产生决策 DecPolicy Decision(GD_VIDEO_FRAME_S img); // KCF+CEND决策处理 DecPolicy TO_TrackDecisionOf_KCF_CEND(GD_VIDEO_FRAME_S img); // 决策处理 bool ApplyDecision(DecPolicy policy, GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input); // 自动切换跟踪目标模式,内部自闭环 void SetTrackModeAuto(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input); //小面目标跟踪器(对空) SA_Tracker* pSATracker; //kcf跟踪器(通用) API_KCF_Tracker* pKCFTracker; // 背景场景监控(对空) BkgMonitor* pBkgMonitor; // 模板匹配句柄 templateMatching::Fast_Matcher* matcher; // 强制记忆跟踪标记 bool m_bSetMemoryTrack; // SINT32 g_GLB_nTrackDecisionCnt;//决策帧计数 // 对空跟踪结果和参数输出 TSky_Output m_TSky_Output; private: bool bsvmInitDone;// PipeMainAlarmInfo* pipeAlarmInfo; // 主跟踪管道对应的信息缓存,用于在告警操作中进行类别确认 struct svm_model* model; struct svm_node* x; struct svm_parameter svmParm; void RecordAlarmInfo(PIPE* pPipe); void AlarmClassVerify(PIPE* pPipe); };