// 小目标检测功能的接口文件 /*********版权所有(C)2024,武汉高德红外股份有限公司*************** * 文件名称:API_DetectAreaObj.h * 文件标识:面目标检测 * 内容摘要:基于梯度分割与灰度分割的面目标检测(Y16) * 其它说明: * 当前版本: * 创建作者: * 创建日期: *******************************************************************/ #pragma once #ifdef _WIN32 #define STD_DET_API __declspec(dllexport) #else #define STD_DET_API __attribute__ ((visibility("default"))) #endif #include "Arith_SysStruct.h" // 检测器参数 typedef struct tagParam_Detctor { bool bEnableDST; bool bEnableDAT; bool bEnableDim; float fgdk;//小目标检测snr阈值 int fAreaDetectGrayDiffThre;//面目标检测灰度差阈值 int fAreaDetectGradDiffThre;//面目标检测梯度差阈值 int nGrayType;//检测灰度类型 }Param_Detctor; #ifndef _DST_INPUT_ #define _DST_INPUT_ typedef struct tagDSTInput { //搜索区域 CENTERRECT crCenterRect; //搜索区域宽高 MINMAXRECT mmCenterRect; //搜索区域边界 //半自动截获搜索区域 CENTERRECT crnSemiSrRect; //半自动截获搜索区域中心矩形 MINMAXRECT mmnSemiSrRect; //半自动截获搜索区域边界矩形 //分块大小 SINT32 nBlkHeight; //分块高 SINT32 nBlkWidth; //分块宽 //搜索区域内分块个数 SINT32 nBlkNumH; //高度上分块个数 SINT32 nBlkNumW; //宽度上分块个数 SINT32 nBlkNum; //总分块个数 }DST_INPUT; #endif //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //定义小目标检测算法输出结果结构体 #ifndef _DST_OUTPUT_ #define _DST_OUTPUT_ typedef struct tagDSTOutput { //小目标检测结果 SINT32 nFrmObjsCnt; //当前帧目标个数 //弱小目标强制搜索 UINT16* pxSrImg; //弱小目标强制搜索区域图像 SIZE32S snDimSrImgSize; //弱小目标强制搜索区域图像图像尺寸 SINT32 nFrmDimObjsCnt; //当前帧弱小目标个数 SINT32 nDimPriorObjId; //当前帧疑似弱小目标的数组编号 SINT32 nDimFrmsCnt; //弱小目标检测帧计数器 SINT32 nDimSmpScale; //弱小目标搜索区域降采样倍数 SIZE32S snDimSrSmpImgSize; //弱小目标强制搜索区域降采样图像尺寸 //坏点判断结果 SINT32 nBadPntCnt; //坏点个数 SINT32 nExitFixedFA; //恒虚警退出帧计数 CENTERRECT crCenterRect; //搜索区域宽高 }DST_OUTPUT; #endif #ifndef _DST_PARAMETERS_ #define _DST_PARAMETERS_ //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //定义小目标检测算法参数结构体 typedef struct tagDSTParameters { //小目标检测参数(上位机软件界面可调) SINT32 nObjCombineDist; //相邻两个极大值点合并为一个目标的距离阈值 FLOAT32 fgdk; //目标检测的gdk下限 -- 用于自适应调节gdk FLOAT32 fKernalBGStdMin; //极大值滤波窗口-背景标准差截断下限 FLOAT32 fKernalBGStdMax; //极大值滤波窗口-背景标准差截断上限 SINT32 nObjSizeMin; //目标大小阈值下限 SINT32 nObjSizeMax; //目标大小阈值上限 SINT32 nObjWHRatioMethod; //目标宽高比计算方式。1-总宽度/总高度,2-最大行宽度/总高度 FLOAT32 fObjWHRatioMin; //目标宽/高比下限 FLOAT32 fObjWHRatioMax; //目标宽/高比上限 FLOAT32 fObjRectRatioMin; //目标矩形度下限 SINT32 nBGObjNumThres; //目标背景邻域中虚警点的个数下限 SINT32 nBTGrayMinThres; //极值点与背景最小灰度差下限 //小目标检测去虚警开关(上位机软件界面可调) UBYTE8 bUseDeFA_VarMin; //是否使用去虚警策略 - 邻域方差下限限制。0-不使用,1-使用。 UBYTE8 bUseDeFA_VarMax; //是否使用去虚警策略 - 邻域方差上限限制。0-不使用,1-使用。 UBYTE8 bUseDeFA_Size; //是否使用去虚警策略 - 目标大小限制。0-不使用,1-使用。 UBYTE8 bUseDeFA_WHRatio; //是否使用去虚警策略 - 目标宽高比限制。0-不使用,1-使用。 UBYTE8 bUseDeFA_RectRatio; //是否使用去虚警策略 - 目标矩形度限制。0-不使用,1-使用。 UBYTE8 bUseDeFA_BGFACnt; //是否使用去虚警策略 - 邻域虚警点个数限制。0-不使用,1-使用。 UBYTE8 bUseDeFA_BTGrayMin; //是否使用去虚警策略 - 极值点与背景最小灰度差下限限制。0-不使用,1-使用。 UBYTE8 bUseDeFA_CenFlag; //是否使用去虚警策略 - 形心为目标点。0-不使用,1-使用。 UBYTE8 bUseDeFA_XYPrj; //是否使用去虚警策略 - X、Y方向投影连续性。0-不使用,1-使用。 //小目标检测类型 UBYTE8 nDetectGrayType; //小目标检测类型 1-只检测亮目标,2-只检测暗目标,3-同时检测亮暗目标 //弱小目标检测 BBOOL bEnableDimDetect; //弱小目标检测算法开关 BBOOL bDimDetecting; //弱小目标检测算法状态。1-正在进行弱小目标检测,0-未进行弱小目标检测。 FLOAT32 fDimGdk; //弱小目标检测的gdk下限 -- 用于自适应调节gdk //二次检测开关 BBOOL bEnableSecDetect; //二次检测开关。0-不允许,1-允许。 BBOOL bSecDetecting; //20170313,二次检测状态。0-未进行二次检测,1-正在进行二次检测。 // 其他参数 20181226[debug] ds 模板尺寸 SINT32* pnFilter; UBYTE8 nFilterBGW; UBYTE8 nFilterTGW; }DST_PARAMETERS; #endif //////////////////////////////////////////////////////////////////////////////// //--数据结构定义 //////////////////////////////////////////////////////////////////////////////// //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //定义面目标检测算法输入结构体 typedef struct tagDATInput { //搜索区域 CENTERRECT crnSrRect; //搜索区域宽高 //梯度分块尺寸 SINT32 nGradRadius; //梯度块半径 SINT32 nGradRadiusTG; //梯度块内目标半径 SIZE32S snGradBlkSize; //梯度块尺寸 //灰度分块尺寸 SINT32 nGrayRadius; //灰度块半径 SINT32 nGrayRadiusTG; //灰度块内目标半径 SIZE32S snGrayBlkSize; //灰度块尺寸 //搜索区域分块个数 SIZE32S snSrBlksNum; //搜索区域分块个数 }DAT_INPUT; // 小目标检测模块接口定义 // class STD_DET_API API_DetectSmallObj { public: virtual ~API_DetectSmallObj() = default; // 按照最大使用范围进行初始化 virtual BBOOL Init(SINT32 nWidth, SINT32 nHeight, CENTERRECT mmCenterRect) = 0; // 小目标检测 virtual SINT32 Detect(GD_VIDEO_FRAME_S img, CENTERRECT mmCenterRect, GLB_STATUS nStatus) = 0; // 设置分块方案 virtual void SetSearchBLK(DST_INPUT inputBLK) = 0; // 设置小目标合并距离 virtual void SetCombinDist(SINT32 ndistance) = 0; // 设置检测基础阈值 virtual void SetDetSnr(FLOAT32 fSNR) = 0; // 获取小目标检测队列 virtual TARGET_OBJECT* GetTargetArray() = 0; // 获取当前帧小目标检测个数 virtual SINT32 GetTargetNum() = 0; // 设置当前帧小目标检测个数 virtual void SetTargetNum(SINT32 num) = 0; // 获取小目标检测算法参数 virtual DST_PARAMETERS* GetDstParm() = 0; // 获取小目标检测开关状态 virtual BBOOL getDstDetState() = 0; // 设置小目标检测开关状态 virtual void setDstDetState(BBOOL bEnableState) = 0; // 设置小目标检测算法参数 virtual void setDstParm(Param_SkyDetect* param) = 0; // 获取小目标检测算法输出 virtual DST_OUTPUT* getDST_stOutput() = 0; // 小目标跟踪阶段二次检测 virtual BBOOL DST_PipeTargetReDetect(GD_VIDEO_FRAME_S img, SINT32 nWidth, SINT32 nHeight, POINT32F ptPipeCenPos, SPEED32F sfPipeSpeed, MINMAXRECT mrnSrRect, TARGET_OBJECT* ptTarget, SINT32* bPipeTargetIndex, TARGET_OBJECT* ptTargetArray, SINT32* pnFrmObjsCnt) = 0; // 小目标跟踪阶段三次检测 virtual BBOOL DST_PipeTargetRReDetect(GD_VIDEO_FRAME_S img, SINT32 nWidth, SINT32 nHeight, POINT32F ptPipeCenPos, SPEED32F sfPipeSpeed, MINMAXRECT mrnSrRect, TARGET_OBJECT* ptTarget, SINT32* bPipeTargetIndex, TARGET_OBJECT* ptTargetArray, SINT32* pnFrmObjsCnt) = 0; virtual POINT16S* getMaxPoint() = 0; public: static API_DetectSmallObj* Create(SINT32 nWidth, SINT32 nHeight); static API_DetectSmallObj* Create(SINT32 nWidth, SINT32 nHeight, CENTERRECT mmCenterRect); static void Destroy(API_DetectSmallObj* obj); }; // 面目标检测模块接口定义 // class STD_DET_API API_DetectAreaObj { public: virtual ~API_DetectAreaObj() = default; virtual BBOOL Init(SINT32 nWidth, SINT32 nHeight, CENTERRECT mmCenterRect) = 0; virtual SINT32 Detect(GD_VIDEO_FRAME_S img, CENTERRECT mmCenterRect, SINT32 nObjCombineDist, GLB_STATUS nStatus) = 0; // 获取面目标分割特性 virtual SINT32 GetAreaSegInfo(GD_VIDEO_FRAME_S img, CENTERRECT mmCenterRect, GLB_STATUS nStatus, PixcelsCnt *pCnt) = 0; // 获取面目标检测队列 virtual TARGET_OBJECT* GetTargetArray() = 0; // 获取当前帧面目标检测个数 virtual SINT32 GetTargetNum() = 0; // 设置当前帧面目标检测个数 virtual void SetTargetNum(SINT32 num) = 0; // 获取面目标检测队列 virtual OBJECTSTATUS* GetTargetMatched() = 0; // 获取面目标检测开关状态 virtual BBOOL getDatDetState() = 0; // 设置面目标检测开关状态 virtual void setDatDetState(BBOOL bEnableState) = 0; // 获取面目标检测算法参数 virtual DAT_PARAMETERS* GetDatParm() = 0; // 设置面目标检测算法参数 virtual void setDatParm(Param_SkyDetect* param) = 0; // 获取面目标检测算法输出 virtual DAT_OUTPUT* getDAT_stOutput() = 0; // 获取面目标检测输入参数 virtual DAT_INPUT* getDatInput() = 0; public: static API_DetectAreaObj* Create(SINT32 nWidth, SINT32 nHeight); static API_DetectAreaObj* Create(SINT32 nWidth, SINT32 nHeight, CENTERRECT mmCenterRect); static void Destroy(API_DetectAreaObj* obj); // 面目标检测的一些静态工具,其他模块可以直接调用 // 以bbox强制提取一个面目标,用于小目标转面目标。CEND强制初始化 }; STD_DET_API TARGET_OBJECT CreateNewTarget(GD_VIDEO_FRAME_S img, SINT32 nWidth, SINT32 nHeight, RECT32S bbox, SINT32 unFrmId); STD_DET_API void DAT_CalRectObjSNR_IMG(GD_VIDEO_FRAME_S img, SINT32 nWidth, SINT32 nHeight, MINMAXRECT32S mrnObj, SINT32 nBkgRadius, OBJECTSNR* objSNR, UBYTE8 nDetectGrayType); STD_DET_API void DAT_CalRectObjSNR_UINT16(UINT16* pnSrDSmpImg, SINT32 nWidth, SINT32 nHeight, MINMAXRECT32S mrnObj, SINT32 nBkgRadius, OBJECTSNR* objSNR, UBYTE8 nDetectGrayType);