// 小目标检测功能的接口文件 /*********版权所有(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_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 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #ifndef _DAT_PARAMETERS_ #define _DAT_PARAMETERS_ //定义面目标检测算法参数结构体 typedef struct tagDATParameters { //单帧检测目标最大个数 SINT32 nFrmObjsMax; //单帧检测目标个数上限 //搜索区域降采样倍数 SINT32 nDSmpScale; //搜索区域降采样倍数 //梯度分割阈值 SINT32 nGradThresMin; //梯度阈值下限(2倍降采样) //灰度亮暗目标分割阈值 SINT32 nGrayThresMinBright; //亮灰度阈值下限(2倍降采样) SINT32 nGrayThresMinDark; //暗灰度阈值下限(2倍降采样) //面目标检测类型 UBYTE8 nDetectGrayType; //面目标检测类型 1-只检测亮目标,2-只检测暗目标,3-同时检测亮暗目标 //目标合并距离 SINT32 nObjCombineDist; //目标合并距离 //目标确认 SINT32 nObjSizeMin; //目标大小阈值下限(2倍降采样) SINT32 nObjSizeMax; //目标大小阈值上限(2倍降采样) SINT32 nObjWidthMax; //目标宽度上限(2倍降采样) SINT32 nObjHeightMax; //目标高度上限(2倍降采样) FLOAT32 fObjWHRatioMin; //目标宽/高比下限(2倍降采样) FLOAT32 fObjWHRatioMax; //目标宽/高比上限(2倍降采样) FLOAT32 fObjRectRatioMin; //目标矩形度下限(2倍降采样) FLOAT32 fObjStdMin; //目标方差下限 SINT32 nObjBkgGrayDiffMin; //目标背景灰度差下限 FLOAT32 fBkgGrayDiffCoeff; //背景灰度差系数 FLOAT32 fgdk; //目标检测的gdk下限 -- 用于自适应调节gdk //面目标检测去虚警开关(上位机软件界面可调) UBYTE8 bUseDeFA_ObjVarMin; //是否使用去虚警策略 - 邻域方差下限限制。0-不使用,1-使用。 UBYTE8 bUseDeFA_Size; //是否使用去虚警策略 - 目标大小限制。0-不使用,1-使用。 UBYTE8 bUseDeFA_WHRatio; //是否使用去虚警策略 - 目标宽高比限制。0-不使用,1-使用。 UBYTE8 bUseDeFA_RectRatio; //是否使用去虚警策略 - 目标矩形度限制。0-不使用,1-使用。 UBYTE8 bUseDeFA_BTGrayMin; //是否使用去虚警策略 - 极值点与背景最小灰度差下限限制。0-不使用,1-使用 }DAT_PARAMETERS; #endif //////////////////////////////////////////////////////////////////////////////// //--数据结构定义 //////////////////////////////////////////////////////////////////////////////// //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //定义面目标检测算法输入结构体 typedef struct tagDATInput { //搜索区域 CENTERRECT crnSrRect; //搜索区域宽高 //梯度分块尺寸 SINT32 nGradRadius; //梯度块半径 SINT32 nGradRadiusTG; //梯度块内目标半径 SIZE32S snGradBlkSize; //梯度块尺寸 //灰度分块尺寸 SINT32 nGrayRadius; //灰度块半径 SINT32 nGrayRadiusTG; //灰度块内目标半径 SIZE32S snGrayBlkSize; //灰度块尺寸 //搜索区域分块个数 SIZE32S snSrBlksNum; //搜索区域分块个数 }DAT_INPUT; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //定义面目标检测算法输出结果结构体 #ifndef _DAT_OUTPUT_ #define _DAT_OUTPUT_ typedef struct tagDATOutput { //灰度图指针 UINT16* pnSrDSmpImg; //搜索区域2倍降采样后灰度图像指针(2倍降采样) SINT32* pnGrayInt; //灰度幅值积分图指针 UBYTE8* pnGrayBinary; //灰度二值化图像指针 UBYTE8* pnGrayBinaryDark; //暗目标灰度二值化图像指针 UBYTE8* pnGrayBinaryBright; //亮目标灰度二值化图像指针 //梯度图指针 UINT16* pnGradMag; //梯度幅值图指针 SINT32* pnGradInt; //梯度幅值积分图指针 UBYTE8* pnGradBinary; //梯度二值化图像指针 //搜索区域 MINMAXRECT32S mmrSrRect; //搜索区域边界 SIZE32S snSrDSmp; //搜索区域降采样后宽高 SIZE32S snSrDSmpInt; //搜索区域降采样后积分图宽高 MINMAXRECT32S* pmrnBlksRect;//搜索区域分块边界矩形数组 //用于向外部导出二值分割图,未实际分配地址 UBYTE8* DAT_pBinary_Gray; //DAT: 灰度二值化图像(2倍降采样) UBYTE8* DAT_pBinary_Mag; //DAT: 梯度二值化图像(2倍降采样) //面目标检测个数结果 SINT32 nFrmObjsCnt; //当前帧目标个数 }DAT_OUTPUT; #endif // 小目标检测模块接口定义 // 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, SINT32 nWidth, SINT32 nHeight,CENTERRECT mmCenterRect, GLB_STATUS nStatus) = 0; // 设置分块方案 virtual void SetSearchBLK(DST_INPUT inputBLK) = 0; // 设置小目标合并距离 virtual void SetCombinDist(SINT32 ndistance) = 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 BBOOL DST_PipeTargetReDetect(GD_VIDEO_FRAME_S img, SINT32 nWidth, SINT32 nHeight, POINT32F ptPipeCenPos, SPEED32F sfPipeSpeed, MINMAXRECT mrnSrRect, TARGET_OBJECT* ptTarget, 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, 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, SINT32 nWidth, SINT32 nHeight, CENTERRECT mmCenterRect, GLB_STATUS nStatus) = 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);