/*********版权所有(C)2020,武汉高德红外股份有限公司*************************************** * 文件名称: Arith_TrackSAObj.h * 文件标识: * 内容摘要: 小目标面目标跟踪接口 * 其它说明: 由于二者都是利用目标特征向量的匹配进行跟踪,原理一致,因此可以合并为一个处理。此模块为对空跟踪器主体部分 * 当前版本: * 创建作者:04046WCW * 创建日期:2023/11/05 * 包含关系: *****************************************************************************************/ #ifndef ARITH_TRACKSAOBJ_H #define ARITH_TRACKSAOBJ_H #pragma once #include "Detect/API_DetectSAObj.h" #include "PIPE/Arith_MOT_PipeProc.h" #include "Arith_Common.hpp" #define FEA_LENS 100 //监控数组长度 #define GLB_MONITOR_VALID_CNT 100 //监控有效性帧数,稳定跟踪后才使用监控参数进行跟踪决策,防止 #define GLB_TRACK_SMALL2FACE_CNT 5 //小目标和面目标相互切换数组总长度 #define GLB_TRACK_SMALL2FACE_THRES 3 //小目标和面目标相互切换计数阈值 #define GLB_SMALL2FACE_SIZE_THRES 36 //49//64 //小目标转面目标尺寸上限 //定义监控管道目标特性波动结构体 typedef struct tagPipeFeatureFluc { FLOAT32 fStd; //标准差 FLOAT32 fMean; //均值 FLOAT32 fMin; //最小值 FLOAT32 fMax; //最大值 }PIPE_FEATURE_FLUC; //定义监控目标特性,根据需要扩展,常规特性如尺寸、灰度 typedef struct tagMonitorStatus { // 特性 FLOAT32 TargetGray[FEA_LENS];//小目标取灰度极值,面目标取均值 PIPE_FEATURE_FLUC TargetGray_sta; FLOAT32 fGrayWeight; FLOAT32 TargetWHRatio[FEA_LENS]; PIPE_FEATURE_FLUC TargetWHRatio_sta; FLOAT32 fWHRWeight; FLOAT32 TargetConfRatio[FEA_LENS]; PIPE_FEATURE_FLUC TargetConfRatio_sta; FLOAT32 fConfWeight; FLOAT32 TargetPxls[FEA_LENS]; PIPE_FEATURE_FLUC TargetPxls_sta; FLOAT32 fPxlsWeight; // 信噪比 FLOAT32 TargetSNR[FEA_LENS]; PIPE_FEATURE_FLUC TargetSNR_sta; FLOAT32 fSNRWeight; // 背景均值 FLOAT32 TargetBKGMean[FEA_LENS]; PIPE_FEATURE_FLUC TargetBKGMean_sta; FLOAT32 fBKGMeanWeight; FLOAT32 fScore; // 当前目标得分 SINT32 MonitorCnts; //记录总帧数 SINT32 unLastUpdateFrm; // 最近更新的帧编号 BBOOL bMonitorVaildFlag; // 目标监控有效标志 }MonitorStatus; //// 运动特征 //typedef struct tagMoveFeature //{ // SINT32 nLostFrmID;//丢失帧编号 // ANGLE32F stLostAgl;//丢失点角度 // SPEED32F stLostSpeed;//丢失前角速度 // // ANGLE32F stTargetCurrAgl;//当前帧预测角度 // CENTERRECT32S stTargetCurrBox;//当前帧预测图像位置 // //}MoveFeature; // //////////////////////////////////////////////////////////////////////////////// //--数据结构定义 //////////////////////////////////////////////////////////////////////////////// //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 跟踪算法搜索分块方案,内容与检测一致,便于赋值 struct TSA_INPUT { //搜索区域 CENTERRECT crCenterRect; //搜索区域宽高 MINMAXRECT mmCenterRect; //搜索区域边界 //分块大小 SINT32 nBlkHeight; //分块高 SINT32 nBlkWidth; //分块宽 //搜索区域内分块个数 SINT32 nBlkNumH; //高度上分块个数 SINT32 nBlkNumW; //宽度上分块个数 SINT32 nBlkNum; //总分块个数 }; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //跟踪算法参数结构体 struct TSA_Parameters { //相邻两个极大值点合并为一个目标的距离阈值 SINT32 nObjCombineDist;//相邻两个极大值点合并为一个目标的距离阈值 SINT32 nPipeRadius; //当前管道计算波门大小 SIZE32S snSrRadius; //实际搜索区域波门大小 //管道搜索区域大小 SINT32 nPipeRadiusLost; //丢失波门最小值 SINT32 nPipeRadiusTrack;//跟踪波门最小值 //记忆跟踪 SINT32 nPipeFOVLostCnt;//管道丢失(记忆跟踪)帧数 UINT16 nUseAIDetFeq; //使用AI管道更新频率 BBOOL bEnableSecDetect;//小目标二次检测开关 }; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //跟踪算法输出结果结构体 typedef struct tagTSA_Output { SINT32 nFrmSmallObjsCnt; //当前帧小目标个数 SINT32 nFrmAreaObjsCnt; //当前帧面目标个数 SINT32 m_nTargetNum; // 对空跟踪局部目标检测个数 TARGET_OBJECT* mTarget_Array; // 对空跟踪局部目标检测队列 UINT16 pxObjGrayMax; //目标最大灰度值 UINT16 pxObjGrayMin; //目标最小灰度值 }TSA_Output; class SA_Tracker { public: SA_Tracker(int nWidth, int nHeight); ~SA_Tracker(); // 管道初始化 bool Init(UINT16* pSrc, SINT32 nWidth,SINT32 nHeight, PIPE* pTrackingPipe, GLB_INPUT* p_GLB_Input); // 跟踪,更新目标模型 int Track(GD_VIDEO_FRAME_S img, SINT32 nWidth, SINT32 nHeight, GLB_INPUT* p_GLB_Input, API_MOT_PIPE* g_GLB_PipeProc); // 目标表观特性模型:小面目标 void TO_RecordObjFeatures(TARGET_OBJECT* ptTargetMonitor, GLB_INPUT* p_GLB_Input); // 清除目标特征 void TO_CleanUpObjFeatures(); // 重置跟踪器及模型(可选) void Reset(OBJECTSTATUS* pObjStatus,BBOOL bUpdateMod, GD_VIDEO_FRAME_S img, SINT32 nWidth, SINT32 nHeight, GLB_INPUT* p_GLB_Input); // 输出跟踪结果的外接矩形 RECT32S getTrackRect(); // 干扰目标统计,注意不是波门内目标个数 SINT32 getInterfereAreaTargteNum(RECT32S bbox); // 获取小目标检测模块 API_DetectSmallObj* getDSTmodule(); // 对空所有跟踪器统一输出,便于融合处理 OBJECTSTATUS m_ObjStatus; // 作为检测关联跟踪器,匹配【目标】是最基本的输出,还可以在融合时直接用于输出,不必再从ObjStatus更新到管道 TARGET_OBJECT m_MatchedTarget; //跟踪算法:小目标与面目标相互切换计数 UBYTE8 TO_pSmall2Area_Target_counter[GLB_TRACK_SMALL2FACE_CNT]; SINT16 g_GLB_S2ATagCnt; //小目标和面目标相互切换计数器 // 目标检测队列 TARGET_OBJECT* m_Target_Array; SINT32 m_nTargetNum; // 跟踪匹配目标的ID SINT32 nTrackTargetID; // 跟踪目标模式 SizeType m_SizeMode; GrayType m_GrayMode; // 算法输入输出 TSA_INPUT m_TSA_Input; TSA_Parameters m_TSA_Param; TSA_Output m_TSA_output; private: // 只更新目标信息到跟踪器,只有融合阶段才写入管道。 void UpdateObject2Tracker(SINT32 nWidth, SINT32 nHeight,TARGET_OBJECT* pTarget, GLB_INPUT* p_GLB_Input); // 波门目标匹配 SINT32 FindMatchTarget(PIPE* pPipe, TARGET_OBJECT* ptTargetArray, SINT32 nFrmObjsCnt, SINT32 nPipeRadius, FLOAT32 fAglReso); // 波门管道匹配 SINT32 FindMatchPipe(SINT32 nWidth, SINT32 nHeight, PIPE* pLockingPipe, PIPE* m_PipeArray, SINT32 nRealPipeNum, SINT32 nMaxPipeNum, TSA_Parameters *pTSA_Param, FLOAT32 fAglReso); // 自适应波门 void SetAutoSearchZone(SINT32 nWidth,SINT32 nHeight, GLB_INPUT* p_GLB_Input); // 自动切换跟踪目标模式,内部自闭环 void SetTrackModeAuto(); FLOAT32 Similarity_Apparent(PIPE* pPipe, TARGET_OBJECT* ptTarget); FLOAT32 Similarity_Move(PIPE* pPipe, TARGET_OBJECT* ptTarget, FLOAT32 fAglReso); void TO_StatisticsObjFeatures(); void TO_CalcStdOfArray(FLOAT32* pfArray, SINT32 nTotalLen, SINT32 nEnd,SINT32 nCountLen, PIPE_FEATURE_FLUC* pstPipeFeature); FLOAT32 cos_sim(POINT32F v1, POINT32F v2); //// 波门管道重捕 //SINT32 ReFindMatchPipe(PIPE* pPipe, PIPE* ptPipeArray, SINT32 nFrmObjsCnt, SINT32 nPipeRadius, GLB_INPUT* p_GLB_Input, SINT32 nMaxPipeNum); //// 更新匹配目标,重置滤波信息,并删除匹配管道 //void ReElectionPipe(PIPE* pPipe); //// 重捕管道更新 //void UpdatePipe2Tracker(SINT32 nWidth, SINT32 nHeight, PIPE* pPipe, GLB_INPUT* p_GLB_Input); //FLOAT32 Similarity_Move(PIPE* pLockPipe, PIPE* pPipeTemp, GLB_INPUT* p_GLB_Input); public: PIPE* m_LockingPipe;//锁定管道指针,指向PIPE队列锁定目标,初始化赋值 // 小目标检测算法 API_DetectSmallObj* pDST_Module; // 面目标检测算法 API_DetectAreaObj* pDAT_Module; // 历史特征向量记录 MonitorStatus g_GLB_MonitorStatus; //// 全局变量的指针 //GLB_INPUT* g_GLB_stInput; //GLB_PARAMETERS* g_GLB_stPara; //GLB_OUTPUT* g_GLB_stOutput; }; #endif