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.

295 lines
11 KiB

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