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.

256 lines
9.4 KiB

#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"
// 决策行为
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:
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);
};