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.

157 lines
4.5 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"
// 决策行为
enum Act
{
Credit = 1, //采信
Reset = -1, //重置
Adjust = 2, //重置位置,不更新跟踪模型
Remain = 0, //保持,不做处理
};
// 决策策略
struct DecPolicy
{
Act Act_SATracker;
Act Act_KCFTracker;
};
//邻居目标特征 + 邻居目标与主跟踪目标的关系结构体,单帧信息
typedef struct tagFrmAlarmInfo
{
BBOOL bLost; //邻居目标当前状态是否在记忆
UINT32 unFrmId; //当前帧编号
POINT32F pfCenPos; //区域的中心点坐标
ANGLE32F afAngle; //目标方位角、俯仰角
SIZE16S snSize; //目标宽高
FLOAT32 fRelationIOU; //主跟踪目标上下帧之间的IOU
DIST32F fCenDisXY; //主跟踪目标的中心点上下帧距离
}FrmAlarmInfo;
//邻居目标与主跟踪目标的关系结构体,仅统计观测区域范围内,代表一个周围目标的多帧信息
typedef struct tagPipeMainAlarmInfo
{
BBOOL bOccupy; //表示被占用标记
UBYTE8 ubEnd; //队列尾(控制角度位置,实时刷新)
UBYTE8 ubJudgePoint; //判别点,设置判别点间隔进行输出
UINT16 nCountNum; //实际队列占用,可用于标识队列是否占满
SINT32 nAlarmBatchID; //管道告警编号
FrmAlarmInfo frmAlarmInfo[MAIN_ALARM_DEPTH_MAX];//单帧
}PipeMainAlarmInfo;
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);
// 跟踪
bool Track(GD_VIDEO_FRAME_S img, GLB_INPUT* g_GLB_Input, API_MOT_PIPE* g_GLB_PipeProc, ARIDLL_PARMA* g_stArithPara);
// 跟踪器解锁
void Cancle();
// 强制记忆跟踪
void SetMemTrack(bool bMemFlag);
// 设置跟踪参数
void SetSkyParam(Param_SkyTracker PARA);
// 获取跟踪参数
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;
// 模板匹配句柄
templateMatching::Fast_Matcher* matcher;
// 强制记忆跟踪标记
bool m_bSetMemoryTrack;
//
SINT32 g_GLB_nTrackDecisionCnt;//决策帧计数
// 对空跟踪结果和参数输出
TSky_Output m_TSky_Output;
private:
bool bsvmInitDone;//
PipeMainAlarmInfo* pipeAlarmInfo; // 主跟踪管道对应的信息缓存,用于在告警操作中进行类别确认
struct svm_model* model;
struct svm_node* x;
struct svm_parameter svmParm;
void RecordAlarmInfo(PIPE* pPipe);
void AlarmClassVerify(PIPE* pPipe);
};