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.

278 lines
8.7 KiB

/*********版权所有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_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