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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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