增加bTrackingPipe与bTracking互斥保护,防止输出错误

main
11566hyc 11 months ago
parent cd16b97863
commit 9730739fed

@ -907,6 +907,11 @@ void Arith_EOController::GLB_Release_Trackers(SINT32 nPipeNum)
pPipe->bTracking = FALSE; pPipe->bTracking = FALSE;
pPipe->nDelCntThres = GLB_PIPE_DEL_MIN_STARE; pPipe->nDelCntThres = GLB_PIPE_DEL_MIN_STARE;
} }
if (pPipe->bTrackingPipe)
{
pPipe->bTrackingPipe = FALSE;
pPipe->nDelCntThres = GLB_PIPE_DEL_MIN_STARE;
}
pPipe->nShowPipeID = 0;//清空外部显示批号 pPipe->nShowPipeID = 0;//清空外部显示批号
} }
} }

@ -13,9 +13,6 @@ void Arith_EOController::Proc_MOTLock(GD_VIDEO_FRAME_S img, GLB_INPUT & g_Input,
#if 1 #if 1
// 管道队列 // 管道队列
PIPE* pPipeArray = g_GLB_PipeProc->getPipeArray(); PIPE* pPipeArray = g_GLB_PipeProc->getPipeArray();
// 原跟踪管道跟踪器所有权转移给当前锁定管道后续的资源释放交给g_GLB_Trackers[nChoicePipeID] 这条管道
auto tracker = g_GLB_Trackers[g_GLB_stPara.nLockPipeInd];
if (g_GLB_stPara.stLockCtrl == LockMode::LOCK_POINT) if (g_GLB_stPara.stLockCtrl == LockMode::LOCK_POINT)
{ {
// 找到点选的附近告警管道 // 找到点选的附近告警管道
@ -58,7 +55,7 @@ void Arith_EOController::Proc_MOTLock(GD_VIDEO_FRAME_S img, GLB_INPUT & g_Input,
pPipe->bTracking = true; pPipe->bTracking = true;
pPipe->nDelCntThres = GLB_FRM_FREQ; //辅跟踪目标记忆1S pPipe->nDelCntThres = GLB_FRM_FREQ; //辅跟踪目标记忆1S
g_GLB_stPara.bEnForceGuide = FALSE; //强制提取复位 g_GLB_stPara.bEnForceGuide = FALSE; //强制提取复位
g_GLB_stPara.stLockCtrl = LOCK_NONE; //锁定标记复位
//tracker->ResetByBackPipe(&pPipeArray[nChoicePipeID], img, &g_Input, 1); //tracker->ResetByBackPipe(&pPipeArray[nChoicePipeID], img, &g_Input, 1);
//g_GLB_PipeProc->DelPipe(&pPipeArray[nChoicePipeID]); //g_GLB_PipeProc->DelPipe(&pPipeArray[nChoicePipeID]);
@ -68,7 +65,7 @@ void Arith_EOController::Proc_MOTLock(GD_VIDEO_FRAME_S img, GLB_INPUT & g_Input,
//g_GLB_stPara.nStatus = GLB_STATUS_TRACK; //g_GLB_stPara.nStatus = GLB_STATUS_TRACK;
} }
g_GLB_stPara.stLockCtrl = LOCK_NONE; //锁定标记复位
} }
return; return;
@ -258,7 +255,11 @@ BBOOL Arith_EOController::Arith_Status_MOTRACK(GD_VIDEO_FRAME_S img, GLB_INPUT&
// 管道队列 // 管道队列
PIPE* pPipeArray = g_GLB_PipeProc->getPipeArray(); PIPE* pPipeArray = g_GLB_PipeProc->getPipeArray();
SINT32 nPipeArrayLen = g_GLB_stPara.nPipeMaxNum; SINT32 nPipeArrayLen = g_GLB_stPara.nPipeMaxNum;
// 目标系统相关的其他信息计算
Arith_CalcTargetSysInfo(pFrameTargetArray, nFrmTargetNum, g_Input);
// MOT管道处理
g_GLB_PipeProc->Run(pFrameTargetArray, nFrmTargetNum, GLB_STATUS_TRACK, g_Input);
// 执行MOT // 执行MOT
//SINT32 nTrackingNum = MultiTargteTrack(img, g_GLB_PipeProc, g_GLB_Trackers, &g_Input, nPipeArrayLen, &g_stArithPara); //SINT32 nTrackingNum = MultiTargteTrack(img, g_GLB_PipeProc, g_GLB_Trackers, &g_Input, nPipeArrayLen, &g_stArithPara);
// 取被锁定的单目标管道 // 取被锁定的单目标管道
@ -296,11 +297,7 @@ BBOOL Arith_EOController::Arith_Status_MOTRACK(GD_VIDEO_FRAME_S img, GLB_INPUT&
// 处理锁定指令,初始化跟踪 // 处理锁定指令,初始化跟踪
Proc_MOTLock(img, g_Input, g_para); Proc_MOTLock(img, g_Input, g_para);
// 目标系统相关的其他信息计算
Arith_CalcTargetSysInfo(pFrameTargetArray, nFrmTargetNum, g_Input);
// MOT管道处理
g_GLB_PipeProc->Run(pFrameTargetArray, nFrmTargetNum, GLB_STATUS_TRACK, g_Input);
if (nTrackingNum > 1) if (nTrackingNum > 1)
{ {

@ -118,7 +118,7 @@ SINT32 Arith_EOController::Proc_SearchLock(GD_VIDEO_FRAME_S img, GLB_INPUT & g_I
// 管道标记为跟踪 // 管道标记为跟踪
pLockPipe->bTrackingPipe = true; pLockPipe->bTrackingPipe = true;
pLockPipe->bTracking = FALSE;//防止后续显示错误
// 转入跟踪状态 // 转入跟踪状态
g_GLB_stPara.stLockCtrl = LOCK_NONE; //锁定标记复位 g_GLB_stPara.stLockCtrl = LOCK_NONE; //锁定标记复位
g_GLB_stPara.bEnForceGuide = FALSE; //强制提取复位 g_GLB_stPara.bEnForceGuide = FALSE; //强制提取复位

@ -139,7 +139,7 @@ void Arith_EOController::Proc_SOTLock_NoRemainID(GD_VIDEO_FRAME_S img, GLB_INPUT
// 转移跟踪状态 // 转移跟踪状态
pNewLockPipe->bTrackingPipe = true; pNewLockPipe->bTrackingPipe = true;
pNewLockPipe->bTracking = false;
// 删除原目标管道 // 删除原目标管道
g_GLB_PipeProc->DelPipe(pOldPipe); g_GLB_PipeProc->DelPipe(pOldPipe);
@ -176,7 +176,7 @@ void Arith_EOController::Proc_SOTLock_NoRemainID(GD_VIDEO_FRAME_S img, GLB_INPUT
// 转移跟踪状态 // 转移跟踪状态
pNewLockPipe->bTrackingPipe = true; pNewLockPipe->bTrackingPipe = true;
pNewLockPipe->bTracking = false;
// 删除原目标管道 // 删除原目标管道
g_GLB_PipeProc->DelPipe(pOldPipe); g_GLB_PipeProc->DelPipe(pOldPipe);

@ -90,6 +90,7 @@ bool SA_Tracker::Init(UINT16* pSrc, SINT32 nWidth, SINT32 nHeight, PIPE* pTracki
// 标记为跟踪管道 // 标记为跟踪管道
m_LockingPipe->bTrackingPipe = true; m_LockingPipe->bTrackingPipe = true;
m_LockingPipe->bTracking = false;
SINT32 nEnd = m_LockingPipe->ubEnd; SINT32 nEnd = m_LockingPipe->ubEnd;
SINT32 nObjSize = (SINT32)(m_LockingPipe->ObjectFilter.fPxlsCnt); SINT32 nObjSize = (SINT32)(m_LockingPipe->ObjectFilter.fPxlsCnt);
TARGET_OBJECT* pTrackingTarget = &m_LockingPipe->objHistoryList[nEnd]; TARGET_OBJECT* pTrackingTarget = &m_LockingPipe->objHistoryList[nEnd];

@ -206,7 +206,7 @@ bool Tracker::ResetByBackPipe(PIPE* pNewPipe, GD_VIDEO_FRAME_S img, GLB_INPUT* p
// 恢复跟踪标记 // 恢复跟踪标记
pPipeOld->bTrackingPipe = true; pPipeOld->bTrackingPipe = true;
pPipeOld->bTracking = false;
// 新管道被eat,需完全删除交外部执行tracker没这个权限。 // 新管道被eat,需完全删除交外部执行tracker没这个权限。

@ -474,7 +474,10 @@ void ARIDLL_OutputPipeTarget(Arith_EOController* pArith, ARIDLL_OUTPUT* pstOutpu
{ {
obj.nOutputID = pPipe->nGuideBatchID; obj.nOutputID = pPipe->nGuideBatchID;
} }
if (pPipe->bTrackingPipe)
{
pPipe->bTracking = FALSE;
}
// 跟踪目标送进跟踪队列 // 跟踪目标送进跟踪队列
if (pPipe->bTrackingPipe || pPipe->bTracking) if (pPipe->bTrackingPipe || pPipe->bTracking)
{ {
@ -487,7 +490,7 @@ void ARIDLL_OutputPipeTarget(Arith_EOController* pArith, ARIDLL_OUTPUT* pstOutpu
} }
else else
{ {
if (0 < pPipe->nShowPipeID) if (1 < pPipe->nShowPipeID)
{ {
obj.nOutputID = pPipe->nShowPipeID; obj.nOutputID = pPipe->nShowPipeID;
} }
@ -497,6 +500,10 @@ void ARIDLL_OutputPipeTarget(Arith_EOController* pArith, ARIDLL_OUTPUT* pstOutpu
{ {
continue;//最大到255 continue;//最大到255
} }
if (pArith->g_TrackCurrentID < 2)
{
pArith->g_TrackCurrentID = 2;//防错
}
pPipe->nShowPipeID = pArith->g_TrackCurrentID; pPipe->nShowPipeID = pArith->g_TrackCurrentID;
obj.nOutputID = pPipe->nShowPipeID; obj.nOutputID = pPipe->nShowPipeID;
pArith->g_TrackCurrentID++; pArith->g_TrackCurrentID++;

Loading…
Cancel
Save