|
|
|
|
#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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|