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.

454 lines
20 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.

/*********版权所有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"
#include "opencv2/opencv.hpp"
#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个踩点
#define HSV_LIST_LENGTH 20 //hsv历史信息队列长度
#define STATUS_LIST_LENGTH 30 //管道稳定性统计队列长度
#define HSV_NUM 3 //提取主色数量
#define HSV_WIDTH 32 //跟踪框处理范围
#define HSV_HEIGHT 32
typedef struct tagColorHis
{
FLOAT32 nMin_H; //H分量最小值
FLOAT32 nMax_H; //H分量最大值
FLOAT32 nMin_S; //S分量最大值
FLOAT32 nMax_S; //S分量最大值
FLOAT32 nMin_V; //V分量最大值
FLOAT32 nMax_V; //V分量最大值
FLOAT32 nSum_H; //分量总和
FLOAT32 nSum_S;
FLOAT32 nSum_V;
FLOAT32 nMean_H; //分量均值
FLOAT32 nMean_S;
FLOAT32 nMean_V;
SINT32 nColorCnt; //像素数量
FLOAT32 fColorPercent; //分量占比
FLOAT32 fColorMatch; //分量匹配率
}HSV_Para;
typedef struct tagColor
{
SINT32 nColorNum; //主色像素数
FLOAT32 fColorPercent; //主色占比
SINT32 nMatchId; //主色id
FLOAT32 fColorMatch; //主色匹配率
FLOAT32 nMin_H; //主色H分量最小值
FLOAT32 nMax_H; //主色H分量最大值
FLOAT32 nMin_S; //主色S分量最大值
FLOAT32 nMax_S; //主色S分量最大值
FLOAT32 nMin_V; //主色V分量最大值
FLOAT32 nMax_V; //主色V分量最大值
FLOAT32 nMean_H; //分量均值
FLOAT32 nMean_S;
FLOAT32 nMean_V;
FLOAT32 nFliter_H; //分量均值滤波
FLOAT32 nFliter_S;
FLOAT32 nFliter_V;
FLOAT32 fFliterColorPercent;
SINT32 bTargetCnt;
UBYTE8 nColorID; //目标颜色类别
UBYTE8 nFliterColorID; //目标颜色类别
SINT32 nCnt; // 已记录的历史响应信息个数
SINT32 nStep; //记录帧间隔
SINT32 nStart; //历史循环队列头
SINT32 nEnd; //历史循环队列末尾
SINT32 nListSize; // 目标遮挡信息数组长度
HSV_Para historyHSV[HSV_LIST_LENGTH]; //历史分量记录
}ColorPara;
typedef struct tagTargetStatus
{
BBOOL bPipeStabFlag; //识别管道是否稳定标志
UBYTE8 nLostFlag;
FLOAT32 fWHVar; //宽高变化方差
FLOAT32 fWHMean; //宽高均值
FLOAT32 fPtVar; //中心点位移方差
FLOAT32 fPtMean; //中心点位移均值
FLOAT32 fKFPredicError; //卡尔曼滤波预测误差
POINT32F fKFPredicPoint; //卡尔曼滤波预测点
FLOAT32 fCurrentWH; //当前帧宽高
FLOAT32 fCurrentXY; //当前帧中心点波动
SIZE32F sfSize; //当前帧目标宽高
POINT32F ptCenPos; //当前帧目标中心点
SINT32 nCnt; // 已记录的历史响应信息个数
SINT32 nStep; //记录帧间隔
SINT32 nStart; //历史循环队列头
SINT32 nEnd; //历史循环队列末尾
SINT32 nListSize; // 目标遮挡信息数组长度
SIZE32F historySize[STATUS_LIST_LENGTH];//历史宽高信息
POINT32F historyCenPos[STATUS_LIST_LENGTH];//历史中心点信息
}TargetStatus;
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; //目标方向
SINT32 nReIDDims; //邻居目标的ReID特征维度
FLOAT32* fReIDFeature; //邻居目标的ReID特征(多帧)
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]; //主跟踪目标的颜色特征(多帧)
SINT32 nReIDDims; //主跟踪目标的ReID特征维度
FLOAT32 fReIDFeature[GLB_REID_FEATURE_DIMS];//主跟踪目标的ReID特征(多帧统一为1个数据)
SINT32 nJamCnt; //主跟目标干扰计数
FLOAT32 fTrackIou; //与跟踪目标最大IOU
SINT32 nTrackId; //主跟踪识别管道id
FRMMAINOBJ FrmRelation[AID_DEPTH_MAX];//建立与主跟踪目标最近的管道目标关系(单帧)
ColorPara pColorInfo;
}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(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, OBJECTSTATUS* ObjStatus, PIPE* m_LockingPipe, 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, API_MOT_PIPE* g_GLB_PipeProc);
//更新邻居目标与主跟踪之间的关系
void update_TrackNeibor_Info(GLB_INPUT* p_GLB_Input, SINT32 nMaxPipeNum, PIPE* pArrayList, OBJECTSTATUS* ObjStatus);
//更新目标颜色信息
BBOOL getMainColorInfo(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, RECT16S rsBox, AIDMAINOBJ* pMainInfo, UBYTE8 nMode);
//计算目标颜色匹配结果
BBOOL calcMainColorMatchInfo(UBYTE8* img, SINT32 nWidth, SINT32 nHeight, ColorPara* pMainColorInfo, UBYTE8 nMode);
//更新目标颜色队列信息
void recordObjColorInfo(ColorPara* pMainColorInfo, BBOOL bSuccess);
//颜色信息滤波值估算
void objColorInfoFliter(ColorPara* pMainColorInfo);
//清理主目标信息
void memory_MainInfo();
//计算管道目标稳定性
void calcPipeStability(TargetStatus* objPipeStatus, RECT32F rfBox, SINT32 nWidth, SINT32 nHeight);
//宽高方差计算函数
FLOAT32 calcWHStability(TargetStatus* objPipeStatus);
// 中心点位移MSE计算函数
FLOAT32 calcPositionStability(TargetStatus* objPipeStatus, SINT32 nWidth, SINT32 nHeight);
//计算卡尔曼滤波预测误差
FLOAT32 calcKFPredictError(TargetStatus* objPipeStatus);
public:
UINT16 updateFreq; // 更新频率
FLOAT32 fWStartExpand; // 重捕区域宽度扩展起始值
FLOAT32 fHStartExpand; // 重捕区域高度扩展起始值
//全局变量
RECT16S ObservRect; // 观测区
RECT16S RecapRect; // 重捕区
MASTERAIDMONITOR masterPipeMonitor; // 监控信息
TargetStatus m_pPipeStatus;
//cv::KalmanFilter m_kf;
UBYTE8 m_ubLostStatus;
UBYTE8 m_ubArrestStatus;
FLOAT32 m_ArrestWH; //重捕宽高阈值参数
UBYTE8 m_ColorImg[HSV_WIDTH*HSV_HEIGHT*3];
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);
//初始化参数
void initPara();
MASTERAIDMONITOR* getAIDMasterInfo();
};
#endif