1.主跟踪目标后的背景管道输出抑制

2.四邻域提取取像素位置bug修复
3.默认打开面目标检测,增加跟踪稳定性
4.面目标检测灰度类型参数全局与局部保持一致
5.灰度分割灰度残差图无符号16位改为32位,避免溢出
main
yll 4 months ago committed by admin
parent b57ad52a0d
commit f6a3bede36

@ -660,7 +660,7 @@ void Arith_EOController::Arith_SetRunTimeParam(ARIDLL_PARMA config)
g_GLB_Detectors->SetParam(para);//设置参数
// 全局检测器参数共享给局部检测器参数
//memcpy(&config.stSkyParam.prmTSkyDet, &config.PrmSkyDetect, sizeof(Param_SkyDetect));
memcpy(&config.stSkyParam.prmTSkyDet, &config.PrmSkyDetect, sizeof(Param_SkyDetect));
// 设置管道实例参数
@ -702,6 +702,11 @@ void Arith_EOController::Arith_SetRunTimeParam(ARIDLL_PARMA config)
{
LOG_SETLEVEL(config.nLogLevel);
}
if (GLB_SCEN_MODE::GLB_SCEN_SKY == m_SceneType)
{
g_pSkyTracker->pSkyTracker->SetSkyParam(&g_GLB_stArithPara.stSkyParam);
}
}
// 读取运行时跟踪参数

@ -537,9 +537,14 @@ void SkyTracker::SetSkyParam(Param_SkyTracker * stSkyParam)
//mTrakingPara.Sky_bEnableTrackSA = stSkyParam->Sky_bEnableTrackSA;
//mTrakingPara.Sky_bEnableKCF = stSkyParam->Sky_bEnableKCF; // 内部自动调整关闭因为清空了kcf信息强制打开可能会导致程序崩溃不建议设置kcf算法开关
if (pSATracker)
{
pSATracker->m_TSA_Param.Sky_bUseAIDet = stSkyParam->Sky_bUseAIDet;
pSATracker->m_TSA_Param.nUseAIDetFeq = stSkyParam->Sky_nUseAIDetFeq;
pSATracker->SetParam(stSkyParam->prmTSkyDet);//设置参数
}
skyControlInfo.nTrackMemFrmNum = mTrakingPara.Sky_nTrackMemFrmNum;
}
@ -967,7 +972,7 @@ void SkyTracker::SetTrackModeAuto(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input)
pKCFTracker->KCF_CleanUpObjectTracker();
//清空CEND、KCF跟踪算法
memset(pObjStatusSA, 0, sizeof(OBJECTSTATUS));
//memset(pObjStatusSA, 0, sizeof(OBJECTSTATUS));
memset(pObjStatusKCF, 0, sizeof(OBJECTSTATUS));
//小目标和面目标相互切换计数器清零

