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