|
|
// 小目标检测功能的接口文件
|
|
|
/*********版权所有(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);
|
|
|
|
|
|
|
|
|
|
|
|
|