@ -631,15 +631,16 @@ void SA_Tracker::SARegionDet(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, SINT3
//////////////////////////小面目标检测////////////////////////////////////
BBOOL bEnableAreaObjDetect = FALSE;
float fObjAglSpeed = ABS(m_LockingPipe->sfAglSpeed.vx) + ABS(m_LockingPipe->sfAglSpeed.vy);
// 像素数超过面目标检出下限或者速度较快,开启面目标检测算法
if ((m_ObjStatus.fObjPxlsCnt > DAT_TARGET_PXLS_MIN) || (fObjAglSpeed > 0.01f))
{
//// 像素数超过面目标检出下限或者速度较快,开启面目标检测算法
//if ((m_ObjStatus.fObjPxlsCnt > DAT_TARGET_PXLS_MIN) || (fObjAglSpeed > 0.01f))
//{
// bEnableAreaObjDetect = true;
//}
//else
//{
// bEnableAreaObjDetect = false;
//}
bEnableAreaObjDetect = true;
}
else
{
bEnableAreaObjDetect = false;
}
// 跟踪阶段,合并距离关键参数
SINT32 nCombinDist = m_TSA_Input.nBlkWidth / 2 + 1;
m_TSA_output.crCenterRect = m_TSA_Input.crCenterRect;
@ -978,6 +979,15 @@ FLOAT32 SA_Tracker::cos_sim(POINT32F v1, POINT32F v2)
return (fcosSim + 1) / 2.0f;
}
void SA_Tracker::SetParam(Param_SkyDetect para)
{
pDST_Module->setDstDetState(para.bEnableDetcetSmallTarget); // 小目标检测开关设置
pDST_Module->setDstParm(&para); // 小目标检测参数设置
pDAT_Module->setDatDetState(para.bEnableDetcetAreaTarget); // 面目标检测开关设置
pDAT_Module->setDatParm(&para); // 面目标检测参数设置
}
// 运动相似度
FLOAT32 SA_Tracker::Similarity_Move(PIPE* pPipe, TARGET_OBJECT* ptTarget, FLOAT32 fAglReso)
{

@ -185,6 +185,8 @@ public:
// 获取小目标检测模块
API_DetectSmallObj* getDSTmodule();
// 检测器参数设置
void SetParam(Param_SkyDetect para);
// 对空所有跟踪器统一输出,便于融合处理
OBJECTSTATUS m_ObjStatus;

@ -223,6 +223,33 @@ FLOAT32 SIoUB(RECT16S A, RECT16S B)
return IOUvalue;
}
FLOAT32 SIoUB_Expand(RECT16S A, RECT16S B, SINT32 expand)
{
FLOAT32 IOUvalue = 0.0;
FLOAT32 IOUvalueA = 0.0;
SINT16 x1 = A.x - expand;
SINT16 y1 = A.y - expand;
SINT16 x2 = A.x + A.w + expand - 1;
SINT16 y2 = A.y + A.h + expand - 1;
SINT16 u1 = B.x - expand;
SINT16 v1 = B.y - expand;
SINT16 u2 = B.x + B.w + expand - 1;
SINT16 v2 = B.y + B.h + expand - 1;
FLOAT32 intersA = (FLOAT32)A.w * A.h;//目标A面积
FLOAT32 inters = MAX((MIN(x2, u2) - MAX(x1, u1)) + 1, 0.f) * MAX((MIN(y2, v2) - MAX(y1, v1)) + 1, 0.f);//交集
//float unions = (x2 - x1) * (y2 - y1) + (u2 - u1) * (v2 - v1) - inters;//并集
if (intersA > EPSILON)
{
IOUvalueA = 1.0f * inters / intersA;
}
IOUvalue = IOUvalueA;//交集占比最大值
return IOUvalue;
}
// 公共宽度占据B框宽度和高度的比例
void Overlap_WH_Bratio(RECT32F A, RECT32F B, FLOAT32 *Overlap_Wb, FLOAT32 *Overlap_Hb)
{

@ -31,6 +31,8 @@ FLOAT32 FIoUB(RECT32F A, RECT32F B);
FLOAT32 SIoUB(RECT16S A, RECT16S B);
FLOAT32 SIoUB_Expand(RECT16S A, RECT16S B, SINT32 expand);
FLOAT32 IoUC(RECT32F A, RECT32F B);
FLOAT32 IoUA32S(RECT32S *A, RECT32S *B);

@ -238,7 +238,7 @@ void DetectAreaObj::DAT_MallocMemory(SINT32 nWidth, SINT32 nHeight, CENTERRECT m
DAT_pBinary_Mag = new UBYTE8[DAT_CENTER_REGION_SIZE];
DAT_pBinary_Gray = new UBYTE8[DAT_CENTER_REGION_SIZE];
DAT_pBinary_GrayNew = new UBYTE8[DAT_CENTER_REGION_SIZE];
DAT_DIFF = new SINT16[DAT_CENTER_REGION_SIZE];
DAT_DIFF = new SINT32[DAT_CENTER_REGION_SIZE];
DAT_pxDetectAreaGradIntegral = new SINT32[DAT_CENTER_REGION_SIZE];
}
@ -555,7 +555,7 @@ SINT32 DetectAreaObj::DAT_DetectAreaTarget(GD_VIDEO_FRAME_S img, GLB_STATUS nSta
if (GLB_OBJ_GRAY_BRIGHT == m_DAT_stPara.nDetectGrayType)
{
SINT16* pnTgBgDiff = (SINT16*)DAT_DIFF;
SINT32* pnTgBgDiff = (SINT32*)DAT_DIFF;
//20161115计算背景目标灰度残差图
DAT_CalcTgBgDiff(m_DAT_stOutput.pnSrDSmpImg, snSrDSmp, m_DAT_stOutput.pnGrayInt,
@ -622,7 +622,7 @@ SINT32 DetectAreaObj::DAT_DetectAreaTarget(GD_VIDEO_FRAME_S img, GLB_STATUS nSta
}
else if (GLB_OBJ_GRAY_DARK == m_DAT_stPara.nDetectGrayType)
{
SINT16* pnTgBgDiff = (SINT16*)DAT_DIFF;
SINT32* pnTgBgDiff = (SINT32*)DAT_DIFF;
//20161115计算背景目标灰度残差图
DAT_CalcTgBgDiff(m_DAT_stOutput.pnSrDSmpImg, snSrDSmp, m_DAT_stOutput.pnGrayInt,
@ -690,7 +690,7 @@ SINT32 DetectAreaObj::DAT_DetectAreaTarget(GD_VIDEO_FRAME_S img, GLB_STATUS nSta
{
SINT32 nFrmBrightObjCnt = 0;
SINT32 nFrmDarkObjCnt = 0;
SINT16* pnTgBgDiff = (SINT16*)DAT_DIFF;
SINT32* pnTgBgDiff = (SINT32*)DAT_DIFF;
//20161112Whao初始化亮暗目标数组
TARGET_OBJECT* ptDATResultBright = (TARGET_OBJECT*)DAT_Target_Bright;
@ -778,7 +778,7 @@ SINT32 DetectAreaObj::DAT_DetectAreaTarget(GD_VIDEO_FRAME_S img, GLB_STATUS nSta
return nObjsCnt;
}
void dfs(unsigned char * grid, int nr, int nc, int r, int c)
void dfs(unsigned char* grid, int nr, int nc, int r, int c)
{
grid[r * nc + c] = '\0';
if (r - 1 >= 0 && grid[(r - 1) * nc + c] == '\x1') dfs(grid, nr, nc, r - 1, c);
@ -787,7 +787,7 @@ void dfs(unsigned char * grid, int nr, int nc, int r, int c)
if (c + 1 < nc && grid[r * nc + (c + 1)] == '\x1') dfs(grid, nr, nc, r, c + 1);
}
int numIslands(unsigned char *grid, int nr, int nc)
int numIslands(unsigned char* grid, int nr, int nc)
{
int num_islands = 0;
for (int r = 0; r < nr; ++r)
@ -973,7 +973,7 @@ SINT32 DetectAreaObj::DAT_ObjectAreaSeg(GD_VIDEO_FRAME_S img, CENTERRECT crnSrRe
if (GLB_OBJ_GRAY_BRIGHT == m_DAT_stPara.nDetectGrayType)
{
SINT16* pnTgBgDiff = (SINT16*)DAT_DIFF;
SINT32* pnTgBgDiff = (SINT32*)DAT_DIFF;
//20161115计算背景目标灰度残差图
DAT_CalcTgBgDiff(m_DAT_stOutput.pnSrDSmpImg, snSrDSmp, m_DAT_stOutput.pnGrayInt,
@ -997,7 +997,7 @@ SINT32 DetectAreaObj::DAT_ObjectAreaSeg(GD_VIDEO_FRAME_S img, CENTERRECT crnSrRe
}
else if (GLB_OBJ_GRAY_DARK == m_DAT_stPara.nDetectGrayType)
{
SINT16* pnTgBgDiff = (SINT16*)DAT_DIFF;
SINT32* pnTgBgDiff = (SINT32*)DAT_DIFF;
//20161115计算背景目标灰度残差图
DAT_CalcTgBgDiff(m_DAT_stOutput.pnSrDSmpImg, snSrDSmp, m_DAT_stOutput.pnGrayInt,
@ -1154,8 +1154,8 @@ void DetectAreaObj::DAT_CleanUpFrameDetectOutput(void)
memset(ptTargetArrayCombine, 0, sizeof(TARGET_OBJECT) * DAT_TARGET_NUM_MAX);
//20161116初始化灰度残差图
SINT16* pnTgBgDiff = (SINT16*)DAT_DIFF;
memset(pnTgBgDiff, 0, sizeof(SINT16) * DAT_CENTER_REGION_SIZE);
SINT32* pnTgBgDiff = (SINT32*)DAT_DIFF;
memset(pnTgBgDiff, 0, sizeof(SINT32) * DAT_CENTER_REGION_SIZE);
}
@ -1387,7 +1387,7 @@ void DetectAreaObj::DAT_GradSegmentation(UINT16* pnImg, SIZE32S snImgSize,
void DetectAreaObj::DAT_CalcTgBgDiff(UINT16* pFrame, SIZE32S snImgSize,
SINT32* pnIntImg, SIZE32S snIntImgSize,
SINT32 nRadius, SINT32 nRadiusTG,
SINT16* pnTgBgDiff)
SINT32* pnTgBgDiff)
{
SINT32 i, j;
SINT32 nBorder = 1; //不处理的边界大小
@ -1585,7 +1585,7 @@ void DetectAreaObj::DAT_CalcTgBgDiff(UINT16* pFrame, SIZE32S snImgSize,
* 4(i,j)(i+1,j+1)
**********************************************************/
void DetectAreaObj::DAT_GraySegmentation(SIZE32S snImgSize, SINT32 nRadius, SINT32 nThresMin,
UBYTE8* pnBinary, SINT16* pnTgBgDiff, BBOOL changeDetParam)
UBYTE8* pnBinary, SINT32* pnTgBgDiff, BBOOL changeDetParam)
{
SINT32 i, j;
SINT32 nBorder = 1; //不处理的边界大小

@ -187,10 +187,10 @@ private:
void DAT_CalcTgBgDiff(UINT16* pFrame, SIZE32S snImgSize,
SINT32* pnIntImg, SIZE32S snIntImgSize,
SINT32 nRadius, SINT32 nRadiusTG,
SINT16* pnTgBgDiff);
SINT32* pnTgBgDiff);
// 灰度分割
void DAT_GraySegmentation(SIZE32S snImgSize, SINT32 nRadius, SINT32 nThresMin, UBYTE8* pnBinary, SINT16* pnTgBgDiff, BBOOL changeDetParam);
void DAT_GraySegmentation(SIZE32S snImgSize, SINT32 nRadius, SINT32 nThresMin, UBYTE8* pnBinary, SINT32* pnTgBgDiff, BBOOL changeDetParam);
// 目标分割在2倍降采样图像上检测目标再还原回原始图像位置及大小
SINT32 DAT_ObjsSegmentation(UINT16* pFrame, UBYTE8* pnGrayBinary,
@ -263,7 +263,7 @@ private:
UBYTE8* DAT_pBinary_Gray; //DAT: 灰度二值化图像2倍降采样 //BYTES: (320/2)*(256/2)*1 = 20480 - 0x5000
UBYTE8* DAT_pBinary_GrayNew; //DAT: 灰度二值化图像1倍降采样 //BYTES: (320/2)*(256/2)*1 = 20480 - 0x5000
MINMAXRECT32S DAT_pmrnBlksRect[DAT_SR_RGN_BLKS_NUM]; //DAT: 分块区域起始坐标数组2倍降采样
SINT16* DAT_DIFF; //DAT: 20161116面目标灰度残差图
SINT32* DAT_DIFF; //DAT: 20161116面目标灰度残差图
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SINT16 GLB_Dat16SampleCnt = 0; //目标16倍下采样的帧连续计数器
SINT16 GLB_Dat8SampleCnt = 0; //目标8倍下采样的帧连续计数器

@ -698,7 +698,6 @@ void DetectSmallObj::DST_MallocMemory(SINT32 nWidth, SINT32 nHeight, CENTERRECT
DST_pBlkPtBeTargetFlag = new SINT32[DST_BLK_NUM * 2];
DST_pBlkMaxPntFlag = new BYTE8[DST_BLK_NUM * 2];
}
void DetectSmallObj::DST_ReleaseMemory()
@ -2101,8 +2100,8 @@ BBOOL DetectSmallObj::DST_PipeTargetReDetect(GD_VIDEO_FRAME_S img, SINT32 nWidth
nIndex = pBlkStart + j;
int nnIndex_left = nIndex - 1;
int nnIndex_right = nIndex + 1;
int nnIndex_top = nIndex - nWidth;
int nnIndex_bottom = nIndex + nWidth;
int nnIndex_top = MAX(0, nIndex - nWidth);
int nnIndex_bottom = MIN(nIndex + nWidth, nHeight - 1);
if (GD_PIXEL_FORMAT_GRAY_Y8 == img.enPixelFormat)
{

@ -454,7 +454,7 @@ void ARIDLL_OutputPipeTarget(Arith_EOController* pArith, ARIDLL_OUTPUT* pstOutpu
pipeBox.w = pTarget->snSize.w;
pipeBox.h = pTarget->snSize.h;
if(SIoUB(pipeBox,trackBox) > 0.2 && !pPipe->bTrackingPipe)
if(SIoUB_Expand(pipeBox,trackBox, 10) > 0.1 && !pPipe->bTrackingPipe)
{
continue;
}

Loading…
Cancel
Save