#include "Arith_CustomTracker.h" #include "Arith_AIDMonitor.h" #include "API_KCF_Tracker.h" #include "Arith_timer.h" CustomTracker::CustomTracker(SINT32 nWidth, SINT32 nHeight) { m_pAITracker = nullptr; m_pKCFTracker = nullptr; m_pKCFTracker = API_KCF_Tracker::Create(56, 64); } CustomTracker::~CustomTracker() { if (m_pKCFTracker) { API_KCF_Tracker::Destroy(m_pKCFTracker); } } bool CustomTracker::Init(GD_VIDEO_FRAME_S img, PIPE* pLockPipe, GLB_INPUT* p_GLB_Input) { // 锁定管道传指针 m_LockingPipe = pLockPipe; if (m_pKCFTracker) { m_pKCFTracker->KCF_InitObjectParameters(img, pLockPipe, p_GLB_Input); } 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) { // 运行KCF m_pKCFTracker->KCF_Run_Detect(img, p_GLB_Input); //更新KCF运动模型 m_pKCFTracker->UpdateTrackerMotion(p_GLB_Input); } // 跟踪决策及模型更新 bTrackStatus = TrackDecision(img, p_GLB_Input); if (bTrackStatus) { } else { // 跟踪失败,解锁 Cancle(); // 返回跟踪状态 return bTrackStatus; } // 返回跟踪状态 return bTrackStatus; } void CustomTracker::Cancle() { PIPE* pPipe = m_LockingPipe; if (pPipe) { pPipe->bTrackingPipe = false; } memset(&ObjStatus, 0, sizeof(OBJECTSTATUS)); } 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; }