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.

185 lines
4.8 KiB

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