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.

208 lines
8.5 KiB

#include "Arith_EOController.h"
#include "Arith_CoordModule.h"
#include "Arith_Tracker.h"
#include <opencv2/opencv.hpp>
//
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;
pLockPipe->bTracking = FALSE;//防止后续显示错误
// 转入跟踪状态
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;
}