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.

836 lines
36 KiB

/*********版权所有C2020武汉高德红外股份有限公司***************************************
* Arith_Global.h
*
*
*
*
*
* 2020/02/25
*
*****************************************************************************************/
#ifndef _ARITH_SYSSTRUCT_
#define _ARITH_SYSSTRUCT_
#include "Arith_CommonDef.h"
#include "PlatformDefine.h"
#include <math.h>
#include <memory.h>
#include <stdio.h>
#include <float.h>
#include <string>
#define SysDelay (0) //系统延时,指图像比当前帧角度慢的时间 单位ms有符号
//系统参数初始化。
#define GLB_CMD_SYSINITIAL 0x99
//定义雷达导引区域大小 qw 20211227
#define GLB_RADARGUIDE_RECT 400
// 帧频
#define GLB_FRM_FREQ 50
// 目标尺寸类型定义
#define GLB_OBJ_SIZE_SMALL 1 //目标类型 - 小目标
#define GLB_OBJ_SIZE_FACE 2 //目标类型 - 面目标
#define GLB_OBJ_SIZE_MIDDLE 3 //目标类型 - 小目标与面目标临界
#define GLB_OBJ_SIZE_DIMSMALL 4 //目标类型 - 弱小目标
#define GLB_OBJ_SIZE_UNKOWN 5 //目标类型 - 未知
// 目标灰度类型定义
#define GLB_OBJ_GRAY_BRIGHT 1
#define GLB_OBJ_GRAY_DARK 2
#define GLB_OBJ_GRAY_ALL 3
// 目标状态定义,搜索和跟踪阶段通用
#define GLB_OBJ_NEW 1
#define GLB_OBJ_UPDATE 2
#define GLB_OBJ_LOST 3
#define GLB_OBJ_DELETE 4
// 跟踪参数
#define GLB_MEMORY_FRM_NUM 150 //默认记忆跟踪帧数
//debug 解锁原因
#define GLB_UNLOCK_MANUAL 1 //手动解锁指令,或来自上位机的解锁
#define GLB_UNLOCK_RADAR_CHANGE 2 //雷达批号改变解锁
#define GLB_UNLOCK_OVERTIME_TST 31 //TST超时解锁
#define GLB_UNLOCK_OVERTIME_CEND 32 //CEND超时解锁
#define GLB_UNLOCK_OVERTIME_KCF 33 //KCF超时解锁
#define GLB_UNLOCK_ATTDIR_CHANGE 4 //攻击方向改变解锁,对空对地立靶模式切换
#define GLB_UNLOCK_FOVOUT 5 //出视场解锁
// 目标类型标记
#define TargetClass_Plane 98
#define TargetClass_Missle 99
// 面目标检测最大个数--控制耗时
#define DAT_TARGET_NUM_MAX 10 //
// 定义dst最大检测个数
#define DST_MAX_NUM 50
#define DT_TARGET_MAX_NUM DST_MAX_NUM + DAT_TARGET_NUM_MAX // 定义检测器最大检测个数
#define DT_MATCHER_MAX_NUM 6 // 定义模板匹配最大检测个数
// 管道规模
#define GLB_PIPE_DEPTH_MAX 10 //管道的最大深度
#define MAIN_ALARM_DEPTH_MAX 200 //主管道告警的最大深度
#define GLB_GROUP_NUM_MAX 5 //组的最大个数
#define GLB_GROUP_PIPENUM_MAX 3 //组包含的管道个数只支持3个合并
//管道确认帧数
#define GLB_PIPE_AWS_FRAME_STARE 5 //管道目标确认(报警)的最少帧数:凝视
#define GLB_PIPE_AWS_FRAME_SCAN 3 //管道目标确认(报警)的最少帧数:扫描
#define GLB_PIPE_NUM_SECTOR 9 //目标运动方向分割 qw 20220112
//管道丢失帧数
#define GLB_PIPE_UNFOUND_CNT 3 //15管道目标在其视场内没有被找到的次数
#define GLB_PIPE_DEL_MIN_SCAN 5 //管道最少延迟删除帧数- 扫描模式
#define GLB_PIPE_DEL_MIN_STARE 5 //管道最少延迟删除帧数- 凝视/跟踪模式
//管道滤波帧数
#define GLB_PIPE_FILTER_CNT 10 //管道的滤波帧数
#define PIPE_ACOS_TABLE_LEN 1001 // 管道余弦表间隔 qw 20220112
//管道搜索半径
#define GLB_PIPE_RADIUS_SEARCH 50//30//20 //目标搜索时,管道搜索范围直径
#define GLB_PIPE_RADIUS_LOCK 40//12 //目标锁定时,管道搜索范围直径
#define GLB_PIPE_RADIUS_TRACK 50//15 //目标跟踪时,管道搜索范围直径
#define GLB_PIPE_RADIUS_LOST 80//25 //目标记忆跟踪时,管道搜索范围直径
//简称LogT LogD LogI LogW LogE LogC LogO
#define ARITH_LOG_LEVEL_TRACE 0
#define ARITH_LOG_LEVEL_DEBUG 1
#define ARITH_LOG_LEVEL_INFO 2
#define ARITH_LOG_LEVEL_WARN 3
#define ARITH_LOG_LEVEL_ERROR 4
#define ARITH_LOG_LEVEL_CRITICAL 5
#define ARITH_LOG_LEVEL_OFF 6
#define PI 3.14159265358979f // 圆周率
#define PI2 2 * PI
#define TRUE 1 // 真1
#define FALSE 0 // 假0
// OPENCV 中的定义冲突
//#define MIN(a, b) ((a) < (b) ? (a) : (b)) // 取a、b两者中的最小值
//#define MAX(a, b) ((a) > (b) ? (a) : (b)) // 取a、b两者中的最大值
#ifndef MIN
# define MIN(a,b) ((a) > (b) ? (b) : (a))
#endif
#ifndef MAX
# define MAX(a,b) ((a) < (b) ? (b) : (a))
#endif
#define MINMAX_VAR(a, b, c) MAX(MIN(b, c), MIN(a, MAX(b, c))) // 取a、b、c三者中位于中间大小的值即非最大值亦非最小值
#define MINMAX_NUM(a, b, c) MAX(b, MIN(a, c)) // 当b<=c时将a限制在b和C之间当b>c时取b
#define ABS(x) ((x) < 0 ? -(x) : (x)) // 取x的绝对值
#define ROUND(x) ((SINT32)((x) - ((x) >= 0 ? 0 : 1) + 0.5f)) // 取整 - 对x四舍五入取整
#define FLOOR(a) (SINT32)(a) // 取整 - 小数位截断
#define POW2(x) ((x) * (x)) // 平方值计算
//#define FLT_EPSILON 1.192092896e-07F
#define RANDOM(x) (rand() % x)
#define RADIAN(x) (x * PI / 180)
#define ANGLE(x) (x / 3.141592653589793 * 180)
//#define NULL 0
#define ICV_CUBIC_1(x) (((x)*1.5 - 2.5) * (x) * (x) + 1.0)
#define ICV_CUBIC_2(x) ((((x) * (-0.5) + 2.5) * (x)-4.0) * (x) + 2)
#define cosd(x) (cos(RADIAN(x)))
#define sind(x) (sin(RADIAN(x)))
#define RELEASE(x) (delete[] (x);)
#define EPSILON 0.0000001f //最小值-浮点数精度
#define UNEPSILON 100000000 //最大值浮点数精度
// 角度输入输出限值0-360°
#define DEGLIM(DEG) ( (DEG > 180) ? (DEG-360) : ( (DEG < -180) ? (DEG+360) : DEG ) )
#define DEGLIM360(DEG) ( (DEG > 360) ? (DEG-360) : ( (DEG < 0) ? (DEG+360) : DEG ) )
// 定义目标滤波结构体(32bit×9)
typedef struct tagObjectFilter // BYTES: 9*4=36
{
UINT32 unFilterCnt; // 目标的滤波帧数
ANGLE32F afAngle; // 目标方位角、俯仰角
POINT32F pfCenPos; // 目标的中心点坐标(滤波结果)
SIZE32F sfSize; // 管道中目标的宽度、高度(滤波结果)
FLOAT32 fGray; // 管道中目标的灰度均值(滤波结果)
FLOAT32 fPxlsCnt; // 管道中目标的像素大小(滤波结果)
FLOAT32 fSNR; // 管道中目标的信噪比(滤波结果) mww,20130819
ANGLE32F fAngleSpeed; // 目标方位角、俯仰角速度
UINT16 fGrayNeighbor[4]; //管道中目标的四邻阈灰度均值TRBL滤波结果
} OBJECT_FILTER;
// 定义小目标SNR调试结构体
typedef struct tagObjectSNR // BYTES: 4*2 + 4*4 = 24
{
POINT16S Pnt; // 中心点x,y
SINT16 nTGR; // 目标窗口半径
SINT16 nBGR; // 背景窗口半径
FLOAT32 ObjGray; //(x,y)点灰度
FLOAT32 BGMean; // 背景均值
FLOAT32 BGStd; // 背景标准差
FLOAT32 fSNR; //(x,y)点信噪比
FLOAT32 ObjStd;
} OBJECTSNR;
// 定义目标结构体
typedef struct tagTargetObject // BYTES: 3*1 + 1*2 + 7*4 + 3*8 = 57
{
// 全局
BBOOL bObject; // 标识目标是否已被创建。1-目标已创建0-目标未创建
UINT32 unFrmID; // 记录目标被检测到的帧编号
SINT32 unClsType; // 目标类别
FLOAT32 fDetConf; // 检测置信度(AI目标)
// 位置
POINT32F pfCenPos; // 区域的中心点坐标 //BYTES: 2*4=8
POINT16S pnMaxPos; // 目标的极大值位置(小目标检测用) //BYTES: 2*2=4
ANGLE32F afAngle; // 目标方位角、俯仰角
FLOAT32 fDist; // 距离视场中心距离
PointXYZ pos3d; // 3D定位使用稳定系极坐标对应的直角坐标 //04046wcw 20241203
// 尺寸
MINMAXRECT mrnRect; // 目标上下左右边界坐标 //BYTES: 4*2=8
SIZE16S snSize; // 目标宽高 //BYTES: 2*2 + 1*4=8
UINT32 unObjPxlsCnt; // 目标的象素点的个数
UBYTE8 nObjTypeSize; // 表示目标尺寸类型1--小目标2--面目标3--临界目标即二者均是4--弱小目标
// 强度
UINT16 pxObjGray; // 目标的灰度:可以是中心点灰度、或目标均值等
UINT16 pxObjMaxGray; // 目标极值灰度 //04046wcw 20221019
UINT16 fGrayNeighbor[4]; /*> 目标四周的灰度均值, TRBL */
FLOAT32 fObjStd; // 目标方差 4
FLOAT32 fBGStd; // 目标背景方差
FLOAT32 fBGMean; // 目标背景均值
FLOAT32 fSNR; // 目标背景信噪比
UBYTE8 nObjTypeGray; // 表示目标灰度类型1--亮目标2--暗目标0--其它
// 管道相关
UINT32 nInPipesID; // 是否拥有管道0-目标未加入管道大于0-目标已加入第nInPipesID-1个管道
SINT32 nInPipeDist; // 记录目标被加入管道时,与该管道中心的距离
UBYTE8 ubDirection;
// 来源
ObjSrc nObjTypeSrc; // 目标来源 01-小目标 02-面目标 03-AI目标 04-KCF 05-TLD 06-手动起
FLOAT32 fMatchConf; //跟踪阶段匹配度
} TARGET_OBJECT;
// 定义模板匹配目标结构体
typedef struct tagMatcherTarget // BYTES: 3*1 + 1*2 + 7*4 + 3*8 = 57
{
// 全局
BBOOL bObject; // 标识目标是否已被创建。1-目标已创建0-目标未创建
UINT32 unFrmID; // 记录目标被检测到的帧编号
FLOAT32 fDetConf; // 检测置信度
// 位置
POINT32F pfCenPos; // 区域的中心点坐标 //BYTES: 2*4=8
POINT16S pnMaxPos; // 目标的极大值位置(小目标检测用) //BYTES: 2*2=4
ANGLE32F afAngle; // 目标方位角、俯仰角
FLOAT32 fDist; // 距离视场中心距离
// 尺寸
MINMAXRECT mrnRect; // 目标上下左右边界坐标 //BYTES: 4*2=8
SIZE16S snSize; // 目标宽高 //BYTES: 2*2 + 1*4=8
UINT32 unObjPxlsCnt; // 目标的象素点的个数
FLOAT32 Angle; // 目标角度
// 来源
ObjSrc nObjTypeSrc; // 目标来源 01-小目标 02-面目标 03-AI目标 04-KCF 05-TLD 06-手动起
} MATCHER_TARGET;
// 跟踪器结构体
typedef struct tagObjectStatus
{
UINT32 unFrmId; //当前帧编号
// 跟踪批号,对应外导引批号 by wcw04046 @ 2021/12/09
UBYTE8 nTrackID;
BBOOL bObjAssigned; // 是否初始化了目标的起始位置和大小。1-目标已初始化0-目标未初始化。
BBOOL bInsideFOV;//目标是否在视场
UINT32 unTotalCnt; // 目标已锁定的帧计数器(基于0计数)
UINT32 unTrackedCnt; // 目标实际存在的帧计数器(基于0计数)
UINT32 unContiTrackedCnt; // 目标连续非预测的帧计数器(基于0计数)
UINT32 unContiLostCnt; // 目标连续预测的帧计数器(基于0计数)
BBOOL bObjMiss; // 目标丢失/跟踪失败,解锁
BBOOL bObjLost; //目标丢失/记忆跟踪
POINT32F ptPosPre; // 目标坐标 - 上一帧 //BYTES: 2*4=8
POINT32F ptPos; // 目标坐标 - 当前帧 //BYTES: 2*4=8
POINT32S ptPosRect; //目标坐标-修正值
POINT32F ptPosFilter; // 目标坐标 - 滤波后 //BYTES: 2*4=8
POINT32F ptPosBorn; // 目标初始位置 //BYTES: 2*4=8
SIZE32F sfSize; // 目标宽高 //BYTES: 3*4=12
SIZE32F sfSizeFilter; //宽滤波值
SIZE32F sfSizeBorn; // 目标初始宽高 //BYTES: 3*4=12
FLOAT32 fObjPxlsCnt; // 目标的象素点的个数
SPEED32F sfSpeed; // 目标速度 //BYTES: 2*4=8
FLOAT32 fSNR;
ANGLE32F afAngle; // 目标伺服角度(方位角、俯仰角) //BYTES: 2*4=8
SPEED32F sfAglSpeed; // 目标角速度(方位角速度、俯仰角速度) //BYTES: 2*4=8
ANGLE32F afAngleBorn; // 目标初始伺服角度(方位角、俯仰角) //BYTES: 2*4=8
FLOAT32 fConfidence; // 置信度
PointXYZ stPos3D; // 目标3D坐标
ObjSrc nObjTypeSrc; // 目标来源 01-小目标 02-面目标 03-AI目标 04-KCF 05-TLD 06-手动起
UBYTE8 nOcclude_flag; //跟踪器遮挡状态
UBYTE8 nDeciStatus; //多跟踪器决策结果 0-无 1-kcf 2-AI
} OBJECTSTATUS;
//跟踪决策信息
typedef struct tagTrackDecisionInfo
{
FLOAT32 fIouAID_KCF;//识别与跟踪交并比
FLOAT32 fIouTLD_AID;//TLD与识别交并比
FLOAT32 fIouAIT_KCF;//AI跟踪与KCF交并比
CENTERRECT32F deciRectAID; //重置KCF的AI识别结果
BBOOL bAITResetKCF; //AITrack重置KCF
BBOOL bSelfResetAI; //AITrack自重置
BBOOL bKCFResetAIT; //KCF重置AITrack
BBOOL bAIDResetKCF; //AI识别重置KCF
FLOAT32 fDisAID_KCF; // AI识别结果和跟踪的相对距离用于稳跟判断
}TrackDecisionInfo;
// 算法处理的锁定指令,可根据需要扩展,尽量扁平化,不要设计多重控制。
typedef enum tagLockMode
{
LOCK_NONE = 0,//未锁定,无意义
LOCK_AUTO = 10,//自动锁定处理,锁定探测目标管道(视场内、视场外)
LOCK_POINT = 21,//点选
LOCK_RECT = 22,//框选
LOCK_UNLOCK = 3//解锁
}LockMode;
// 以下几个数据类型根据项目需求修改,此处只做最关键字段的定义或示范性定义
#define GLB_GUIDE_TARGET_NUM 10 //支持的一次性最大引导目标个数
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 定义操控盒到算法控制命令结构体
typedef struct tagGlbPCCommand // BYTES: 15*2=30
{
// 外部下发系统工作状态 by wcw04046 @ 2021/12/06
GLB_SYS_MODE ubSysStatusCmd;
// 场景模式
GLB_SCEN_MODE ubScenCmd;//对空、对地、对海、通用等
// 锁定命令字
UBYTE8 ubCmd; // 控制命令:初始化、跟踪、解锁、切换视频源、切视场,所有的命令都在这里区分
UINT16 ubCmdLast; // 上一个遥控指令
UINT32 unSetLockunFrmId; // 命令下发帧编号
BYTE8 ubSetID; // 命令特指目标编号,自动判断给-1
//-- 命令字附带参数
// 视场内锁定指令字,单一目标
UINT16 unSetLockPosX; // 锁定点目标图像坐标中心点X
UINT16 unSetLockPosY; // 锁定点目标图像坐标中心点Y
UINT16 unSetLockBoxW; // 锁定波门宽度, 目标宽度
UINT16 unSetLockBoxH; // 锁定波门高度, 目标高度
BBOOL bGuideUpDate; // 导引更新标志,多目标共享,下一次引导覆盖当前批目标
UINT16 unSetCanclePosX; // 解锁点目标图像坐标中心点X
UINT16 unSetCanclePosY; // 解锁点目标图像坐标中心点Y
UINT16 unSetCancleMode; // 解锁模式---0-单点解锁、1-全部解锁
UBYTE8 ubMutiTrack; // 跟踪模式---0默认1单目标2多目标
// 多目标引导锁定接口最多支持10批次目标
TargetGuide target[GLB_GUIDE_TARGET_NUM];
} GLB_PCCOMMAND;
//+++++++定义算法控制参数结构体
typedef struct tagGlbParameters
{
GLB_SYS_MODE nSysMode; // 系统工作模式(响应外部下发)
// 当前工作状态
GLB_STATUS nStatus; // 当前工作状态(算法自控)
GLB_STATUS nStatusBeforeLock; // 锁定前工作状态
// 当前视频源类型
GLB_VIDEO_TYPE nVideoSoureType;
// 当前工作场景
GLB_SCEN_MODE nWorkScene; // 工作场景 01-对空 01-对海 00-未知
// 系统航迹规模(管道数量)
SINT32 nPipeMaxNum;
// 系统告警目标规模(告警队列长度)
SINT32 nAlarmMaxNum;
// 目标锁定控制
LockMode stLockCtrl; // 是否锁定/修正攻击点01目标锁定/修正攻击点02 强制锁定 00不操作。
POINT32F ptLockPos; // 实际锁定点坐标实际锁定点X坐标、实际锁定点Y坐标 //BYTES: 2*4=8
SIZE32S snLockBoxSize; // 锁定目标的宽和高
BYTE8 ubLockID; //指定目标编号
SINT32 nLockPipeInd;//锁定管道编号【重要】
BBOOL bSelectObjManual; // 是否手动选择目标转跟踪。0-手动选择跟踪目标1-自动选择跟踪目标
// 外引导
BBOOL bEnRadarGuide; // 开启雷达引导
SINT32 nGuideTargetNumber; // 外引导批号
FLOAT32 fGuideAz; // 引导方位角
FLOAT32 fGuidePt; // 引导高低角
FLOAT32 fGuideAzSpeed; // 引导方位角速度
FLOAT32 fGuidePtSpeed; // 引导俯仰角速度
SINT32 nGuideDis; // 引导距离
SINT32 nDetectRegionX; // 引导精度范围X
SINT32 nDetectRegionY; // 引导精度范围Y
BBOOL bGuideUpDate; // 引导更新标志
SINT16 nGuideLastTime; // 导引有效时间,结束后没有收到新的导引,原导引失效 //S726 by wcw04046 @ 2021/11/25
BBOOL bGuideTrackAway; // 当前跟踪与引导偏离标志
POINT32F ptGuidePOS; // 引导位置换算坐标值
BBOOL bGuidePosInFOV; // 导引位置在当前视场标志
BBOOL bMutiTrack; // 是否多目标跟踪标志
// 多目标引导信息
TargetGuide targetGuide[GLB_GUIDE_TARGET_NUM];
BBOOL bEnForceGuide; // 半自动截获强制提取目标3s
} GLB_PARAMETERS;
// ++++++++定义算法每帧输入信息
typedef struct tagGlbInput // BYTES: 60 + 6*4 = 84
{
UBYTE8 unpxType; // 像素类型
UBYTE8 unVideoSrc; // 视频源类型
SINT32 nImageWidth; // 图像宽度
SINT32 nImageHeight; // 图像高度
UINT32 unFreq; // 帧频
UINT32 unFrmId; // 当前帧图像帧编号
ANGLE32F afSvoAgl; // 当前帧伺服角度(方位角、俯仰角)
SPEED32F sfSvoAglSpeed; // 当前帧伺服角速度(方位角速度、俯仰角速度)
PointBLH stPlanePos; // 当前载体位置
EulerRPY afPlatformRPY; // 安装平台姿态角(方位角、俯仰角、横滚角)
CameraParam stCamera; // 相机内参
ServoParam servoInfo; // 广义伺服编码器参数,不代表物方指向
DeviceSetupError setupErr; // 安装误差
SINT32 nElevationDiff; // 机载高程差
SINT32 parallelFlg; // 平台优化使用标记,勿删。
} GLB_INPUT;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 定义算法输出结果结构体
typedef struct tagGlbOutput // BYTES: 8*1 + 6*4 + 115*4 + 48 = 540
{
SINT32 nPipeObjsCnt; // 当前管道目标个数
SINT32 nAlarmObjsCnt; // 当前告警目标个数
SINT32 nAlarmIDCnt; // 当前告警目标批号占用个数
OBJECTSTATUS ObjectStatusTST; // 小目标跟踪输出的目标状态 //BYTES: 3*1 + 28*4 = 115
OBJECTSTATUS ObjectStatusCEND; // 形心跟踪输出的目标状态 //BYTES: 3*1 + 28*4 = 115
OBJECTSTATUS ObjectStatusKCF; // KCF跟踪输出的目标状态
OBJECTSTATUS ObjectStatus; // 跟踪决策输出的目标状态
} GLB_OUTPUT;
#ifndef _ALARM_TARGET_
#define _ALARM_TARGET_
typedef struct tagALARM_TARGET
{
UINT32 unFrmID; //目标帧编号
SINT32 nBatchID_1; //输出告警目标序号【目标列表显示】。0-不是告警目标大于0-表示为第nOutputID个输出的告警目标
SINT32 nInPipesID_1; //目标在管道数组中的编号。0-无对应管道大于0-对应于第nInPipesID-1个管道目标。
SINT32 nDetectCnt; //目标真实被检测到的帧数【目标列表显示】
SINT32 nCntSinceCreate;// 被创建后总帧计数
SINT32 nClassID; //目标类型,直接遗传管道结果
SINT32 unClsType; // 目标类别
UBYTE8 ubGrayType; //目标灰度类型
UBYTE8 ubSizeType; //目标类型。1--小目标2--面目标3--临界目标即二者均是4--弱小目标
UBYTE8 nObjStatusChange;//目标状态更改标记 0持续观测目标 1新目标 2目标丢失中 -1目标待删除
UBYTE8 bInFOV; //是否属于当前视场
SINT32 nInFOVCnt; //在视场帧计数
FLOAT32 nThreatConf; //威胁度估计
}ALARM_TARGET;
#endif
// AB滤波器
typedef struct tagAglFilter
{
float m_px;//方位角预测值
float m_pdx;//方位角速度预测值
float m_py;//俯仰角预测值
float m_pdy;//俯仰角速度预测值
// 滤波参数
float m_paraA;
float m_paraB;
int m_ind; //序号
float m_T;//1/系统频率
bool m_Init;//初始化标记
int m_LastFrmID;//上一帧更新的帧编号,扫描模式下防止帧频不稳定(有时一圈更新一次,有时连续帧更新)
POINT16S pnt_Predict; // 预测到像方
}AglFilter;
#define GLB_OBJTRACK_LEN 100 //目标轨迹数组长度
// 定义目标角度轨迹结构体
typedef struct tagObjAglTrack32F
{
UINT32 unFrmID; // 记录目标被检测到的帧编号
ANGLE32F afAngle; // 目标方位角、俯仰角
FLOAT32 fDist; // 距离
} ANGLE_R;
// 定义目标角度信息结构体
typedef struct tagObjAngleR32F // BYTES: 5*4+28=48
{
SINT32 nCnt; // 已记录的历史角度信息个数
SINT32 nStep; // 记录帧间隔
SINT32 nEnd; // 历史循环队列末尾
SINT32 nListSize; // 目标角度数组长度
ANGLE_R parHistoryList[GLB_OBJTRACK_LEN]; // 目标角度信息历史记录
SINT32 nFilterCnt; // 滤波帧数
ANGLE_R arfFilter; // 滤波结果
ANGLE_R arfSpeed; // 目标速度
ANGLE_R arfPredict; // 目标当前帧预测
} OBJ_ANGLE_R;
// 长短时滤波器结构
typedef struct tagFilterMeanNL
{
OBJ_ANGLE_R ObjAglListsNear; //目标短时间轨迹数组(每帧记录一次)
OBJ_ANGLE_R ObjAglListsLong; //目标长时间轨迹数组(每秒记录一次)
CENTERRECT crnObjPrediRtNear; //根据目标短时轨迹在当前帧预测到的位置中心矩形
CENTERRECT crnObjPrediRtLong; //根据目标长时轨迹在当前帧预测到的位置中心矩形
MINMAXRECT32S mrnObjPrediRtNear;//根据目标短时轨迹在当前帧预测到的位置边界矩形
MINMAXRECT32S mrnObjPrediRtLong;//根据目标长时轨迹在当前帧预测到的位置边界矩形
DIST32S dnObjPredictDist; //当前帧目标长短轨迹预测位置距离
SINT32 nObjPredictFarCnt; //目标长短轨迹位置预测距离连续变大计数器
BBOOL bObjPredictAbnormal; //目标长短轨迹位置预测异常标志
BBOOL bObjTrackRefoundSucc; //在目标长短轨迹位置预测异常时,重新成功找到目标的标志
SINT32 nObjTrackLostCntNear; //目标短时轨迹预测失败帧数
SINT32 nObjTrackLostCntLong; //目标长时轨迹预测失败帧数
SINT32 nAbnormalCnt; //跟踪异常计数器(连续---坏点
}FilterMeanNL;
// XYZ-滤波器(吊舱对地无源定位)
typedef struct tagXYZFilter
{
float m_px;//x预测值
float m_pdx;//x速度预测值
float m_py;//y预测值
float m_pdy;//y速度预测值
float m_pz;//z预测值
float m_pdz;//z速度预测值
// 滤波参数
float m_paraA;
float m_paraB;
int m_ind; //序号
float m_T;//1/系统频率
bool m_Init;//初始化标记
int m_LastFrmID;
POINT16S pnt_Predict; // 预测到像方
}XYZFilter;
// 管道
#ifndef _PIPE_
#define _PIPE_
typedef struct tagPIPE
{
SINT32 nPipeID; // 管道编号即队列ID
BBOOL bOccupy; // 标识管道是否已经被占用
BBOOL bTarget; // 标识管道是否是目标
UBYTE8 ubEventStatus; // 事件状态
BBOOL bInsideFOV; // 标记管道是否属于当前视场(目标检测区域)
BBOOL bLost; // 管道消失标记0-不是1-是。
BBOOL bTrackingPipe; // 已跟踪标记
BBOOL bAlarm; // 标识管道是否是告警目标
SINT32 unClsType; // 管道目标类别
UINT32 unTotalCnt; // 管道已创建的帧计数器
UINT32 unInsideFOVCnt; // 记录管道经过其视场的次数
UINT32 unContinueInFOVCnt; // 连续在视场帧数
UINT32 unExistCnt; // 管道中目标在其视场内真实被检测到的次数
UINT32 unLostCnt; // 管道已消失(目标在其视场内没有被检测到)的帧计数器
UINT32 unContinueExistCnt; // 连续检测到次数 new by wcw
UINT32 nLostFrmID; // 记录管道目标消失前的帧编号
SINT32 nInTargetID_1; // 是否在当前帧找到目标0-管道在当前帧尚未找到对应的目标大于0-管道对应当前帧第nInTargetID-1个目标
UINT32 unLastExistTime; // 管道目标最后一次被检测到的帧时间单位10ms
UBYTE8 ubEnd; // 队列尾
TARGET_OBJECT objHistoryList[GLB_PIPE_DEPTH_MAX]; // 数组实现循环队列 //BYTES: 3*1 + 1*2 + 7*4 + 3*8 = 57* 10 = 570
OBJECT_FILTER ObjectFilter; // 目标的滤波结果 //BYTES: 9*4=36
POINT32F ptBornPos; // 目标初始位置 //BYTES: 2*2=4
POINT32F ptCurrentPnt; // 管道目标在当前帧预测位置 //BYTES: 2*2=4
POINT32F ptStopPnt; // 管道目标在目标转入预测前的位置 //BYTES: 2*2=4
ANGLE32F afBornAgl; // 目标初始角度
ANGLE32F afCurrentAgl; // 管道目标在当前帧预测角度
ANGLE32F afStopAgl; // 管道目标在目标转入预测前的角度
SPEED32F sfAglSpeed; // 目标角速度
SINT32 nMoveCnt; // 目标图像坐标的运动次数
SINT32 bAreaChange; // 标记管道中的目标面积大小变化趋势 //CJ, 20121008
UBYTE8 nPipeType; // 表示管道目标类型1--小目标2--面目标3--临界目标即二者均是4--弱小目标
FLOAT32 fConfidence; // 管道为目标的置信度
SINT32 nBPCnt; // 管道被认为是坏点的次数
UBYTE8 ubDirection; // 管道的方向性扇区编号,运动方向0表示静止
SINT32 nSearchRadius; // 管道搜索半径
SINT32 nDelCntThres; // 自适应的删除帧数,提高稳定管道生存周期
SINT32 nInAlarmArrayIndex_1;//管道位于告警队列位置从1开始
SINT32 nAlarmBatchID_1;//管道告警批号从1开始
SINT32 nGuideBatchID;//外部批号,如果存在外部批号,则使用外部批号送显,内部批号不变,灵活度高
XYZFilter stXYZMotionMod;//3D运动AB滤波器可用于吊舱下视场景的无源定位+预测。
AglFilter stMotionMod; // 极坐标AB运动模型
FilterMeanNL stMotionMod_mean;//长短时运动模型
UINT32 unContinueOutFOVCnt; //管道连续出视场次数
UINT32 unSimTargetNum; //波门内相似目标个数
BBOOL blookout; //是否警戒周边干扰
BBOOL bTracking; // 管道跟踪标记
SINT32 nShowPipeID; //送显批号
}PIPE;
#endif
//管道处理参数(上位机软件界面可调)
#ifndef _PIPEParameters_
#define _PIPEParameters_
typedef struct tagPIPEParameters
{
SINT32 nPipeFOVLostCnt; //管道目标在其视场内没有被找到的次数
SINT32 nPipeFilterCnt; //管道的滤波帧数
SINT32 nPipeRadiusSearch; //管道搜索范围直径 -- 搜索
SINT32 nPipeRadiusLock; //管道搜索范围直径 -- 锁定
SINT32 nPipeRadiusTrack; //管道搜索范围直径 -- 跟踪
SINT32 nPipeRadiusLost; //管道搜索范围直径 -- 跟踪丢失
//管道确认与删除帧数
SINT32 nAwsFrmNumScan; //管道目标的确认帧数- 扫描模式 4
SINT32 nAwsFrmNumStare; //管道目标的确认帧数- 凝视模式 4
SINT32 nPipeDelMinScan; //管道最少延迟删除帧数- 扫描模式 4
SINT32 nPipeDelMinStare; //管道最少延迟删除帧数- 凝视/跟踪模式 4
//最优管道目标决策控制参数
FLOAT32 fPriorDistWeight; //最优目标的距离差异权重
FLOAT32 fPriorGrayWeight; //最优目标的灰度权重
FLOAT32 fPriorSNRWeight; //最优目标的信噪比权重
FLOAT32 fPriorSizeWeight; //最优目标的大小权重
FLOAT32 fPriorSpeedWeitht; //最优目标的速度权重
SINT32 nBinSector; //hist扇区
BBOOL bEnableBPJudge; //坏点判断。1-使能坏点判断0-不使能坏点判断
BBOOL bCloseBadPointPipe; //关闭坏点管道
//BBOOL bEnableBPJudgTrack; //跟踪坏点判断。1-使能跟踪坏点判断0-不使能跟踪坏点判断
//BBOOL bEnableBPJudgDetect; //检测坏点判断。1-使能检测坏点判断0-不使能检测坏点判断
// dengs 2018.12.25 speed
BBOOL bEnableSpeedMin; //是否使用目标速度下限限制。1-使用0-不使用。
BBOOL bEnableSpeedMax; //是否使用目标速度上限限制。1-使用0-不使用。
FLOAT32 fObjAglSpeedMin; //目标角速度下限(单位:度/秒)
FLOAT32 fObjAglSpeedMax; //目标角速度上限(单位:度/秒)
//凝视去虚警策略
BBOOL bEnableMoveDirLimit; //是否使用运动方向限制(要求方向一致性)
BBOOL bEnableMoveDet; // 动目标检测 by wcw04046 @ 2019/01/30
// 周扫管道处理去虚警参数ds tn-2
BBOOL bUseMotionFA; //是否使用运动去虚警策略开关 1
UBYTE8 ubPreScanNum; //预扫描圈数 1
//屏蔽区
FLOAT32 fScanAzMin;
FLOAT32 fScanAzMax;
FLOAT32 fScanPtMin;
FLOAT32 fScanPtMax;
// 默认滤波器参数
FLOAT32 fFilterA;
FLOAT32 fFilterB;
}PIPE_PARAMETERS;
#endif
// 对空检测器参数
#ifndef _SkyDetectParameters_
#define _SkyDetectParameters_
typedef struct tagParam_SkyDetect
{
BBOOL bEnableDetcetSmallTarget; //小目标检测开关
BBOOL bEnableDetcetAreaTarget; //面目标检测开关
BBOOL bEnableDetcetDimTarget; //弱小目标检测开关
//小目标检测参数设置(上位机软件界面可调)
/////////////////////////////////////////////////////////
FLOAT32 fSmallDetectGDK; //小目标检测snr阈值
FLOAT32 fDimGdk; //弱小目标检测的gdk下限
SINT32 nObjSizeMin; //目标大小阈值下限
SINT32 nObjSizeMax; //目标大小阈值上限
/////////////////////////////////////////////////
//面目标检测参数
SINT32 nDSmpScale; //搜索区域降采样倍数
SINT32 fAreaDetectGradDiffThre; //面目标检测梯度差阈值
SINT32 nGrayThresMinBright; //亮面目标检测灰度差阈值
SINT32 nGrayThresMinDark; //暗面目标检测灰度差阈值
/////////////////////////////////////////////////
//小面公共参数
SINT32 nDetectGrayType; //检测灰度类型
}Param_SkyDetect;
#endif
// 对空跟踪器参数
#ifndef _SkyTrackerParameters_
#define _SkyTrackerParameters_
typedef struct tagParam_SkyTracker
{
//跟踪开关及参数设置
BBOOL Sky_bEnableFullImgDet; //对空跟踪过程中是否使能全图目标检测
BBOOL Sky_bEnableTrackSA; //小面目标跟踪开关(小目标管道或面目标质心)
BBOOL Sky_bEnableKCF; //KCF跟踪算法开关。1-开0-关。
BBOOL Sky_bEnableMatcher; //模板匹配算法开关。1-开0-关。
BBOOL Sky_bSelectObjManual; //是否手动选择目标转跟踪。1-手动选择跟踪目标0-自动选择跟踪目标
BBOOL Sky_bUseAIDet; //是否使用AI检测信息
SINT32 Sky_nTrackMemFrmNum; //记忆跟踪帧数
SINT32 nSmallObjSizeMax; //小面目标的像素数切换阈值
//用于控制跟踪局部的检测器
Param_SkyDetect prmTSkyDet; //对空跟踪局部检测器参数
}Param_SkyTracker;
#endif
// 对地跟踪器参数
#ifndef _GroundTrackerParameters_
#define _GroundTrackerParameters_
typedef struct tagParam_GroundTracker
{
BBOOL bEnableAccuracyTrack; //跟踪精度优化 默认1
BBOOL bUseServePredict; //采用伺服预测 默认1
BBOOL bEnableLKCorrect; //LK光流算法开关 默认1
BBOOL bEnableKCF; //KCF跟踪算法开关 默认1
UBYTE8 nKcfUpdataStep; //KCF更新频率 默认2
BBOOL bKCFMutiScales; //KCF多尺度设置 默认1
FLOAT32 fArrestKCFMinThre; //KCF重捕阈值下限 默认0.38
FLOAT32 fArrestKCFMaxThre; //KCF重捕阈值上限 默认0.68
FLOAT32 fKCFResthre; //KCF跟踪阈值 默认0.2
BBOOL bTLDOccJudge; //辅助遮挡判断 默认0
BBOOL bEnableDaSiamRPN; //AI跟踪算法开关 默认1
BBOOL bEnableAIOccJudge; //AI遮挡条件开关 默认1
FLOAT32 fAIOccThre; //AI跟踪阈值 默认0.85
BBOOL bEnableAIDetect; //AI识别开关 默认0
//重捕参数控制
BBOOL bEnableArrestCorr; //重捕范围限制 默认0
BBOOL bEnableArrestAngle; //重捕角度限制 默认0
BBOOL bEnableAreestEsay; //弱重捕开关 默认1
SINT32 nArrestEsayCnt; //弱重捕时长 默认30帧
// 运动模型
BBOOL bEnable3dPredict; // 3D预测开关 默认0
}Param_GroundTracker;
#endif
//跟踪算法控制参数
#ifndef _ARIDLL_Parameters_
#define _ARIDLL_Parameters_
typedef struct tagARIDLL_PARMA
{
//// 对空检测器参数
Param_SkyDetect PrmSkyDetect; //对空检测器算法参数
// 管道参数
SINT32 nPipeRadiusSearch; //管道搜索范围直径 -- 搜索
SINT32 nPipeRadiusLock; //管道搜索范围直径 -- 锁定
SINT32 nPipeRadiusTrack; //管道搜索范围直径 -- 跟踪
SINT32 nPipeRadiusLost; //管道搜索范围直径 -- 跟踪丢失
SINT32 nAwsFrmNumScan; //管道目标的确认帧数- 扫描模式 4
SINT32 nAwsFrmNumStare; //管道目标的确认帧数- 凝视模式 4
SINT32 nPipeDelMinScan; //管道最少延迟删除帧数- 扫描模式 4
SINT32 nPipeDelMinStare; //管道最少延迟删除帧数- 凝视/跟踪模式 4
FLOAT32 fA; //轨迹滤波器AB参数
FLOAT32 fB; //轨迹滤波器AB参数
SINT32 nLockPointW; //点选锁定目标默认宽度
SINT32 nLockPointH; //点选锁定目标默认高度
BBOOL bCloseBadPointPipe; //关闭坏点管道
// 跟踪控制
Param_SkyTracker stSkyParam; //对空跟踪器算法参数
Param_GroundTracker stGrdParam; //对地跟踪算法参数
// 日志控制
UBYTE8 nLogLevel; //允许的日志级别
BBOOL bMutiTrack; //是否多目标跟踪
UBYTE8 res[200];//预留
}ARIDLL_PARMA;
#endif
typedef enum tagSubTypeUAV
{
NOTKONWN = 0, // 未知类型
FixedWing = 1, // 固定翼无人机
Bird = 2, // 鸟
TargetDrone = 3, // 靶机
FourRotorDrone = 4, // 四旋翼无人机
PatrolMissile = 5, // 巡飞弹
SixRotorDrone = 6 // 六旋翼无人机
}SubTypeUAV;
typedef struct tagTSky_Output
{
SizeType m_SizeMode; // 跟踪目标类型
Param_SkyTracker mTrakingPara_Output; // 对空跟踪输出参数
SINT32 m_nTargetNum; // 对空跟踪局部目标检测个数
TARGET_OBJECT * mTarget_Array; // 对空跟踪局部目标检测队列
SINT32 m_nMatcherNum; // 对空模板匹配目标检测个数
MATCHER_TARGET* mMatcher_Array; // 对空模板匹配目标检测队列
OBJECTSTATUS ObjectStatusTST; // 小目标跟踪输出的目标状态 //BYTES: 3*1 + 28*4 = 115
OBJECTSTATUS ObjectStatusCEND; // 形心跟踪输出的目标状态 //BYTES: 3*1 + 28*4 = 115
OBJECTSTATUS ObjectStatusKCF; // KCF跟踪输出的目标状态
OBJECTSTATUS ObjectStatusDesc; // 决策跟踪输出的目标状态
}TSky_Output;
#endif