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.

341 lines
14 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// 小目标检测功能的接口文件
/*********版权所有C2024武汉高德红外股份有限公司***************
* 文件名称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);