diff --git a/NeoTracker/src/Arith_EOController.cpp b/NeoTracker/src/Arith_EOController.cpp index 03ed0b2..b479574 100644 --- a/NeoTracker/src/Arith_EOController.cpp +++ b/NeoTracker/src/Arith_EOController.cpp @@ -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); + } } // 读取运行时跟踪参数 diff --git a/NeoTracker/src/Arith_SkyTracker.cpp b/NeoTracker/src/Arith_SkyTracker.cpp index 23022d2..80ca2e4 100644 --- a/NeoTracker/src/Arith_SkyTracker.cpp +++ b/NeoTracker/src/Arith_SkyTracker.cpp @@ -537,8 +537,13 @@ void SkyTracker::SetSkyParam(Param_SkyTracker * stSkyParam) //mTrakingPara.Sky_bEnableTrackSA = stSkyParam->Sky_bEnableTrackSA; //mTrakingPara.Sky_bEnableKCF = stSkyParam->Sky_bEnableKCF; // 内部自动调整关闭,因为清空了kcf信息,强制打开可能会导致程序崩溃,不建议设置kcf算法开关 - pSATracker->m_TSA_Param.Sky_bUseAIDet = stSkyParam->Sky_bUseAIDet; - pSATracker->m_TSA_Param.nUseAIDetFeq = stSkyParam->Sky_nUseAIDetFeq; + 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)); //小目标和面目标相互切换计数器清零 diff --git a/NeoTracker/src/Arith_TrackSAObj.cpp b/NeoTracker/src/Arith_TrackSAObj.cpp index de53f39..c1ec787 100644 --- a/NeoTracker/src/Arith_TrackSAObj.cpp +++ b/NeoTracker/src/Arith_TrackSAObj.cpp @@ -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)) - { - bEnableAreaObjDetect = true; - } - else - { - bEnableAreaObjDetect = false; - } + //// 像素数超过面目标检出下限或者速度较快,开启面目标检测算法 + //if ((m_ObjStatus.fObjPxlsCnt > DAT_TARGET_PXLS_MIN) || (fObjAglSpeed > 0.01f)) + //{ + // bEnableAreaObjDetect = true; + //} + //else + //{ + // bEnableAreaObjDetect = false; + //} + bEnableAreaObjDetect = true; // 跟踪阶段,合并距离关键参数 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(¶); // 小目标检测参数设置 + + pDAT_Module->setDatDetState(para.bEnableDetcetAreaTarget); // 面目标检测开关设置 + pDAT_Module->setDatParm(¶); // 面目标检测参数设置 +} + // 运动相似度 FLOAT32 SA_Tracker::Similarity_Move(PIPE* pPipe, TARGET_OBJECT* ptTarget, FLOAT32 fAglReso) { diff --git a/NeoTracker/src/Arith_TrackSAObj.h b/NeoTracker/src/Arith_TrackSAObj.h index 3b0301c..1ce5fa4 100644 --- a/NeoTracker/src/Arith_TrackSAObj.h +++ b/NeoTracker/src/Arith_TrackSAObj.h @@ -185,6 +185,8 @@ public: // 获取小目标检测模块 API_DetectSmallObj* getDSTmodule(); + // 检测器参数设置 + void SetParam(Param_SkyDetect para); // 对空所有跟踪器统一输出,便于融合处理 OBJECTSTATUS m_ObjStatus; diff --git a/NeoTracker/src/Common/Arith_Bbox.cpp b/NeoTracker/src/Common/Arith_Bbox.cpp index 51c363f..11576be 100644 --- a/NeoTracker/src/Common/Arith_Bbox.cpp +++ b/NeoTracker/src/Common/Arith_Bbox.cpp @@ -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) { diff --git a/NeoTracker/src/Common/Arith_Bbox.h b/NeoTracker/src/Common/Arith_Bbox.h index 13cf1bc..9a1027b 100644 --- a/NeoTracker/src/Common/Arith_Bbox.h +++ b/NeoTracker/src/Common/Arith_Bbox.h @@ -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); diff --git a/NeoTracker/src/Detect/Arith_DetectAreaObj.cpp b/NeoTracker/src/Detect/Arith_DetectAreaObj.cpp index 6d16fbf..63aa935 100644 --- a/NeoTracker/src/Detect/Arith_DetectAreaObj.cpp +++ b/NeoTracker/src/Detect/Arith_DetectAreaObj.cpp @@ -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, @@ -607,8 +607,8 @@ SINT32 DetectAreaObj::DAT_DetectAreaTarget(GD_VIDEO_FRAME_S img, GLB_STATUS nSta for (int nIndex = 0; nIndex < nObjsCnt; nIndex++) { - cv::Rect ret(ptTargetArray[nIndex].mrnRect.minX, ptTargetArray[nIndex].mrnRect.minY, - (ptTargetArray[nIndex].mrnRect.maxX - ptTargetArray[nIndex].mrnRect.minX), + cv::Rect ret(ptTargetArray[nIndex].mrnRect.minX, ptTargetArray[nIndex].mrnRect.minY, + (ptTargetArray[nIndex].mrnRect.maxX - ptTargetArray[nIndex].mrnRect.minX), (ptTargetArray[nIndex].mrnRect.maxY - ptTargetArray[nIndex].mrnRect.minY)); cv::rectangle(FuseImg, ret, cv::Scalar(0, 255, 0)); } @@ -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,12 +787,12 @@ 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) + for (int r = 0; r < nr; ++r) { - for (int c = 0; c < nc; ++c) + for (int c = 0; c < nc; ++c) { if (grid[r * nc + c] == '\x1') { @@ -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; //不处理的边界大小 diff --git a/NeoTracker/src/Detect/Arith_DetectAreaObj.h b/NeoTracker/src/Detect/Arith_DetectAreaObj.h index b626288..957c71c 100644 --- a/NeoTracker/src/Detect/Arith_DetectAreaObj.h +++ b/NeoTracker/src/Detect/Arith_DetectAreaObj.h @@ -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倍下采样的帧连续计数器 diff --git a/NeoTracker/src/Detect/Arith_DetectSmallObj.cpp b/NeoTracker/src/Detect/Arith_DetectSmallObj.cpp index d2759b4..56f4e10 100644 --- a/NeoTracker/src/Detect/Arith_DetectSmallObj.cpp +++ b/NeoTracker/src/Detect/Arith_DetectSmallObj.cpp @@ -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) { diff --git a/NeoTracker/src/NeoArithStandardDll.cpp b/NeoTracker/src/NeoArithStandardDll.cpp index 26b49c9..b2481c6 100644 --- a/NeoTracker/src/NeoArithStandardDll.cpp +++ b/NeoTracker/src/NeoArithStandardDll.cpp @@ -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; }