You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

307 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*********版权所有C2020武汉高德红外股份有限公司***************************************
* 文件名称: 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