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.

298 lines
11 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_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);