/*********版权所有（C）2020，武汉高德红外股份有限公司***************************************
 * 文件名称： Arith_Global.h
 * 文件标识：
 * 内容摘要： 业务无关的通用符号系统
 * 其它说明：
 * 当前版本：
 * 创建作者：软件室算法组
 * 创建日期：2020/02/25
 * 包含关系：本文件被全局引用，除运行平台系统文件外不得添加任何依赖
 *****************************************************************************************/
#ifndef _ARITH_SYSSTRUCT_
#define _ARITH_SYSSTRUCT_

#include "Arith_CommonDef.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               100  

// 目标尺寸类型定义
#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          500 //默认记忆跟踪帧数


//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 DT_TARGET_MAX_NUM           100   // 定义检测器最大检测个数

#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        50//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                  //最大值浮点数精度
#define FEPSILON                0.000001f                  //最小值-浮点数精度2

// 角度输入输出限值（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 ) )

// 目标类别来源标识
typedef enum tagemClsSrc
{
    Arith_CLS_DST = 1,
    Arith_CLS_Area = 2,
    Arith_CLS_Lands = 3,
    Arith_CLS_Hole = 4,
    Arith_CLS_SVM = 5,
    Arith_CLS_AID = 6,
    Arith_CLS_Manual = 7
}ClsSrc;

typedef struct tagPixcelsCnt
{
    SINT32 nObjCnt;             //目标的像素数
    SINT32 nObjXHoleCnt;        //X方向的孔洞的像素数
    SINT32 nObjYHoleCnt;        //Y方向的孔洞的像素数
}PixcelsCnt;

// 定义目标滤波结构体(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; // 记录目标被加入管道时，与该管道中心的距离
    FLOAT32   nInPipeDistIou;
    UBYTE8 ubDirection;

    // 来源
    ObjSrc nObjTypeSrc; // 目标来源 01-小目标 02-面目标 03-AI目标 04-KCF 05-TLD  06-手动起
    FLOAT32 fMatchConf; //跟踪阶段匹配度
    ClsSrc  emClsSrc;   // 目标类别来源

} 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
    UINT16 pxObjGray;     // 目标灰度值
    FLOAT32 fSNR;         // 目标信噪比
    FLOAT32 fObjStd;      // 目标方差 4
    FLOAT32 fBGStd;       // 目标背景方差
    UINT16 fGrayFilter;  // 灰度滤波值
    POINT32F ptCentroid;  // 质心定位置

    ANGLE32F afAngle;     // 目标伺服角度（方位角、俯仰角）  //BYTES: 2*4=8
    SPEED32F sfAglSpeed;  // 目标角速度（方位角速度、俯仰角速度）  //BYTES: 2*4=8
    ANGLE32F afAngleBorn; // 目标初始伺服角度（方位角、俯仰角）  //BYTES: 2*4=8
    FLOAT32 fConfidence;  // 置信度
    SINT32  unClsType;    // 目标类别
    ClsSrc  emClsSrc;     // 目标类别来源

    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;        // 导引更新标志，多目标共享，下一次引导覆盖当前批目标

    // 多目标引导锁定接口，最多支持10批次目标
    TargetGuide target[GLB_GUIDE_TARGET_NUM];

} GLB_PCCOMMAND;

//+++++++定义算法控制参数结构体
typedef struct tagGlbParameters
{
    GLB_SYS_MODE nSysMode;              // 系统工作模式（响应外部下发）
    GLB_STATUS nStatus;                 // 当前工作状态（算法自控）
    GLB_STATUS nStatusBeforeLock;       // 锁定前工作状态
    SINT32  nCatchFlag;                 // 捕获过程标记，处理初始跟踪到稳定跟踪过程
    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;               // 导引位置在当前视场标志

    // 多目标引导信息
    TargetGuide targetGuide[GLB_GUIDE_TARGET_NUM];
} 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跟踪输出的目标状态

    //对地跟踪信息调试
    float fKCFRes;                  //KCF响应，
    float fAITRes;                  // AI响应，
    int  nLearnCnt;                 //TLD学习计数
    int  nTLDNum;                   // TLD聚类检测个数
    float fMaxNNConf;               //TLD检测最大响应
    int  nAITNum;                   //AI聚类检测个数()
    int  nAIJamCnt;                 //AI干扰状态
    int  nAIChangCnt;               //AI遮挡感知状态
    float fLargeResTH;              //KCF重捕阈值
    float fArrKCFRes;

    //对空调试信息
    bool            sky_bComplexEnv;        // 复杂背景标志位
    bool            sky_bInterferenceMem;   // 干扰近记忆标志位
    bool            sky_bResetByAIDet;      // 跟踪被AI重置标记
    int             sky_nClsType;           // 目标类型
    unsigned char   sky_nClassSource;       // 目标类别输出来源
    unsigned char   sky_nDecisionStatus;    // 决策状态，输出来源
    int             sky_nObjTypeSrc;        // 目标跟踪来源
    int             sky_TrkDownRatio;       // 对空跟踪降采样倍数
    int             sky_TrkMemFrm;          // 跟踪目标进记忆帧数
    int             sky_nTrkCX;             // 决策目标信息中心点X
    int             sky_nTrkCY;             // 决策目标信息中心点Y
    int             sky_nTrkW;              // 决策目标信息宽度
    int             sky_nTrkH;              // 决策目标信息高度
    int             sky_nTrkPxlsCnt;        // 跟踪目标像素数
    float           sky_fTrkConf;           // 跟踪目标置信度


    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;          // 管道目标类别
    ClsSrc emClsSrc;           // 目标类别来源
    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;                 //是否警戒周边干扰
}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;           //允许的日志级别

    UBYTE8 res[200];//预留
}ARIDLL_PARMA;
#endif


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
