|
|
|
|
|
/*********版权所有(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_SIMOBJ_VALID_CNT 50 //监控有效性帧数,稳定跟踪后才使用监控参数进行跟踪决策
|
|
|
|
|
|
|
|
|
|
|
|
#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;//管道丢失(记忆跟踪)帧数
|
|
|
|
|
|
|
|
|
|
|
|
BBOOL Sky_bUseAIDet; //是否使用AI检测信息
|
|
|
|
|
|
UINT16 nUseAIDetFeq; //使用AI管道更新频率
|
|
|
|
|
|
|
|
|
|
|
|
BBOOL bEnableSecDetect;//小目标二次检测开关
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
|
|
|
//跟踪算法输出结果结构体
|
|
|
|
|
|
typedef struct tagTSA_Output
|
|
|
|
|
|
{
|
|
|
|
|
|
SINT32 nFrmSmallObjsCnt; //当前帧小目标个数
|
|
|
|
|
|
SINT32 nFrmAreaObjsCnt; //当前帧面目标个数
|
|
|
|
|
|
SINT32 m_nTargetNum; // 对空跟踪局部目标检测个数
|
|
|
|
|
|
TARGET_OBJECT* mTarget_Array; // 对空跟踪局部目标检测队列
|
|
|
|
|
|
UINT16 pxObjGrayMax; //目标最大灰度值
|
|
|
|
|
|
UINT16 pxObjGrayMin; //目标最小灰度值
|
|
|
|
|
|
|
|
|
|
|
|
CENTERRECT crCenterRect; //搜索区域宽高
|
|
|
|
|
|
}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, GLB_INPUT* p_GLB_Input, API_MOT_PIPE* g_GLB_PipeProc, SkyControlInfo* pSkyControlInfo, TSky_Output* m_TSky_Output);
|
|
|
|
|
|
|
|
|
|
|
|
// 目标表观特性模型:小面目标
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
TARGET_OBJECT m_MatchTarget1; // 基于小面检测的匹配目标
|
|
|
|
|
|
TARGET_OBJECT m_MatchTarget2; // 基于AI识别的匹配目标
|
|
|
|
|
|
|
|
|
|
|
|
// 作为检测关联跟踪器,匹配【目标】是最基本的输出,还可以在融合时直接用于输出,不必再从ObjStatus更新到管道
|
|
|
|
|
|
TARGET_OBJECT m_MatchedTarget;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//跟踪算法:小目标与面目标相互切换计数
|
|
|
|
|
|
UBYTE8 TO_pSmall2Area_Target_counter[GLB_TRACK_SMALL2FACE_CNT];
|
|
|
|
|
|
SINT16 g_GLB_S2ATagCnt; //小目标和面目标相互切换计数器
|
|
|
|
|
|
|
|
|
|
|
|
UINT16 nSAUseAIDetFeq; //使用AI信息帧率
|
|
|
|
|
|
|
|
|
|
|
|
//相似抗干扰跟踪算法:相似目标个数数组统计、状态判断、生命周期控制
|
|
|
|
|
|
SINT32 nSimTargetNum_Counter[GLB_SIMOBJ_VALID_CNT];
|
|
|
|
|
|
UBYTE8 ubSimTarget_End; //相似目标数组最后位置的索引
|
|
|
|
|
|
SINT32 CountSim2To0; //2个变0个的次数
|
|
|
|
|
|
BBOOL bSim2To0_T; //2变0,0连续持续T帧的标志位
|
|
|
|
|
|
SINT32 nSimStateLifeTime; //相似抗干扰状态的生命周期
|
|
|
|
|
|
// 目标检测队列
|
|
|
|
|
|
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(TARGET_OBJECT* pTarget, GLB_INPUT* p_GLB_Input, SINT32 nTrackMemThresh);
|
|
|
|
|
|
|
|
|
|
|
|
// 获取跟踪器的运行状态
|
|
|
|
|
|
void GetTrackState(GLB_INPUT* p_GLB_Input);
|
|
|
|
|
|
|
|
|
|
|
|
// 波门目标匹配
|
|
|
|
|
|
SINT32 FindMatchTarget(PIPE* pPipe, TARGET_OBJECT* ptTargetArray, SINT32 nFrmObjsCnt, SINT32 nPipeRadius, GLB_INPUT* p_GLB_Input);
|
|
|
|
|
|
|
|
|
|
|
|
// 波门管道匹配
|
|
|
|
|
|
SINT32 FindMatchPipe(SINT32 nWidth, SINT32 nHeight, PIPE* pLockingPipe, PIPE* m_PipeArray, SINT32 nRealPipeNum,
|
|
|
|
|
|
SINT32 nMaxPipeNum, TSA_Parameters *pTSA_Param, FLOAT32 fAglReso);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**********************************************************/
|
|
|
|
|
|
// 波门单帧目标匹配
|
|
|
|
|
|
SINT32 FindMatchOneshot(PIPE* pPipe, TARGET_OBJECT* ptTargetArray, SINT32 nFrmObjsCnt, SINT32 nPipeRadius, FLOAT32 fAglReso);
|
|
|
|
|
|
|
|
|
|
|
|
// 波门跟踪轨迹匹配
|
|
|
|
|
|
SINT32 FindMatchTracklet(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 SARegionDet(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, SINT32 nPipeRadiusTrack, TSky_Output* m_TSky_Output);
|
|
|
|
|
|
|
|
|
|
|
|
// 对空相似目标抗干扰处理
|
|
|
|
|
|
void ProcessSimInflunce(GLB_INPUT* p_GLB_Input, SINT32* nObjCombineDist, TSky_Output* m_TSky_Output);
|
|
|
|
|
|
|
|
|
|
|
|
// 自动切换跟踪目标模式,内部自闭环
|
|
|
|
|
|
void SetTrackModeAuto();
|
|
|
|
|
|
|
|
|
|
|
|
FLOAT32 Similarity_Apparent(PIPE* pPipe, TARGET_OBJECT* ptTarget);
|
|
|
|
|
|
|
|
|
|
|
|
FLOAT32 Similarity_Move(PIPE* pPipe, TARGET_OBJECT* ptTarget, FLOAT32 fAglReso);
|
|
|
|
|
|
FLOAT32 Similarity_Move(PIPE* pPipe, PIPE* pPipe_Temp, 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;
|
|
|
|
|
|
|
|
|
|
|
|
TrackUnlockState SATrkState; // 小面跟踪器的记忆跟踪状态
|
|
|
|
|
|
|
|
|
|
|
|
//// 全局变量的指针
|
|
|
|
|
|
//GLB_INPUT* g_GLB_stInput;
|
|
|
|
|
|
//GLB_PARAMETERS* g_GLB_stPara;
|
|
|
|
|
|
//GLB_OUTPUT* g_GLB_stOutput;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|