|
|
#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"
|
|
|
#include "Arith_PosAnalyse.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:
|
|
|
|
|
|
ImagePosRecord m_posRecorder; //pos统计
|
|
|
|
|
|
|
|
|
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);
|
|
|
}; |