#include "Arith_EOController.h" #include "Arith_CoordModule.h" #include "Arith_Tracker.h" #include // SINT32 Arith_EOController::Proc_ForceLock(GD_VIDEO_FRAME_S img, GLB_INPUT& g_Input, GLB_PARAMETERS& g_para) { SINT32 nTrackPipeID = -1; SINT32 nWidth = img.u32Width; SINT32 nHeight = img.u32Height; //3s强制提取由外部控制 // 对空模式可以转压点强制提取 if (GLB_SCEN_SKY == g_GLB_stPara.nWorkScene) { TARGET_OBJECT tTargetRe = { 0 }; SPEED32F sfAglSpeed = { 0 }; TARGET_OBJECT* Temp_Target_Array = g_GLB_Detectors->GetTargetArray(); SINT32 Temp_nTargetNum = 0; g_GLB_stPara.snLockBoxSize.w = 40; g_GLB_stPara.snLockBoxSize.h = 40; MINMAXRECT mmCenterRect = { g_GLB_stPara.ptLockPos.x - g_GLB_stPara.snLockBoxSize.w / 2, g_GLB_stPara.ptLockPos.y - g_GLB_stPara.snLockBoxSize.h / 2 , g_GLB_stPara.ptLockPos.x + g_GLB_stPara.snLockBoxSize.w / 2 ,g_GLB_stPara.ptLockPos.y + g_GLB_stPara.snLockBoxSize.h / 2 }; BBOOL bPipeReObjFound = g_GLB_Detectors->pDST_Module->DST_PipeTargetReDetect(img, nWidth, nHeight, g_GLB_stPara.ptLockPos, sfAglSpeed, mmCenterRect, &tTargetRe, Temp_Target_Array, &Temp_nTargetNum); // 还没有检出,执行第三次超级弱小目标检测 if (!bPipeReObjFound) { BBOOL bPipeSeObjFound = g_GLB_Detectors->pDST_Module->DST_PipeTargetRReDetect(img, nWidth, nHeight, g_GLB_stPara.ptLockPos, sfAglSpeed, mmCenterRect, &tTargetRe, Temp_Target_Array, &Temp_nTargetNum); } nTrackPipeID = g_GLB_PipeProc->SO_ForceLock(img, g_GLB_stPara.ptLockPos, g_GLB_stPara.snLockBoxSize, Temp_Target_Array, Temp_nTargetNum, g_Input); } // 对地模式转固定波门框选 if (GLB_SCEN_GROUND == g_GLB_stPara.nWorkScene) { nTrackPipeID = g_GLB_PipeProc->SO_RectLock(img, g_GLB_stPara.ptLockPos, g_GLB_stPara.snLockBoxSize, g_Input); } return nTrackPipeID; } SINT32 Arith_EOController::Proc_SearchLock(GD_VIDEO_FRAME_S img, GLB_INPUT & g_Input, GLB_PARAMETERS & g_para) { if(g_GLB_stPara.stLockCtrl == LockMode::LOCK_NONE) { return -1; } UBYTE8* pSrc = img.u64VirAddr[0]; SINT32 nWidth = img.u32Width; SINT32 nHeight = img.u32Height; // 检测队列 TARGET_OBJECT* pFrameTargetArray = g_GLB_Detectors->GetTargetArray(); // 管道队列 PIPE* pPipeArray = g_GLB_PipeProc->getPipeArray(); SINT32 nTrackPipeID = -1; // 单目标锁定处理 switch (g_GLB_stPara.stLockCtrl) { case LockMode::LOCK_NONE: break; case LockMode::LOCK_POINT: nTrackPipeID = g_GLB_PipeProc->SO_PointLock(img, pPipeArray, g_GLB_stPara.ptLockPos); LOG_DEBUG("LOCK_POINT:g_GLB_stPara.ptLockPos:{},{},nTrackPipeID:{}", g_GLB_stPara.ptLockPos.x, g_GLB_stPara.ptLockPos.y, nTrackPipeID); if (nTrackPipeID == -1)// 未找到目标不能什么都不做,积极响应用户指令 { nTrackPipeID = Proc_ForceLock(img, g_Input, g_para); } break; case LockMode::LOCK_RECT: nTrackPipeID = g_GLB_PipeProc->SO_RectLock(img, g_GLB_stPara.ptLockPos, g_GLB_stPara.snLockBoxSize, g_Input); break; default: break; } // 锁定成功,转入跟踪状态 if (nTrackPipeID > -1) { // 记录被锁定管道 g_GLB_stPara.nLockPipeInd = nTrackPipeID; PIPE* pLockPipe = &pPipeArray[nTrackPipeID]; // 对应的跟踪器初始化跟踪 // 创建跟踪器对象,使用外部设置的参数模板 //g_GLB_Trackers[nTrackPipeID] = new Tracker(nWidth, nHeight, g_GLB_stPara.nWorkScene, g_GLB_TKPara_Template); if (g_GLB_stPara.nWorkScene == GLB_SCEN_SKY) { g_GLB_Trackers[nTrackPipeID] = g_pSkyTracker; } else if (g_GLB_stPara.nWorkScene == GLB_SCEN_GROUND) { g_GLB_Trackers[nTrackPipeID] = g_pGrdTracker; } // 初始化跟踪器 g_GLB_Trackers[nTrackPipeID]->Init(img, pLockPipe, &g_GLB_stInput); // 管道标记为跟踪 pLockPipe->bTrackingPipe = true; // 转入跟踪状态 g_GLB_stPara.stLockCtrl = LOCK_NONE; //锁定标记复位 g_GLB_stPara.bEnForceGuide = FALSE; //强制提取复位 g_GLB_stPara.nStatusBeforeLock = g_GLB_stPara.nStatus; if (TRUE == g_GLB_stPara.bMutiTrack) { g_GLB_stPara.nStatus = GLB_STATUS_MOTRACK; } else { g_GLB_stPara.nStatus = GLB_STATUS_TRACK; } // 对空跟踪对象创建后,从参数模板进行参数赋值 if (g_GLB_stPara.nLockPipeInd >= 0 && NULL != g_GLB_Trackers[g_GLB_stPara.nLockPipeInd] && NULL != g_GLB_Trackers[g_GLB_stPara.nLockPipeInd]->pSkyTracker) { SkyTracker* pSkyTrackerTemp = g_GLB_Trackers[g_GLB_stPara.nLockPipeInd]->pSkyTracker; Param_SkyDetect* prmTSkyDet = &g_GLB_TKPara_Template.skyParam.prmTSkyDet;//对空检测器参数 memcpy(&pSkyTrackerTemp->mTrakingPara.prmTSkyDet, prmTSkyDet, sizeof(Param_SkyDetect)); DST_PARAMETERS* pDST_stPara = pSkyTrackerTemp->pSATracker->pDST_Module->GetDstParm(); DAT_PARAMETERS* pDAT_stPara = pSkyTrackerTemp->pSATracker->pDAT_Module->GetDatParm(); // 将外部下发参数设置到跟踪模块 // 局部小目标检测器 pDST_stPara->fgdk = prmTSkyDet->fSmallDetectGDK; pDST_stPara->nDetectGrayType = prmTSkyDet->nDetectGrayType; // 局部面目标检测器 pDAT_stPara->nDetectGrayType = prmTSkyDet->nDetectGrayType; pDAT_stPara->nGradThresMin = prmTSkyDet->fAreaDetectGradDiffThre; pDAT_stPara->nGrayThresMinBright = prmTSkyDet->nGrayThresMinBright; pDAT_stPara->nGrayThresMinDark = prmTSkyDet->nGrayThresMinDark; } } //锁定失败,转入搜索(半自动截获) else { g_GLB_stPara.stLockCtrl = LOCK_NONE; //锁定标记复位 g_GLB_stPara.nStatus = GLB_STATUS_SEARCH; } return nTrackPipeID; } /************************************* * Method: Arith_Status_SEARCH() * Function Description: 算法搜索模式处理流程 * CreateData: 2024/10/11 * Input Param: GD_VIDEO_FRAME_S img -- 输入图像 * Input Param: GLB_INPUT & g_Input -- 算法每帧输入信息 * Input Param: GLB_PARAMETERS & g_para -- 算法控制参数 * Output Param: * Return: BBOOL * Call Relation: * Other Description: *************************************/ BBOOL Arith_EOController::Arith_Status_SEARCH(GD_VIDEO_FRAME_S img, GLB_INPUT& g_Input, GLB_PARAMETERS& g_para) { // 检测队列 TARGET_OBJECT* pFrameTargetArray = g_pFrameTargetArray; // 管道队列 //PIPE* pPipeArray = g_GLB_PipeProc->getPipeArray(); // 执行全图红外目标检测 //SINT32 nFrmTargetNum = g_GLB_Detectors->Detect((UBYTE8*)pSrc, nWidth, nHeight, GLB_PT_UINT16); SINT32 nFrmTargetNum = g_TotalTargetNum; // 目标系统相关的其他信息计算 Arith_CalcTargetSysInfo(pFrameTargetArray, nFrmTargetNum, g_Input); // 合并AI检测目标与传统目标 nFrmTargetNum = MergeAIAndSATarget(pFrameTargetArray, nFrmTargetNum); LOG_DEBUG("nFrmTargetNum:{},bObject:{}fAz:{},fPt:{}", nFrmTargetNum,pFrameTargetArray[0].bObject, pFrameTargetArray[0].afAngle.fAz, pFrameTargetArray[0].afAngle.fPt); // MOT管道处理 g_GLB_PipeProc->Run(pFrameTargetArray, nFrmTargetNum, GLB_STATUS_SEARCH, g_Input); // 处理锁定指令,初始化跟踪 Proc_SearchLock(img, g_Input, g_para); return true; }