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.

761 lines
24 KiB

7 months ago
#include "Arith_CustomTracker.h"
#include "Arith_AIDMonitor.h"
#include "Arith_timer.h"
CustomTracker::CustomTracker(SINT32 nWidth, SINT32 nHeight)
{
//kcf跟踪器通用
m_pKCFTracker = API_KCF_Tracker::Create();
// TLD
m_pTLDTracker = API_TLD::Create();
// LK光流计算
m_pNDYTTracker = new NDYT();
// ai跟踪器初始化为空等待外部绑定
m_pAITracker = NULL;
// 精细模板匹配
m_pNccCorrect = new NCCAccuracy();
// 遮挡识别模块
m_pOccJudgeKCF = new OccJudge();
// AI Detect 管道监控模块
Ai_DMonitor = new AID_Monitor();
// AI跟踪器遮挡判断
m_pOccJudgeAI = new OccJudgeAI();
// 遮挡重捕模块
m_pTargetArrest = new TargetArrest(m_pOccJudgeKCF, m_pOccJudgeAI, m_pKCFTracker, m_pTLDTracker);
ObjStatus = { 0 };//复合跟踪结果
ObjStatusAI = { 0 };
ObjStatusKCF = { 0 };
// 初始化为无遮挡
tkEventKCF = { OccLev::NO_OCC };
tkEventAI = { OccLev::NO_OCC };
m_nKCFResetCnt = 0;
m_nAIResetCnt = 0;
m_nAISeResetCnt = 0;
}
CustomTracker::~CustomTracker()
{
if (m_pKCFTracker)
{
delete m_pKCFTracker;
}
if (m_pTLDTracker)
{
delete m_pTLDTracker;
}
if (m_pOccJudgeKCF)
{
delete m_pOccJudgeKCF;
}
if (m_pTargetArrest)
{
delete m_pTargetArrest;
}
if (m_pNccCorrect)
{
delete m_pNccCorrect;
}
if (m_pOccJudgeAI)
{
delete m_pOccJudgeAI;
}
if (Ai_DMonitor)
{
delete Ai_DMonitor;
}
}
bool CustomTracker::Init(GD_VIDEO_FRAME_S img, PIPE* pLockPipe, GLB_INPUT* p_GLB_Input)
{
// 锁定管道传指针
m_LockingPipe = pLockPipe;
SINT32 nEnd = m_LockingPipe->ubEnd;
SINT32 nObjSize = (SINT32)(m_LockingPipe->ObjectFilter.fPxlsCnt);
TARGET_OBJECT* pTrackingTarget = &m_LockingPipe->objHistoryList[nEnd];
RECT32S tkBox = { SINT32(pTrackingTarget->pfCenPos.x - pTrackingTarget->snSize.w * 0.5),
SINT32(pTrackingTarget->pfCenPos.y- pTrackingTarget->snSize.h * 0.5),
pTrackingTarget->snSize.w,
pTrackingTarget->snSize.h };
CENTERRECT32F ctBox = { pTrackingTarget->pfCenPos.x,
pTrackingTarget->pfCenPos.y,
(FLOAT32)pTrackingTarget->snSize.w,
(FLOAT32)pTrackingTarget->snSize.h };
// 初始化KCF
if (m_pKCFTracker)
{
m_pKCFTracker->KCF_InitObjectParameters(img, pLockPipe, p_GLB_Input);
}
//初始化NCC修正模块
if (m_pNccCorrect)
{
m_pNccCorrect->NCC_IniteTemplet(img, ctBox);
}
//// 初始化TLD模块
m_pTLDTracker->TLD_Init_API(img, ctBox);
// 初始化AI跟踪
if(m_pAITracker)
{
m_pAITracker->AIT_Init(img, pLockPipe, p_GLB_Input);
}
//初始化NDYT
if (m_pNDYTTracker)
{
m_pNDYTTracker->NDYT_Init();
}
return true;
}
bool CustomTracker::Track(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, API_MOT_PIPE* g_GLB_PipeProc)
{
// 跟踪成功状态
bool bTrackStatus = false;
bool bTrackKCFStatus = false;
bool bTrackAIStatus = false;
//KCF跟踪
if (m_pKCFTracker)
{
bTrackKCFStatus = GroundTrackKCF(img, p_GLB_Input, m_pKCFTracker, m_pOccJudgeKCF, &tkEventKCF, m_pTLDTracker->TLD_GetPara());
//更新KCF运动模型
m_pKCFTracker->UpdateTrackerMotion(p_GLB_Input);
}
//NCC跟踪精度修正
if (m_pNccCorrect)
{
m_pNccCorrect->NCC_CorrectTarget(img, m_pKCFTracker->GetTrackeStatus());
}
// AI跟踪
if (m_pAITracker)
{
CENTERRECT32F srBbox = { ObjStatus.ptPos.x,ObjStatus.ptPos.y,
ObjStatus.sfSize.w,ObjStatus.sfSize.h};
//m_pAITracker->AIT_Run(img, srBbox, p_GLB_Input);
bTrackAIStatus = GroundTrackAI(p_GLB_Input, m_pAITracker, m_pOccJudgeAI, &tkEventAI, m_pTLDTracker->TLD_GetPara());
}
// 跟踪决策及模型更新
bTrackStatus = TrackDecision(img, p_GLB_Input);
// 运行TLD :
if(p_GLB_Input->parallelFlg == 0)
{
if (m_pTLDTracker)
{
#if 0
m_pTLDTracker->TLD_Run_MutiTracker(img, &ObjStatus, &ObjStatusKCF, &ObjStatusAI, tkEventKCF);
#endif
UBYTE8 nScale = 0;
SINT32 nImageW = 0;
SINT32 nImageH = 0;
RECT32S bRect = { 0 };
MINMAXRECT mmRect = { 0 };
int ret = m_pTLDTracker->tldPreProcess(img,&ObjStatus, &ObjStatusKCF, &ObjStatusAI,&nScale,&nImageW,&nImageH,&bRect,&mmRect);
if(ret != -1)
{
m_pTLDTracker->tldRunMultiTracker(&ObjStatus, &ObjStatusKCF, &ObjStatusAI, tkEventKCF,nScale,nImageW,nImageH,bRect,mmRect);
}
}
}
if (bTrackStatus)
{
// 处理跟踪事件(对地处理这档重捕,可屏蔽测试AID重捕)
EventProcess(tkEventKCF, tkEventAI, img, m_LockingPipe, p_GLB_Input);
//// AI识别管道监控处理
//SINT32 alarmID = Ai_DMonitor->Process(img, p_GLB_Input, &ObjStatus, m_LockingPipe, g_GLB_PipeProc);
//// 根据AID提供的告警管道编号查询管道调用重捕重置流程
//PIPE* recapPipe = g_GLB_PipeProc->getPipeByAlarmID(alarmID);
//RecapRestProcess(tkEventKCF, img, recapPipe, p_GLB_Input);
}
else
{
// 跟踪失败,解锁
Cancle();
// 返回跟踪状态
return bTrackStatus;
}
// 返回跟踪状态
return bTrackStatus;
}
void CustomTracker::Cancle()
{
PIPE* pPipe = m_LockingPipe;
if (pPipe)
{
pPipe->bTrackingPipe = false;
}
// 如果存在AI跟踪器解锁
if(m_pAITracker)
{
m_pAITracker->ATI_Cancle();
}
m_pKCFTracker->KCF_CleanUpObjectTracker();
m_pTLDTracker->TLD_CleanUp();
m_pOccJudgeKCF->OccJudge_CleanUpObjAglSimInfo();
}
bool CustomTracker::TrackDecision(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input)
{
UBYTE8 ubSuccessFlag = TRUE;
//若同时执行KCF+AI跟踪则执行面目标跟踪决策
if (m_pKCFTracker && m_pAITracker)
{
ubSuccessFlag = TO_TrackDecisionOfMiddleObj_KCF_AI(img, p_GLB_Input);
}
//若仅执行KCF跟踪则直接将KCF结果赋给跟踪决策结果
else if (m_pKCFTracker)
{
//20171218更新kcf模板
if (m_pKCFTracker->GetTrackeStatus()->unContiLostCnt < 1)
{
m_pKCFTracker->KCF_ModelUpdate(img);
}
// 取KCF跟踪结果输出
memcpy(&ObjStatus, m_pKCFTracker->GetTrackeStatus(), sizeof(OBJECTSTATUS));
ObjStatus.nDeciStatus = KCF_Deci;
}
else if (m_pAITracker)
{
memcpy(&ObjStatus, m_pAITracker->GetTrackeStatus(), sizeof(OBJECTSTATUS));
ObjStatus.nDeciStatus = AIT_Deci;
}
else
{
ObjStatus.bObjMiss = true;
}
//若决策目标丢失,则标记跟踪失败
ubSuccessFlag = TRUE;
if (ObjStatus.bObjMiss)
{
ubSuccessFlag = FALSE;
}
//决策结果指导AI跟踪位置
if (m_pAITracker)
{
AIT_OUTPUT* pAITOut = m_pAITracker->GetAIPara();
if (ObjStatus.nOcclude_flag == FULL_OCC)
{
//记忆阶段取TLD检测结果传入
if (m_pAITracker->GetTrackeStatus()->unContiLostCnt > p_GLB_Input->unFreq && m_pTLDTracker)
{
RECT32S rsTLDBestRect = m_pTLDTracker->TLD_GetPara()->rsBestNNRect;
m_pAITracker->m_Ai_TkCmd.TargetBox.cx = rsTLDBestRect.x + rsTLDBestRect.w / 2;
m_pAITracker->m_Ai_TkCmd.TargetBox.cy = rsTLDBestRect.y + rsTLDBestRect.h / 2;
m_pAITracker->m_Ai_TkCmd.TargetBox.w = rsTLDBestRect.w;
m_pAITracker->m_Ai_TkCmd.TargetBox.h = rsTLDBestRect.h;
}
else
{
m_pAITracker->m_Ai_TkCmd.TargetBox.cx = pAITOut->fX;
m_pAITracker->m_Ai_TkCmd.TargetBox.cy = pAITOut->fY;
if (pAITOut->fObjW > 1)
{
m_pAITracker->m_Ai_TkCmd.TargetBox.w = pAITOut->fObjW;
m_pAITracker->m_Ai_TkCmd.TargetBox.h = pAITOut->fObjH;
}
else
{
m_pAITracker->m_Ai_TkCmd.TargetBox.w = ObjStatus.sfSize.w;
m_pAITracker->m_Ai_TkCmd.TargetBox.h = ObjStatus.sfSize.h;
}
}
}
else
{
m_pAITracker->m_Ai_TkCmd.TargetBox.cx = ObjStatus.ptPos.x;
m_pAITracker->m_Ai_TkCmd.TargetBox.cy = ObjStatus.ptPos.y;
if (pAITOut->fObjW > 1)
{
m_pAITracker->m_Ai_TkCmd.TargetBox.w = pAITOut->fObjW;
m_pAITracker->m_Ai_TkCmd.TargetBox.h = pAITOut->fObjH;
}
else
{
m_pAITracker->m_Ai_TkCmd.TargetBox.w = ObjStatus.sfSize.w;
m_pAITracker->m_Ai_TkCmd.TargetBox.h = ObjStatus.sfSize.h;
}
}
}
return ubSuccessFlag;
}
bool CustomTracker::TO_TrackDecisionOfMiddleObj_KCF_AI(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input)
{
UBYTE8 ubSuccessFlag = TRUE;
MINMAXRECT mmRectKCF = { 0 };
MINMAXRECT mmRectAI = { 0 };
FLOAT32 fIou = 0.f;
BBOOL bResetKCF = FALSE;
BBOOL bResetAI = FALSE;
BBOOL bKcfResetAI = FALSE;
BBOOL bIouConfirm = TRUE;
OBJECTSTATUS* pObjStatus = &ObjStatus;
OBJECTSTATUS* pObjStatusKCF = m_pKCFTracker->GetTrackeStatus();
OBJECTSTATUS* pObjStatusAI = m_pAITracker->GetTrackeStatus();
OBJECT_OCCLUSION* stOcclude = m_pOccJudgeAI->getOccInfo();
AIT_OUTPUT* pAITOut = m_pAITracker->GetAIPara();
TLD_Para* pTLDPara = m_pTLDTracker->TLD_GetPara();
SINT32 nAITNumThre = MAX(20, stOcclude->nObjNumArrestTH);
SINT32 nKCFNumThre = MAX(10, stOcclude->nObjNumArrestTH);
pObjStatus->bObjLost = FALSE;
//估计AI跟踪结果是否为可跟踪目标-----------------------
//统计AI第一帧和第二帧之间跟踪框的差异性
mmRectAI.minX = pObjStatusAI->ptPos.x - pObjStatusAI->sfSize.w / 2;
mmRectAI.maxX = pObjStatusAI->ptPos.x + pObjStatusAI->sfSize.w / 2;
mmRectAI.minY = pObjStatusAI->ptPos.y - pObjStatusAI->sfSize.h / 2;
mmRectAI.maxY = pObjStatusAI->ptPos.y + pObjStatusAI->sfSize.h / 2;
mmRectKCF.minX = pObjStatusKCF->ptPos.x - pObjStatusKCF->sfSize.w / 2;
mmRectKCF.maxX = pObjStatusKCF->ptPos.x + pObjStatusKCF->sfSize.w / 2;
mmRectKCF.minY = pObjStatusKCF->ptPos.y - pObjStatusKCF->sfSize.h / 2;
mmRectKCF.maxY = pObjStatusKCF->ptPos.y + pObjStatusKCF->sfSize.h / 2;
fIou = IMGO_CalcObjIou(mmRectAI, mmRectKCF);
//分四类情况讨论
if (pObjStatusKCF->unContiLostCnt == 0 && pObjStatusAI->unContiLostCnt == 0)
{
pObjStatus->nDeciStatus = KCF_Deci;
if (fIou < 0.4 && fIou > 0.1
&&(pObjStatusKCF->sfSize.w > 15 || pObjStatusKCF->sfSize.h > 15)
&& pAITOut->nDetectNum > 35
&& stOcclude->nJamExistCnt < 0
&& stOcclude->nDetectChangeCnt < 0)
{
bResetKCF = TRUE;
m_pTargetArrest->nArrestKCFStatus = 12;
}
if (pAITOut->nDetectNum > 10 && pAITOut->nDetectNum < 25)
{
m_nAIResetCnt++;
if (m_nAIResetCnt > 10)
{
m_nAIResetCnt = 0;
bResetAI = TRUE;
m_pTargetArrest->nArrestAIStatus = 15;
}
}
else
{
m_nAIResetCnt = 0;
}
}
else if (pObjStatusKCF->unContiLostCnt > 0 && pObjStatusAI->unContiLostCnt == 0)
{
pObjStatus->nDeciStatus = AIT_Deci;
//重置KCF(丢失)条件判断---------------------------------------------
if ( (pObjStatusKCF->sfSize.w > 15 || pObjStatusKCF->sfSize.h > 15)
&& pAITOut->nDetectNum > stOcclude->nObjNumArrestTH
&& stOcclude->nJamExistCnt < 0
&& stOcclude->nDetectChangeCnt < 0
&& pObjStatusKCF->unContiLostCnt > 30
&& pObjStatusAI->unContiTrackedCnt > 30)
{
bResetKCF = TRUE;
m_pTargetArrest->nArrestKCFStatus = 13;
}
if (pObjStatusKCF->unContiLostCnt > p_GLB_Input->unFreq * 5)
{
bResetKCF = TRUE;
m_pTargetArrest->nArrestKCFStatus = 14;
}
}
else if (pObjStatusKCF->unContiLostCnt == 0 && pObjStatusAI->unContiLostCnt > 0)
{
pObjStatus->nDeciStatus = KCF_Deci;
//重置AI条件判断---------------------------------------------
if ((pObjStatusKCF->sfSize.w > 15 || pObjStatusKCF->sfSize.h > 15)
&& pObjStatusKCF->nOcclude_flag == NO_OCC
&& pObjStatusAI->unContiLostCnt > 30
&& pObjStatusAI->unTrackedCnt > 30
&& m_nAISeResetCnt < 0)
{
bResetAI = TRUE;
m_nAISeResetCnt = 10;
m_pTargetArrest->nArrestAIStatus = 17;
}
//KCF重置AI
if (pObjStatusAI->unContiLostCnt > p_GLB_Input->unFreq * 5
&& m_nAISeResetCnt < 0)
{
bResetAI = TRUE;
m_nAISeResetCnt = 10;
m_pTargetArrest->nArrestAIStatus = 18;
}
m_nAISeResetCnt--;
}
else
{
pObjStatus->nDeciStatus = Predict_Deci;
//决策跟踪状态
pObjStatus->bObjLost = TRUE;
}
//决策后处理-----------------------------------------------------------------
//更新kcf模板
if (pObjStatusKCF->unContiLostCnt < 1)
{
m_pKCFTracker->KCF_ModelUpdate(img);
}
//决策结果赋值
///////////////////////////////////////////////////////////////////////////////
if (pObjStatus->nDeciStatus == KCF_Deci)
{
pObjStatus->ptPos = pObjStatusKCF->ptPos;
pObjStatus->sfSize = pObjStatusKCF->sfSize;
pObjStatus->nOcclude_flag = pObjStatusKCF->nOcclude_flag;
pObjStatus->fConfidence = pObjStatusKCF->fConfidence;
}
else if (pObjStatus->nDeciStatus == AIT_Deci)
{
pObjStatus->ptPos = pObjStatusAI->ptPos;
pObjStatus->sfSize = pObjStatusAI->sfSize;
pObjStatus->nOcclude_flag = pObjStatusAI->nOcclude_flag;
pObjStatus->fConfidence = pObjStatusAI->fConfidence;
}
else
{
pObjStatus->sfSize = pObjStatusKCF->sfSize;
pObjStatus->nOcclude_flag = FULL_OCC;
pObjStatus->fConfidence = 0;
pObjStatus->nDeciStatus = Predict_Deci;
}
if (pObjStatus->bObjLost == FALSE)
{
//更新目标计数器
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 更新帧编号
pObjStatus->unFrmId = p_GLB_Input->unFrmId;
pObjStatus->unTotalCnt++;
pObjStatus->unTrackedCnt++;
pObjStatus->unContiTrackedCnt++;
pObjStatus->unContiLostCnt = 0;
pObjStatus->bObjMiss = FALSE;
//更新目标丢失/跟踪失败标志
pObjStatus->bObjLost = FALSE;
//更新目标位置
POINT32F pfPosPrePre = pObjStatus->ptPosPre;
pObjStatus->ptPosPre = pObjStatus->ptPos;
pObjStatus->ptPosFilter.x = (pObjStatus->ptPosPre.x + pObjStatus->sfSpeed.vx + pObjStatus->ptPos.x) / 2;
pObjStatus->ptPosFilter.y = (pObjStatus->ptPosPre.y + pObjStatus->sfSpeed.vy + pObjStatus->ptPos.y) / 2;
//非射击期间出视场解锁
if (IMGO_IsPoint32FOutImg(p_GLB_Input->nImageWidth, p_GLB_Input->nImageHeight, pObjStatus->ptPos))
{
pObjStatus->bObjMiss = TRUE;
}
//更新目标尺寸
pObjStatus->sfSize.s = pObjStatus->sfSize.w * pObjStatus->sfSize.h;
pObjStatus->fObjPxlsCnt = pObjStatus->sfSize.s;
//更新目标速度
pObjStatus->sfSpeed.vx = (pObjStatus->ptPos.x - pfPosPrePre.x) / 2;
pObjStatus->sfSpeed.vy = (pObjStatus->ptPos.y - pfPosPrePre.y) / 2;
//更新目标角度
Pole pole = getStablePoleFromImagePos(pObjStatus->ptPos,
p_GLB_Input->stCamera, p_GLB_Input->servoInfo, p_GLB_Input->afPlatformRPY, p_GLB_Input->setupErr);
pObjStatus->afAngle.fAz = (FLOAT32)pole.beta;
pObjStatus->afAngle.fPt = (FLOAT32)pole.alpha;
////更新目标角速度,从跟踪管道统一取
pObjStatus->sfAglSpeed.vx = m_LockingPipe->sfAglSpeed.vx;
pObjStatus->sfAglSpeed.vy = m_LockingPipe->sfAglSpeed.vy;
//标记跟踪成功
ubSuccessFlag = TRUE;
}
else
{
//更新目标计数器
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 更新帧编号
pObjStatus->unFrmId = p_GLB_Input->unFrmId;
pObjStatus->unTotalCnt++;
pObjStatus->unTrackedCnt++;
pObjStatus->unContiTrackedCnt = 0;
pObjStatus->unContiLostCnt++;
pObjStatus->bObjMiss = FALSE;
//更新目标丢失/跟踪失败标志
pObjStatus->bObjLost = TRUE;
ANGLE32F afMemoryAngle = { 0 };
POINT32F ptMemoryPos = { 0 };
afMemoryAngle.fAz = DEGLIM360(pObjStatus->afAngle.fAz + pObjStatus->sfAglSpeed.vx);
afMemoryAngle.fPt = DEGLIM(pObjStatus->afAngle.fPt + pObjStatus->sfAglSpeed.vy);
// 稳定系到图像坐标系
Pole targetCarNUEPole;
targetCarNUEPole.alpha = afMemoryAngle.fPt;
targetCarNUEPole.beta = afMemoryAngle.fAz;
targetCarNUEPole.distance = 0;
ptMemoryPos = getImagePosFromStablePole(targetCarNUEPole,
p_GLB_Input->stCamera, p_GLB_Input->servoInfo, p_GLB_Input->afPlatformRPY, p_GLB_Input->setupErr);
pObjStatus->ptPos = ptMemoryPos;
// 每帧更新目标角度值
pObjStatus->afAngle = afMemoryAngle;
//更新目标位置
POINT32F pfPosPrePre = pObjStatus->ptPosPre;
pObjStatus->ptPosPre = pObjStatus->ptPos;
pObjStatus->ptPosFilter.x = (pObjStatus->ptPosPre.x + pObjStatus->sfSpeed.vx + pObjStatus->ptPos.x) / 2;
pObjStatus->ptPosFilter.y = (pObjStatus->ptPosPre.y + pObjStatus->sfSpeed.vy + pObjStatus->ptPos.y) / 2;
if (pObjStatus->nDeciStatus == AIT_Deci)
{
if (IMGO_IsPoint32FOutImg(p_GLB_Input->nImageWidth, p_GLB_Input->nImageHeight, pObjStatusAI->ptPos))
{
pObjStatus->bObjMiss = TRUE;
}
}
else
{
//非射击期间出视场解锁
if (IMGO_IsPoint32FOutImg(p_GLB_Input->nImageWidth, p_GLB_Input->nImageHeight, pObjStatus->ptPos))
{
pObjStatus->bObjMiss = TRUE;
}
}
//更新目标尺寸
pObjStatus->sfSize.s = pObjStatus->sfSize.w * pObjStatus->sfSize.h;
pObjStatus->fObjPxlsCnt = pObjStatus->sfSize.s;
//更新目标角速度
pObjStatus->sfAglSpeed.vx = m_LockingPipe->sfAglSpeed.vx;
pObjStatus->sfAglSpeed.vy = m_LockingPipe->sfAglSpeed.vy;
SINT32 nTrackMemFrmNum = 1000;
if (pObjStatus->unContiLostCnt >= (UINT32)(nTrackMemFrmNum))
{
/*> 若记忆跟踪超时,则标记跟踪丢失, 通知外部解锁 */
//更新目标丢失/跟踪失败标志
pObjStatus->bObjMiss = TRUE;
//标记跟踪失败
ubSuccessFlag = FALSE;
}
else
{
//标记跟踪成功
ubSuccessFlag = TRUE;
}
}
if (bResetKCF)
{
CENTERRECT32F crfCandiRect;
crfCandiRect.cx = pObjStatusAI->ptPos.x;
crfCandiRect.cy = pObjStatusAI->ptPos.y;
crfCandiRect.w = pObjStatusAI->sfSize.w;
crfCandiRect.h = pObjStatusAI->sfSize.h;
pObjStatus->ptPos = pObjStatusAI->ptPos;
pObjStatus->sfSize = pObjStatusAI->sfSize;
// 初始化目标响应及相似度信息
m_pKCFTracker->KCF_InitObjectParametersDeci(img, p_GLB_Input, crfCandiRect, pObjStatus);
m_pOccJudgeKCF->OccJudge_CleanUpObjAglSimInfo();
m_pTargetArrest->ObjArrest_CleanUpObjArrestInfo();
//初始化NCC修正模板
m_pNccCorrect->NCC_IniteTemplet(img, crfCandiRect);
}
if (bResetAI)
{
m_pAITracker->m_Ai_TkCmd.InitBox.cx = pObjStatusKCF->ptPos.x;
m_pAITracker->m_Ai_TkCmd.InitBox.cy = pObjStatusKCF->ptPos.y;
m_pAITracker->m_Ai_TkCmd.InitBox.w = pObjStatusKCF->sfSize.w;
m_pAITracker->m_Ai_TkCmd.InitBox.h = pObjStatusKCF->sfSize.h;
pObjStatusAI->nOcclude_flag = 0;
//g_GLB_stOutput.bIniteDaSiamRPN = 1;
//m_nAIResetCnt = 10;
}
return ubSuccessFlag;
}
void CustomTracker::EventProcess(TrackEvent pEventkcf, TrackEvent pEventAI, GD_VIDEO_FRAME_S img, PIPE* pLockingPipe, GLB_INPUT* p_GLB_Input)
{
// 完全遮挡时,执行目标重捕
if (pEventkcf.occ == OccLev::FULL_OCC)
{
m_pTargetArrest->TLD_RecaptureKCF_Run(img, pLockingPipe, p_GLB_Input);
}
if (pEventAI.occ == OccLev::FULL_OCC && m_pAITracker)
{
m_pTargetArrest->TLD_RecaptureDasiamRPN_Run(img, pLockingPipe, p_GLB_Input, m_pAITracker);
}
}
void CustomTracker::RecapRestProcess(TrackEvent tkEvent, GD_VIDEO_FRAME_S img, PIPE* pLockingPipe, GLB_INPUT* p_GLB_Input)
{
m_pTargetArrest->AID_RecaptureKCF_Run(img, pLockingPipe, p_GLB_Input);
}
bool CustomTracker::GroundTrackKCF(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, API_KCF_Tracker* pKCFTracker, OccJudge* pOccJudge, TrackEvent* tkEventStatus, TLD_Para* pTLDPara)
{
BBOOL bSuccess = TRUE;
RECT32F rfDetectBox = { 0 };
RECT32F rfInputBox = { 0 };
GLB_STATUS nStatus = GLB_STATUS_UNKOWN;
OBJECTSTATUS* pObjStatusKCF = pKCFTracker->GetTrackeStatus();
if (pObjStatusKCF->unContiLostCnt <= 0)
{
nStatus = GLB_STATUS_TRACK;
}
if (m_pNDYTTracker)
{
rfInputBox.x = pObjStatusKCF->ptPos.x - pObjStatusKCF->sfSize.w / 2;
rfInputBox.y = pObjStatusKCF->ptPos.y - pObjStatusKCF->sfSize.h / 2;
rfInputBox.w = pObjStatusKCF->sfSize.w;
rfInputBox.h = pObjStatusKCF->sfSize.h;
rfDetectBox = m_pNDYTTracker->NDYT_Run(img, rfInputBox, nStatus);
}
if (nStatus == GLB_STATUS_TRACK)
{
pKCFTracker->KCF_DetectReset(rfDetectBox);
}
else
{
m_pNDYTTracker->NDYT_Init();
}
// 运行KCF
pKCFTracker->KCF_Run_Detect(img, p_GLB_Input);
//目标遮挡判断
tkEventStatus->occ = pOccJudge->OccEventRecognition(img, pObjStatusKCF, pKCFTracker->GetFHogFeaArray31C(), pKCFTracker->GetFHogFeaSize(), pObjStatusKCF->fConfidence, pTLDPara);
// 如果存在遮挡事件或者响应低于阈值,则进入记忆跟踪
if (tkEventStatus->occ == FULL_OCC)
{
bSuccess = pKCFTracker->KCF_MemTracker(pObjStatusKCF, (SINT32)img.u32Width, (SINT32)img.u32Height, p_GLB_Input);
ObjStatusKCF = *pKCFTracker->GetTrackeStatus();
return bSuccess;
}
// 更新跟踪器
pKCFTracker->KCF_UpdateTracker((SINT32)img.u32Width, (SINT32)img.u32Height, pObjStatusKCF, p_GLB_Input);
ObjStatusKCF = *pKCFTracker->GetTrackeStatus();
return bSuccess;
}
bool CustomTracker::GroundTrackAI(GLB_INPUT* p_GLB_Input, AIT_Interface* pAITracker, OccJudgeAI* pOccJudge,
TrackEvent* tkEventAI, TLD_Para* pTLDPara)
{
BBOOL bSuccess = TRUE;
memset(&pAITracker->m_Ai_TkCmd, 0, sizeof(AIT_Command));
pAITracker->m_Ai_TkCmd.bTrack = true;
OBJECTSTATUS* pObjStatusAI = pAITracker->GetTrackeStatus();
//遮挡状态判断
tkEventAI->occ = pOccJudge->OCC_FrameProcess(p_GLB_Input, pObjStatusAI, pAITracker->GetAIPara(), pTLDPara);
//记忆跟踪状态更新
if (tkEventAI->occ == FULL_OCC)
{
bSuccess = pAITracker->AIT_MemTracker(pObjStatusAI, p_GLB_Input->nImageWidth, p_GLB_Input->nImageHeight, p_GLB_Input);
ObjStatusAI = *pAITracker->GetTrackeStatus();
return bSuccess;
}
//正常跟踪状态更新
pAITracker->AIT_UpdateTracker(p_GLB_Input->nImageWidth, p_GLB_Input->nImageHeight, pObjStatusAI, p_GLB_Input);
ObjStatusAI = *pAITracker->GetTrackeStatus();
return bSuccess;
}
CENTERRECT CustomTracker::getKCFTracker_SrBox()
{
return m_pKCFTracker->KCF_GetSrBox();
}
CENTERRECT CustomTracker::getTLD_SrBox()
{
CENTERRECT rc = { 0 };
RECT32S srBox = m_pTLDTracker->TLD_GetSearchRect();
rc.cx = srBox.x + srBox.w / 2;
rc.cy = srBox.y + srBox.h / 2;
rc.w = srBox.w;
rc.h = srBox.h;
return rc;
}