#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" #include "Arith_RadarInfo.h" #include "Arith_AIDMonitor.h" #include "Arith_PosAnalyse.h" // 决策行为 enum Act { Credit = 1, //采信 Reset = -1, //重置 Adjust = 2, //重置位置,不更新跟踪模型 Remain = 0, //保持,不做处理 }; enum ClsStdType { eSNR = 0, //信噪比 eLandsNum = 1, //孤岛数 eObjStd = 2, //目标方差 eCenPosX = 3, //质心中心点X值 eCenPosY = 4, //质心中心点Y值 eObjPixcelCnt = 5, //目标像素数 eXHoleCnt = 6, //X方向孔洞像素数 eYHoleCnt = 7, //Y方向孔洞像素数 eLongShortCenPosX = 8, //长短时中心点X值 eLongShortCenPosY = 9, //长短时中心点Y值 }; // 决策策略 struct DecPolicy { Act Act_SATracker; Act Act_KCFTracker; }; //对单个跟踪目标进行类别判定建模的单帧信息 typedef struct tagFrmClassifyInfo { BBOOL bLost; //邻居目标当前状态是否在记忆 UINT32 unFrmId; //当前帧编号 POINT32F pfCenPos; //区域的中心点坐标 ANGLE32F afAngle; //目标方位角、俯仰角 SIZE32F sfSize; //目标宽高 DIST32F fCenDisXY; //主跟踪目标的中心点上下帧距离 FLOAT32 fSNR; //目标信噪比 FLOAT32 fObjStd; //目标方差 4 SINT32 LandsNum; //分割孤岛数 SINT32 nObjPixcelCnt; //目标的像素数 SINT32 nObjXHoleCnt; //X方向的孔洞的像素数 SINT32 nObjYHoleCnt; //Y方向的孔洞的像素数 POINT32F pfLongCenPos; //长时轨迹预测中心点坐标 POINT32F pfShortCenPos; //短时轨迹预测的中心点坐标 }FrmClassifyInfo; typedef struct tagfrmSAClsInfo { ClsSrc emClsSrc[CLASSIFY_DEPTH_MAX]; //目标类别来源 SINT32 nSACls[CLASSIFY_DEPTH_MAX]; //目标类别 }FrmSAClsInfo; //小面+AI+决策的多帧类别信息,代表一个目标的多帧信息 typedef struct tagPipeMainClassifyInfo { BBOOL bOccupy; //表示被占用标记 UBYTE8 ubEnd; //队列尾(控制角度位置,实时刷新) UBYTE8 ubJudgePoint; //判别点,设置判别点间隔进行输出 UINT16 nCountNum; //实际队列占用,可用于标识队列是否占满 UINT16 nAreaCountNum; //面目标统计帧数 FrmClassifyInfo frmClassifyInfo[MAIN_ALARM_DEPTH_MAX]; //单帧 UBYTE8 ubSAClsEnd; //小面输出类别队列尾 FrmSAClsInfo frmSAClsInfo; //传统判别方法的目标类别数组 UBYTE8 ubAIDClsEnd; //AI识别输出类别队列尾 SINT32 frmAIDClsInfo[CLASSIFY_DEPTH_MAX]; //AI识别判别方法的目标类别数组 UBYTE8 ubDesciClsEnd; //决策输出类别队列尾 SINT32 frmDesciClsInfo[CLASSIFY_DEPTH_MAX]; //决策目标类别数组 }PipeMainClassifyInfo; // 主跟踪目标状态监控信息,用于判断跟踪目标是跟踪错误使用 typedef struct tagPipeMainStatusInfo { BBOOL bOccupy; // 表示被占用标记 UBYTE8 ubEnd; // 队列尾(控制角度位置,实时刷新) UBYTE8 ubJudgePoint; // 判别点,设置判别点间隔进行输出 UINT16 nSavedNum; // 实际队列占用,可用于标识队列是否占满 UINT16 nCountNum; // 每次统计计数,1个小周期重新计数 SINT32 nAIDetNum; // 每个小周期AI检测次数 FLOAT32 fAIDetRatio[TRACK_STATUS_DEPTH_MAX]; // AI检测状态统计 ANGLE32F fPosAngle; // 每个小周期上一次的角度位置 FLOAT32 fMoveDis[TRACK_STATUS_DEPTH_MAX]; // 方位角位移量监控统计 SINT32 nAbnormalCnt; // 异常次数累计 }PipeMainStatusInfo; 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); /************************************* * Method: Track() * Function Description: 对空跟踪处理流程 * CreateData: 2025/3/4 * Input Param: GD_VIDEO_FRAME_S img:输入图像 * Input Param: GLB_INPUT * g_GLB_Input:随帧输入信息 * Input Param: API_MOT_PIPE * g_GLB_PipeProc:管道句柄 * Input Param: ARIDLL_PARMA * g_stArithPara:算法控制参数 * Output Param: * Return: TrackUnlockState:跟踪状态 * Call Relation: * Other Description: *************************************/ TrackUnlockState Track(GD_VIDEO_FRAME_S img, GLB_INPUT* g_GLB_Input, API_MOT_PIPE* g_GLB_PipeProc, ARIDLL_PARMA* g_stArithPara, GLB_SCEN_MODE m_type); // 强制记忆跟踪 TrackUnlockState MemTrack(GD_VIDEO_FRAME_S img, GLB_INPUT* g_GLB_Input, API_MOT_PIPE* g_GLB_PipeProc, ARIDLL_PARMA* g_stArithPara, GLB_SCEN_MODE m_type); // 跟踪器解锁 void Cancle(); // 强制记忆跟踪 void SetMemTrack(bool bMemFlag); // 设置跟踪参数 void SetSkyParam(Param_SkyTracker * stSkyParam); // 获取跟踪参数 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; // 导引信息监控(对空) RadarInfo* pRadarInfo; //AI Detection 管道监控模块,用于提供重捕候选 AID_Monitor* Ai_DMonitor; // 模板匹配句柄 templateMatching::Fast_Matcher* matcher; // 强制记忆跟踪标记(外部下发) bool m_bSetMemoryTrack; // 统计主跟踪目标状态信息 PipeMainStatusInfo SkyTrkStatusInfo; // 跟踪控制参数(算法内部状态判断) SkyControlInfo skyControlInfo; // SINT32 g_GLB_nTrackDecisionCnt;//决策帧计数 TrackUnlockState SkyTrkState; // Sky 跟踪器的跟踪状态 // 对空跟踪结果和参数输出 TSky_Output m_TSky_Output; private: void CalcStdOfArrayStatus(FLOAT32* pfArray, SINT32 nTotalLen, SINT32 nEnd, SINT32 nCountLen, PIPE_FEATURE_FLUC* pstPipeFeature); void SkyTrackFalse_Process(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, OBJECTSTATUS* ObjStatus, PIPE* m_LockingPipe); private: ImagePosRecord m_posRecorder; //pos统计 bool bsvmInitDone;// PipeMainClassifyInfo* pipeClassifyInfo; // 主跟踪管道对应的信息缓存,用于在告警操作中进行类别确认 struct svm_model* SVM_model; struct svm_node* svm_nodeX; struct svm_parameter svmParm; void CalcStdOfArray(FrmClassifyInfo* frmClassifyInfo, SINT32 nCountLen, UBYTE8 nEnd, ClsStdType type, PIPE_FEATURE_FLUC* pstPipeFeature); void SkyClassify_Record(GD_VIDEO_FRAME_S img, OBJECTSTATUS* ObjStatus, PIPE* m_LockingPipe, SizeType sizeType); void SkyClassify_Verify(); void SkyClassify_Process(GD_VIDEO_FRAME_S img, OBJECTSTATUS *ObjStatus, PIPE* m_LockingPipe, SizeType sizeType); void SkyClassify_Desci(GLB_INPUT* p_GLB_Input, OBJECTSTATUS* pObjStatusSA); };