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.

265 lines
9.5 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.

#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);
};