From 3bfe9ffb6f3d8e63b57abd72095aeff9a4398399 Mon Sep 17 00:00:00 2001 From: wangchongwu <759291707@qq.com> Date: Fri, 22 Aug 2025 14:26:40 +0800 Subject: [PATCH] =?UTF-8?q?1.=E9=87=8D=E6=96=B0=E5=A4=84=E7=90=86=E5=A4=A9?= =?UTF-8?q?=E9=99=85=E7=BA=BF=EF=BC=8C=E4=B8=8D=E5=8D=A0=E7=94=A8=E7=AE=A1?= =?UTF-8?q?=E9=81=93=E8=B5=84=E6=BA=90=202.=E5=B0=86=E6=B3=A2=E9=97=A8?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E6=94=B9=E4=B8=BA=E7=9F=AD=E6=97=B6=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E9=A2=84=E6=B5=8B=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NeoTracker/src/Arith_EOController.cpp | 17 +++++++++++++++++ NeoTracker/src/Arith_EOController.h | 2 ++ NeoTracker/src/Arith_Status_MOTRACK.cpp | 3 +++ NeoTracker/src/Arith_Status_SEARCH.cpp | 17 ----------------- NeoTracker/src/Arith_TrackSAObj.cpp | 13 ++++++++----- NeoTracker/src/Arith_Tracker.cpp | 10 +++++++--- NeoTracker/src/Common/Arith_AglPredict.cpp | 4 ++-- NeoTracker/src/Common/Arith_SysStruct.h | 2 +- NeoTracker/src/debugExport.cpp | 20 ++++++++++++++++++++ NeoTracker/src/debugExport.h | 3 +++ QGuideArithStudio/src/QVideoPlayer.cpp | 17 +++++++++++++++-- QGuideArithStudio/src/QVideoPlayer.h | 2 +- 12 files changed, 79 insertions(+), 31 deletions(-) diff --git a/NeoTracker/src/Arith_EOController.cpp b/NeoTracker/src/Arith_EOController.cpp index b479574..8728511 100644 --- a/NeoTracker/src/Arith_EOController.cpp +++ b/NeoTracker/src/Arith_EOController.cpp @@ -1048,7 +1048,24 @@ void Arith_CalcTargetSysInfo(TARGET_OBJECT* pTargetObj, SINT32 nFrmNum, GLB_INP } } +void DeleteTargetSkyLine(TARGET_OBJECT* pTargetArr, int num, GLB_PARAMETERS& g_para) +{ + // 不使用天地线 + if (!g_para.bFiteredAlarm) + { + return; + } + + for (int i = 0; i < num; i++) + { + TARGET_OBJECT* tTarget = &pTargetArr[i]; + if (tTarget->afAngle.fPt < g_para.fFilterPt) + { + tTarget->bObject = false; + } + } +} void Arith_EOController::GLB_Release_Trackers(SINT32 nPipeNum) { diff --git a/NeoTracker/src/Arith_EOController.h b/NeoTracker/src/Arith_EOController.h index 16c9b16..f32e144 100644 --- a/NeoTracker/src/Arith_EOController.h +++ b/NeoTracker/src/Arith_EOController.h @@ -14,6 +14,8 @@ void Arith_CalcTargetSysInfo(TARGET_OBJECT* pTargetObj, SINT32 nFrmNum, GLB_INPUT g_Input); +void DeleteTargetSkyLine(TARGET_OBJECT* pTargetArr, int num, GLB_PARAMETERS& g_para); + class Arith_EOController { public: diff --git a/NeoTracker/src/Arith_Status_MOTRACK.cpp b/NeoTracker/src/Arith_Status_MOTRACK.cpp index 59382e0..26336af 100644 --- a/NeoTracker/src/Arith_Status_MOTRACK.cpp +++ b/NeoTracker/src/Arith_Status_MOTRACK.cpp @@ -316,6 +316,9 @@ BBOOL Arith_EOController::Arith_Status_MOTRACK(GD_VIDEO_FRAME_S img, GLB_INPUT& // 目标系统相关的其他信息计算 Arith_CalcTargetSysInfo(pFrameTargetArray, nFrmTargetNum, g_Input); + // 拦截天地线以下的目标 + DeleteTargetSkyLine(pFrameTargetArray, nFrmTargetNum, g_para); + // MOT管道处理 g_GLB_PipeProc->Run(pFrameTargetArray, nFrmTargetNum, GLB_STATUS_TRACK, g_Input, m_SceneType); diff --git a/NeoTracker/src/Arith_Status_SEARCH.cpp b/NeoTracker/src/Arith_Status_SEARCH.cpp index b2ee75c..91ee8f8 100644 --- a/NeoTracker/src/Arith_Status_SEARCH.cpp +++ b/NeoTracker/src/Arith_Status_SEARCH.cpp @@ -174,24 +174,7 @@ SINT32 Arith_EOController::Proc_SearchLock(GD_VIDEO_FRAME_S img, GLB_INPUT & g_I } -void DeleteTargetSkyLine(TARGET_OBJECT* pTargetArr, int num, GLB_PARAMETERS& g_para) -{ - // 不使用天地线 - if (!g_para.bFiteredAlarm) - { - return; - } - - for (int i = 0; i < num; i++) - { - TARGET_OBJECT* tTarget = &pTargetArr[i]; - if (tTarget->afAngle.fPt < g_para.fFilterPt) - { - tTarget->bObject = false; - } - } -} /************************************* diff --git a/NeoTracker/src/Arith_TrackSAObj.cpp b/NeoTracker/src/Arith_TrackSAObj.cpp index ebdc5b1..babc09c 100644 --- a/NeoTracker/src/Arith_TrackSAObj.cpp +++ b/NeoTracker/src/Arith_TrackSAObj.cpp @@ -435,9 +435,11 @@ void SA_Tracker::SetAutoSearchZone(SINT32 nWidth, SINT32 nHeight, GLB_INPUT* p_G SINT32 nPipeRadiusTrack = m_TSA_Param.nPipeRadiusTrack; SINT32 nPipeRadiusLost = m_TSA_Param.nPipeRadiusLost; //根据目标速度预测目标在当前帧的坐标位置 + + // 伺服太晃,直接使用短时预测。 nEnd = m_LockingPipe->ubEnd; - pPipe->ptCurrentPnt.x = pPipe->stMotionMod_mean.crnObjPrediRtLong.cx; - pPipe->ptCurrentPnt.y = pPipe->stMotionMod_mean.crnObjPrediRtLong.cy; + pPipe->ptCurrentPnt.x = pPipe->stMotionMod_mean.crnObjPrediRtNear.cx; + pPipe->ptCurrentPnt.y = pPipe->stMotionMod_mean.crnObjPrediRtNear.cy; // 取长时预测点作为管道当前位置预测 if (PIPE_EVENT_JUST_LOCK == m_LockingPipe->ubEventStatus) @@ -452,6 +454,7 @@ void SA_Tracker::SetAutoSearchZone(SINT32 nWidth, SINT32 nHeight, GLB_INPUT* p_G } + //判断管道目标是否超出视场 //if (IMGO_IsPoint16SOutImg(nWidth, nHeight, pPipe->ptCurrentPnt)) if(IMGO_IsPoint32FOutImg(nWidth, nHeight, ptCurrentPnt)) @@ -1175,7 +1178,7 @@ SINT32 SA_Tracker::FindMatchTarget(PIPE* pPipe, TARGET_OBJECT* ptTargetArray, SI //局部变量 FLOAT32 fSim = 0.0f; //目标相似度 FLOAT32 fSimMax = -1.0f;//目标相似度最大值 - FLOAT32 fSimThres = 0.7f; //相似度阈值 + FLOAT32 fSimThres = 0.2f; //相似度阈值 SINT32 nFrmsStep = 1; //帧间隔 TARGET_OBJECT* ptMainTarget = NULL; //主管道目标 TARGET_OBJECT* ptTarget = NULL; //候选目标 @@ -1377,8 +1380,8 @@ SINT32 SA_Tracker::FindMatchTarget(PIPE* pPipe, TARGET_OBJECT* ptTargetArray, SI fAScaleChangeHighThres = 2.0; nLastDiffThresX = MAX(nMoveMin, 6); nLastDiffThresY = MAX(nMoveMin, 6); - nPredictDiffThresX = MAX(nFThreMin, 6); - nPredictDiffThresY = MAX(nFThreMin, 6); + nPredictDiffThresX = MAX(nFThreMin, 12); + nPredictDiffThresY = MAX(nFThreMin, 12); } diff --git a/NeoTracker/src/Arith_Tracker.cpp b/NeoTracker/src/Arith_Tracker.cpp index 94dc6df..3e72c19 100644 --- a/NeoTracker/src/Arith_Tracker.cpp +++ b/NeoTracker/src/Arith_Tracker.cpp @@ -150,9 +150,13 @@ bool Tracker::Track(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, API_MOT_PIPE* // 基于窗口平均计算管道长短时预测点 Predict_ObjAglTrackPredict(&m_LockingPipe->stMotionMod_mean, img.u32Width, img.u32Height, p_GLB_Input); - m_LockingPipe->afCurrentAgl = m_LockingPipe->stMotionMod_mean.ObjAglListsLong.arfFilter.afAngle; - m_LockingPipe->ptCurrentPnt.x = m_LockingPipe->stMotionMod_mean.crnObjPrediRtLong.cx; - m_LockingPipe->ptCurrentPnt.y = m_LockingPipe->stMotionMod_mean.crnObjPrediRtLong.cy; + //m_LockingPipe->afCurrentAgl = m_LockingPipe->stMotionMod_mean.ObjAglListsLong.arfFilter.afAngle; + //m_LockingPipe->ptCurrentPnt.x = m_LockingPipe->stMotionMod_mean.crnObjPrediRtLong.cx; + //m_LockingPipe->ptCurrentPnt.y = m_LockingPipe->stMotionMod_mean.crnObjPrediRtLong.cy; + + m_LockingPipe->afCurrentAgl = m_LockingPipe->stMotionMod_mean.ObjAglListsNear.arfFilter.afAngle; + m_LockingPipe->ptCurrentPnt.x = m_LockingPipe->stMotionMod_mean.crnObjPrediRtNear.cx; + m_LockingPipe->ptCurrentPnt.y = m_LockingPipe->stMotionMod_mean.crnObjPrediRtNear.cy; // 跟踪找到目标 if (m_type == GLB_SCEN_MODE::GLB_SCEN_SKY) diff --git a/NeoTracker/src/Common/Arith_AglPredict.cpp b/NeoTracker/src/Common/Arith_AglPredict.cpp index 99b69e0..2c987e9 100644 --- a/NeoTracker/src/Common/Arith_AglPredict.cpp +++ b/NeoTracker/src/Common/Arith_AglPredict.cpp @@ -187,7 +187,7 @@ void Predict_ObjAglTrackPredict(FilterMeanNL* pFilter, SINT32 nWidth, SINT32 nHe //SINT32 nNLDist2Thres = g_DST_stPara.nPipeRadiusTrack * g_DST_stPara.nPipeRadiusTrack; // SINT32 nNLDist2Thres = 20*20; //SINT32 nNLDist2Thres = (g_GLB_stOutput.ObjectStatus.sfSize.h * g_GLB_stOutput.ObjectStatus.sfSize.w) * 25; - SINT32 nNLDist2Thres = 10 * 25; + SINT32 nNLDist2Thres = 10*10; nNLDist2Thres = MAX(nNLDist2Thres,100); if (fNLDist2 - fNLDist2Pre > 2 @@ -200,7 +200,7 @@ void Predict_ObjAglTrackPredict(FilterMeanNL* pFilter, SINT32 nWidth, SINT32 nHe pFilter->nObjPredictFarCnt = 0; pFilter->bObjPredictAbnormal = FALSE; } - if (pFilter->nObjPredictFarCnt > 10 + if (pFilter->nObjPredictFarCnt > 5 && fNLDist2 > nNLDist2Thres) { pFilter->bObjPredictAbnormal = TRUE; diff --git a/NeoTracker/src/Common/Arith_SysStruct.h b/NeoTracker/src/Common/Arith_SysStruct.h index fb21861..78d885c 100644 --- a/NeoTracker/src/Common/Arith_SysStruct.h +++ b/NeoTracker/src/Common/Arith_SysStruct.h @@ -97,7 +97,7 @@ #define GLB_GROUP_PIPENUM_MAX 3 //组包含的管道个数(只支持3个合并) //管道确认帧数 -#define GLB_PIPE_AWS_FRAME_STARE 5 //管道目标确认(报警)的最少帧数:凝视 +#define GLB_PIPE_AWS_FRAME_STARE 3 //管道目标确认(报警)的最少帧数:凝视 #define GLB_PIPE_AWS_FRAME_SCAN 3 //管道目标确认(报警)的最少帧数:扫描 #define GLB_PIPE_NUM_SECTOR 9 //目标运动方向分割 qw 20220112 diff --git a/NeoTracker/src/debugExport.cpp b/NeoTracker/src/debugExport.cpp index d7cacd7..7fc2374 100644 --- a/NeoTracker/src/debugExport.cpp +++ b/NeoTracker/src/debugExport.cpp @@ -293,6 +293,26 @@ DAT_OUTPUT* ARIDLL_GetTrkDAT_stOutput(ArithHandle hArithSrc, int pipeID) return pArith->g_GLB_Trackers[pipeID]->pSkyTracker->pSATracker->pDAT_Module->getDAT_stOutput(); } +DBG_TRACKER_API int ARIDLL_GetSkyLineY(ArithHandle hArithSrc) +{ + Arith_EOController* pArith = (Arith_EOController*)hArithSrc; + + auto input = &pArith->g_GLB_stInput; + + if (pArith->g_GLB_stPara.bFiteredAlarm) + { + Pole skyPole = { 0 }; + skyPole.alpha = pArith->g_GLB_stPara.fFilterPt; + skyPole.beta = input->servoInfo.fAz; //这个车基本是平的,不然需要找到当前视场方位角 + + POINT32F Skypos = getImagePosFromStablePole(skyPole, input->stCamera, input->servoInfo, input->afPlatformRPY, input->setupErr); + + return Skypos.y; + } + + return -1; +} + FilterMeanNL* ARIDLL_GetTrackerHistInfo(ArithHandle hArithSrc, int pipeID) { diff --git a/NeoTracker/src/debugExport.h b/NeoTracker/src/debugExport.h index 620290a..66f94e5 100644 --- a/NeoTracker/src/debugExport.h +++ b/NeoTracker/src/debugExport.h @@ -146,6 +146,9 @@ DBG_TRACKER_API DAT_PARAMETERS* ARIDLL_GetTrkDAT_stPara(ArithHandle hArithSrc, i // 跟踪器局部检测面结果输出 DBG_TRACKER_API DAT_OUTPUT* ARIDLL_GetTrkDAT_stOutput(ArithHandle hArithSrc, int pipeID); +// 输出天地线 +DBG_TRACKER_API int ARIDLL_GetSkyLineY(ArithHandle hArithSrc); + ////////////////////////////////////////////////////////////////////////// ////////////////////////////TLD检测结果导出/////////////////////////////// diff --git a/QGuideArithStudio/src/QVideoPlayer.cpp b/QGuideArithStudio/src/QVideoPlayer.cpp index 0fb878f..13728f9 100644 --- a/QGuideArithStudio/src/QVideoPlayer.cpp +++ b/QGuideArithStudio/src/QVideoPlayer.cpp @@ -650,6 +650,8 @@ void QVideoPlayer::DrawArithResult() // 导引信息 DrawGuideRect(); + DrawSkyLine(m_ImageViewer); + // 绘制单帧检测(外部传入) if (bEnableDrawFrameDetect) { @@ -892,22 +894,27 @@ void QVideoPlayer::DrawTrackersInfo() str = QString(_S("ID:%1 conf:%2,Src:%3,mem:%4")).arg(obj->nOutputID).arg(QString::number(fconf, 'f', 3)).arg(src).arg(lostCnt); str1 = QString(_S("type:%1")).arg(obj->unClsType); + + QString str2 = QString(_S("SNR:%1, dGray:%2")).arg(obj->fSNR).arg(obj->nObjGray - obj->fBkgGray); if (obj->nOutputID >= 2) { continue; } auto text = scene->addSimpleText(str); auto text1 = scene->addSimpleText(str1); + auto text2 = scene->addSimpleText(str2); if (sabox.w == 0 || sabox.h == 0) { text->setPos(QPoint(kcfBox.x - 10, kcfBox.y - 10)); text1->setPos(QPoint(kcfBox.x - 10, kcfBox.y + kcfBox.h + 10)); + } else { text->setPos(QPoint(sabox.x - 10, sabox.y - 10)); text1->setPos(QPoint(sabox.x - 10, sabox.y + sabox.h + 10)); + text2->setPos(QPoint(sabox.x - 10, sabox.y + sabox.h + 20)); } QFont ft; ft.setPointSize(8); text->setBrush(QBrush(QColor(Qt::red))); @@ -1599,10 +1606,16 @@ void QVideoPlayer::DrawCrossInImage(QImageViewer* view, QRect rect, QPen pen) } -void QVideoPlayer::DrawSkyLine(QImageViewer* view,int y) +void QVideoPlayer::DrawSkyLine(QImageViewer* view) { - + int skyY = ARIDLL_GetSkyLineY(pEOTracker); + if (skyY > 0) + { + QGraphicsScene* scene = view->imgScene; + + scene->addLine(QLine(0, skyY, 640, skyY), QPen(QBrush(QColor(Qt::red)),3,Qt::DashDotLine)); + } } void QVideoPlayer::DrawGuideRect() diff --git a/QGuideArithStudio/src/QVideoPlayer.h b/QGuideArithStudio/src/QVideoPlayer.h index a44685a..ebc7a5e 100644 --- a/QGuideArithStudio/src/QVideoPlayer.h +++ b/QGuideArithStudio/src/QVideoPlayer.h @@ -243,7 +243,7 @@ private: void PrintTableInfo(); // 绘制天地线 - void DrawSkyLine(QImageViewer* view, int y); + void DrawSkyLine(QImageViewer* view); // 绘制导引区域 void DrawGuideRect();