/*********版权所有(C)2014,武汉高德红外股份有限公司*************** * 文件名称: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