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

/*********版权所有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