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.

333 lines
15 KiB

/*********版权所有C2014武汉高德红外股份有限公司***************
* Arith_AIDMonitor.h
*
*
*
* V2.0
* 08400yll
* 2024.09.02
*
*
* 2022.09.05
* V1.0
* yll08400
* 1
* 2
* 3
* 4
* 2
*******************************************************************/
#ifndef __Arith_TRACK_AI_MAIN_PIPE_H__
#define __Arith_TRACK_AI_MAIN_PIPE_H__
#include "Arith_Common.hpp"
#include "PIPE/API_MOT_PipeProc.h"
#include "KCF/API_KCF_Tracker.h"
#define AID_DEPTH_MAX 50 //AID监控邻居目标帧长度
#define AID_NEIBOR_MAX 30 //AID监控邻居目标最大个数
#define AID_FOOT_STEP 0.2 //AID监控踩点的帧频倍率0.5表示p_GLB_Input->unFreq * AID_FOOT_STEP
#define AID_FAST_FRM_PARM 3 //AID监控踩点计算要求最小个数,比如运动方向相似性需要至少3个踩点
//表示AID_FAST_FRM_PARM * p_GLB_Input->unFreq * AID_FOOT_STEP才能使用轨迹判断
#define AID_SLOW_FRM_PARM 6 //AID监控踩点计算要求最小个数,比如轨迹相似性需要至少6个踩点
typedef enum AITScaleType_tag
{
CAL_WIDTH = 0, //计算宽度信息
CAL_HEIGHT = 1, //计算高度信息
CAL_WHRATIO = 2 //计算宽高比信息
}AITScaleType;
typedef struct tagAIDFeatureFluc
{
FLOAT32 fStd; //标准差
FLOAT32 fMean; //均值
FLOAT32 fMin; //最小值
FLOAT32 fMax; //最大值
}AID_FEATURE_FLUC;
//邻居目标特征 + 邻居目标与主跟踪目标的关系结构体,单帧信息
typedef struct pipeRelationship
{
BBOOL bLost; //邻居目标当前状态是否在记忆
UINT32 unFrmId; //当前帧编号
ANGLE32F afAngle; //目标方位角、俯仰角
POINT32F pfCenPos; //区域的中心点坐标
SIZE32F snSize; //目标宽高
FLOAT32 fRelationIOU; //邻居目标与主跟踪目标的IOU
FLOAT32 fCenDisXY; //邻居目标与主跟踪目标的中心距离
DOUBLE64 dColorHu[9]; //邻居目标的颜色特征(单帧)
//DOUBLE64 fReIDArray[512]; //邻居目标的ReID特征(单帧)【】
}LONGRELATION;
//邻居目标特征 + 邻居目标与主跟踪目标的关系结构体,单帧信息
typedef struct pipeShortRelationship
{
BBOOL bLost; //邻居目标当前状态是否在记忆
UINT32 unFrmId; //当前帧编号
ANGLE32F afAngle; //目标方位角、俯仰角
POINT32F pfCenPos; //区域的中心点坐标
SIZE32F snSize; //目标宽高
FLOAT32 fRelationIOU; //邻居目标与主跟踪目标的IOU
FLOAT32 fCenDisXY; //邻居目标与主跟踪目标的中心距离
}SHORTRELATION;
//邻居目标与主跟踪目标的关系结构体,仅统计观测区域范围内,代表一个周围目标的多帧信息
typedef struct NEIBORTAR
{
BBOOL bOccupy; //表示被占用标记
BBOOL bMoved; //运动状态是否运动的(累计时序信息统计)
BBOOL bCreateBeforeLost; //创建时机是否在主目标丢失前
UBYTE8 ubEnd; //最新帧编号
UBYTE8 ubShortEnd; //队列尾(控制角度位置,实时刷新)
UBYTE8 ubLongEnd; //队列尾(控制角度位置,间隔刷新)
UBYTE8 ubEndFeature; //队列尾(控制特征)
UBYTE8 ubIndex; //在MASTERAIDMONITOR当中占据的索引
UINT16 ubUpdatePoint; //更新点,只有达到更新点才能更新数据
SINT16 uAIDirection; //受监控管道运动方向(累计时序信息统计)
BBOOL bUseAIDirection; //方向可用性
SINT32 nAlarmBatchID; //管道告警编号
SINT32 nRelationCnt; //邻居目标与主跟踪目标建立关系的帧计数
SINT32 nShortRecordCnt; //帧统计次数,每次更新到帧数组进行累加(间隔刷新)
SINT32 nLongRecordCnt; //帧统计次数,每次更新到帧数组进行累加(间隔刷新)
SINT32 nNoUpdateCnt; //连续未更新帧计数(用来控制监控信息被删除)
FLOAT32 fDisStart; //开始距离,开始统计时的距离
FLOAT32 f3sDisMove; //目标在最近3s内的移动距离像素衡量
ANGLE32F f3sAglMove; //目标在最近3s内的移动距离角度衡量
ANGLE32F afBornAgl; //目标初始角度
RECT16S rsCurrentBox;
SPEED32F sfAglSpeed; //目标方向
SHORTRELATION ShortRelation[AID_DEPTH_MAX];//邻居目标实时存储信息数组,目的用于捕获变化(单帧)
LONGRELATION LongRelation[AID_DEPTH_MAX];//邻居目标间隔存储信息数组,目的用于寻求稳定(单帧)
}NEIBOR;
//主跟踪目标结构体,单帧信息
typedef struct FRMMAINOBJ_Tag
{
UINT32 unFrmId; //当前帧编号
ANGLE32F afAngle; //目标方位角、俯仰角
POINT32F pfCenPos; //区域的中心点坐标
SIZE32F snSize; //目标宽高
}FRMMAINOBJ;
//主跟踪目标与周围目标的关系结构体,仅统计观测区域范围内,代表一个周围目标的多帧信息
typedef struct AIDMAINOBJ_Tag
{
BBOOL bOccupy; //表示被占用标记
BBOOL bLost; //表示当前跟踪管道没有对应的AI识别管道
BBOOL bMoved; //运动状态是否运动的(累计时序信息统计)
UBYTE8 ubEnd; //队列尾
POINT32F pfCenPos; //区域的中心点坐标
SIZE32F snSize; //目标宽高
UINT16 ubUpdatePoint; //更新点,只有达到更新点才能更新数据
SINT16 uAIDirection; //受监控管道运动方向(累计时序信息统计)
BBOOL bUseAIDirection; //具备方向统计性
SINT32 nStatisticCnt; //帧统计次数,每次更新到帧数组进行累加
UINT32 unExistCnt; //已存在帧数
UINT32 unContiLostCnt; //持续丢失帧计数
UINT32 unContiTrackedCnt;//持续跟踪计数
SINT32 nNoUpdateCnt; //连续未更新帧计数(用来控制监控信息被删除)
FLOAT32 f3sDisMove; //目标在最近3s内的移动距离像素衡量
ANGLE32F f3sAglMove; //目标在最近3s内的移动距离角度衡量
ANGLE32F afBornAgl; //目标初始角度
DOUBLE64 dColorHu[9]; //主跟踪目标的颜色特征(多帧)
//DOUBLE64 fReIDArray[512]; //主跟踪目标的ReID特征(多帧)
SINT32 nJamCnt; //主跟目标干扰计数
FLOAT32 fTrackIou; //与跟踪目标最大IOU
SINT32 nTrackId; //主跟踪识别管道id
FRMMAINOBJ FrmRelation[AID_DEPTH_MAX];//建立与主跟踪目标最近的管道目标关系(单帧)
}AIDMAINOBJ;
typedef struct MASTERTARPIPE
{
SINT32 nNeighborCnt; //在观测区域的邻域目标个数--正常跟踪数量
UBYTE8 uDevideEvent; //事件判断:主目标和邻域目标分开-合并-分开的过程2-1-2
SINT32 nSameDirectCnt; //同向运动目标个数,X或Y方向15个像素以内每帧动态更新--也是危险目标
SINT32 nOppositeDirectCnt; //反向交错目标个数
SINT32 nMaxIouId; //与主跟目标最大IOU对应的邻居id
FLOAT32 fMaxIou; //与主跟目标最大IOU
SINT32 nBestArrestId; //重捕最优目标ID
SINT32 nTargetNum; //通过全部条件筛选的目标个数
SINT32 nArrestIdArray[AID_DEPTH_MAX]; //可重捕目标id
NEIBOR nNeiborInfo[AID_NEIBOR_MAX];//邻域目标信息,邻域范围最多处理目标个数;
AIDMAINOBJ nMainInfo; //主目标信息
}MASTERAIDMONITOR;
class AID_Monitor
{
public:
AID_Monitor();
~AID_Monitor();
private:
/*************************************
* Method: isIn_Monitor_Info()
* Func Discription:
* CreateData: 2024/9/9
* Input Param: SINT32 nPipeID
* Output Param:
* Return: BBOOL
* Call Relation:
* Other Discription:
*************************************/
NEIBOR* isIn_Monitor_Info(SINT32 nPipeID, BBOOL& finded);
void cal_Recap_Area(GLB_INPUT* p_GLB_Input, OBJECTSTATUS* ObjStatus, PIPE* m_LockingPipe, RECT16S& RecapRect);
//计算与跟踪相关的识别管道id
void cal_MainPipe_ID(GLB_INPUT* p_GLB_Input, OBJECTSTATUS* ObjStatus, API_MOT_PIPE* g_GLB_PipeProc);
/*************************************
* Method: add_newMonitorObj()
* Func Discription:
* CreateData: 2024/9/9
* Input Param: NEIBOR * pNeibor
* Input Param: PIPE * pAddPipe
* Output Param:
* Return: void
* Call Relation:
* Other Discription:
*************************************/
void add_newMonitorObj(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, OBJECTSTATUS* ObjStatus, NEIBOR* pNeibor, PIPE* pAddPipe, SINT32 nPipeId);
/*************************************
* Method: delete_MonitorObj()
* Func Discription:
* CreateData: 2024/9/11
* Input Param: NEIBOR * pNeibor
* Output Param:
* Return: void
* Call Relation:
* Other Discription:
*************************************/
void delete_MonitorObj(NEIBOR* pNeibor);
/*************************************
* Method: update_Main_Info()
* Func Discription: reID
* CreateData: 2024/9/11
* Input Param: GLB_INPUT * p_GLB_Input
* Input Param: OBJECTSTATUS * ObjStatus
* Output Param:
* Return: void
* Call Relation:
* Other Discription:
*************************************/
void update_Main_Info(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, OBJECTSTATUS* ObjStatus);
//更新主管道目标信息
void update_MainPipe_Info(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, PIPE* pMainPipe, OBJECTSTATUS* ObjStatus);
//更新邻居管道目标信息
void update_NeiborPipe_info(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, PIPE* pPipe, OBJECTSTATUS* ObjStatus, SINT32 nPipeId);
/*************************************
* Method: update_MonitorObj()
* Func Discription:
0.5S
* CreateData: 2024/9/9
* Input Param: GLB_INPUT * p_GLB_Input
* Input Param: OBJECTSTATUS * ObjStatus
* Input Param: NEIBOR * pNeibor
* Input Param: PIPE * pAddPipe
* Output Param:
* Return: void
* Call Relation:
* Other Discription:
*************************************/
void update_MonitorObj(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, OBJECTSTATUS* ObjStatus, NEIBOR* pNeibor, PIPE* pAddPipe);
/*************************************
* Method: update_Monitor_Info()
* Func Discription:
* CreateData: 2024/9/9
* Input Param: GLB_INPUT * p_GLB_Input
* Input Param: OBJECTSTATUS * ObjStatus
* Input Param: API_MOT_PIPE * g_GLB_PipeProc
* Output Param:
* Return: void
* Call Relation:
* Other Discription:
*************************************/
void update_Monitor_Info(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, OBJECTSTATUS* ObjStatus, API_MOT_PIPE* g_GLB_PipeProc);
/*************************************
* Method: get_Recap_Candidate()
* Func Discription:
// 排除方法1在目标丢失前创建的排除
// 排除方法2在重捕区域外的排除
// 排除方法3运动方向相反的排除
// 排除方法4静止运动状态不一致的排除
// 最佳排序:轨迹相似性 + 运动方向相似度 + 位移相似度(相同时间) + 尺度相似性 + 外观特性相似性颜色、reID-->综合决策
// 送出目标的时机是目标未丢失与其它管道无IOU、尺度变化平稳避免在遮挡、干扰过程中送出
* CreateData: 2024/9/10
* Output Param:
* Return: void
* Call Relation:
* Other Discription:
*************************************/
SINT32 get_Recap_Candidate(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, OBJECTSTATUS* ObjStatus);
//更新邻居目标与主跟踪之间的关系
void update_TrackNeibor_Info(GLB_INPUT* p_GLB_Input, SINT32 nMaxPipeNum, PIPE* pArrayList, OBJECTSTATUS* ObjStatus);
//清理主目标信息
void memory_MainInfo();
//初始化参数
void initPara();
public:
UINT16 updateFreq; // 更新频率
FLOAT32 fWStartExpand; // 重捕区域宽度扩展起始值
FLOAT32 fHStartExpand; // 重捕区域高度扩展起始值
//全局变量
RECT16S ObservRect; // 观测区
RECT16S RecapRect; // 重捕区
MASTERAIDMONITOR masterPipeMonitor; // 监控信息
UBYTE8 m_ubLostStatus;
UBYTE8 m_ubArrestStatus;
public:
////////////////////////////////////////////////////////////////////////////////
//--接口函数声明--
////////////////////////////////////////////////////////////////////////////////
AID_Monitor* Create();
void Destroy(AID_Monitor* obj);
/*************************************
* Method: Process()
* Func Discription: AI
* CreateData: 2024/9/5
* Input Param: PIPE* m_LockingPipe
* Input Param: API_MOT_PIPE * g_GLB_PipeProc
* Output Param:
* Return: void
* Call Relation:
* Other Discription:
*************************************/
void Process(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, OBJECTSTATUS *ObjStatus, PIPE* m_LockingPipe, API_MOT_PIPE* g_GLB_PipeProc);
MASTERAIDMONITOR getAIDMasterInfo();
};
#endif