近期修改

main
wangchongwu 3 months ago
parent 3bfe9ffb6f
commit ee96b4191c

@ -0,0 +1,75 @@
#include "Arith_PosAnalyse.h"
ImagePosRecord::ImagePosRecord()
{
reset();
}
ImagePosRecord::~ImagePosRecord()
{
}
ImagePosRecord::STATUS ImagePosRecord::update(POINT32F pos)
{
if (p_Last.x == 0 && p_Last.y == 0)
{
stPositonMove[ubEnd].x = 0;
stPositonMove[ubEnd].y = 0;
}
else
{
stPositonMove[ubEnd].x = pos.x - p_Last.x;
stPositonMove[ubEnd].y = pos.y - p_Last.y;
}
p_Last = pos;
ubEnd = (ubEnd + 1) % TRACK_POS_REC_MAX;
nTotalCnt++;
return Analyse();
}
void ImagePosRecord::reset()
{
ubEnd = 0;
nTotalCnt = 0;
p_Last.x = 0;
p_Last.y = 0;
memset(stPositonMove, 0, sizeof(POINT32F) * TRACK_POS_REC_MAX);
}
ImagePosRecord::STATUS ImagePosRecord::Analyse()
{
//
int VecFluCnt = 0; //速度波动
int aFluCnt = 0; //加速度波动
if (nTotalCnt > 10)
{
for (size_t i = 0; i < MIN(TRACK_POS_REC_MAX, nTotalCnt); i++)
{
int indCurr = (ubEnd - i + TRACK_POS_REC_MAX) % TRACK_POS_REC_MAX;
int indLast = (ubEnd - i - 1 + TRACK_POS_REC_MAX) % TRACK_POS_REC_MAX;
auto movedisCurr = sqrt(stPositonMove[indCurr].x * stPositonMove[indCurr].x + stPositonMove[indCurr].y * stPositonMove[indCurr].y);
auto movedisLast = sqrt(stPositonMove[indLast].x * stPositonMove[indLast].x + stPositonMove[indLast].y * stPositonMove[indLast].y);
if (movedisCurr > 6)
{
VecFluCnt++;
}
if (ABS(movedisCurr) > ABS(movedisLast) * 2 && ABS(movedisCurr) > 5)
{
aFluCnt++;
}
}
}
if (VecFluCnt > 2 || aFluCnt > 0)
{
return STATUS::NOTSTABLE;
}
return STATUS::STATBLE;
}

@ -0,0 +1,36 @@
// 目标像方位置记录,并估计伺服控制状态,不稳定时不使用惯性预测
#pragma once
#include "Arith_Common.hpp"
class ImagePosRecord
{
enum STATUS
{
STATBLE,
NOTSTABLE
};
public:
ImagePosRecord();
~ImagePosRecord();
public:
STATUS update(POINT32F pos); // 更新坐标
void reset();
STATUS Analyse();
private:
UBYTE8 ubEnd;
SINT32 nTotalCnt;
POINT32F stPositonMove[TRACK_POS_REC_MAX]; //帧间运动
POINT32F p_Last; //起始点
//
BBOOL bStable; //稳态
};

@ -362,6 +362,9 @@ TrackUnlockState SkyTracker::Track(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input,
{ {
// 自动切换跟踪器 // 自动切换跟踪器
SetTrackModeAuto(img, p_GLB_Input); SetTrackModeAuto(img, p_GLB_Input);
// 调整惯性预测建议
m_posRecorder.update(m_TSky_Output.ObjectStatusDesc.ptPos);
// 小面跟踪目标及背景监控 // 小面跟踪目标及背景监控
if (pSATracker && mTrakingPara.Sky_bEnableTrackSA) if (pSATracker && mTrakingPara.Sky_bEnableTrackSA)
@ -520,6 +523,8 @@ void SkyTracker::Cancle()
memset(&m_TSky_Output.ObjectStatusKCF, 0, sizeof(OBJECTSTATUS)); memset(&m_TSky_Output.ObjectStatusKCF, 0, sizeof(OBJECTSTATUS));
memset(&m_TSky_Output.ObjectStatusDesc, 0, sizeof(OBJECTSTATUS)); memset(&m_TSky_Output.ObjectStatusDesc, 0, sizeof(OBJECTSTATUS));
m_posRecorder.reset();
} }
void SkyTracker::SetMemTrack(bool bMemFlag) void SkyTracker::SetMemTrack(bool bMemFlag)
@ -918,7 +923,7 @@ void SkyTracker::SetTrackModeAuto(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input)
} }
#endif #endif
if (nCount >= GLB_TRACK_SMALL2FACE_THRES && bFindAreaTarget) //以338A对空抗干扰数据--双机小目标交错为例 if (nCount >= GLB_TRACK_SMALL2FACE_THRES || bFindAreaTarget) //以338A对空抗干扰数据--双机小目标交错为例
{ {
crfCandiRect.cx = pObjStatus->ptPos.x; crfCandiRect.cx = pObjStatus->ptPos.x;
crfCandiRect.cy = pObjStatus->ptPos.y; crfCandiRect.cy = pObjStatus->ptPos.y;
@ -1311,4 +1316,5 @@ void SkyTracker::SkyTrackFalse_Process(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_In
SkyTrkStatusInfo.nAbnormalCnt += 1; SkyTrkStatusInfo.nAbnormalCnt += 1;
} }
} }
} }

@ -9,7 +9,7 @@
#include "Matcher/Fast_Matcher.h" #include "Matcher/Fast_Matcher.h"
#include "Arith_RadarInfo.h" #include "Arith_RadarInfo.h"
#include "Arith_AIDMonitor.h" #include "Arith_AIDMonitor.h"
#include "Arith_PosAnalyse.h"
// 决策行为 // 决策行为
enum Act enum Act
{ {
@ -107,6 +107,11 @@ typedef struct tagPipeMainStatusInfo
SINT32 nAbnormalCnt; // 异常次数累计 SINT32 nAbnormalCnt; // 异常次数累计
}PipeMainStatusInfo; }PipeMainStatusInfo;
class SkyTracker class SkyTracker
{ {
public: public:
@ -181,6 +186,7 @@ public:
// 产生决策 // 产生决策
DecPolicy Decision(GD_VIDEO_FRAME_S img); DecPolicy Decision(GD_VIDEO_FRAME_S img);
// KCF+CEND决策处理 // KCF+CEND决策处理
DecPolicy TO_TrackDecisionOf_KCF_CEND(GD_VIDEO_FRAME_S img); DecPolicy TO_TrackDecisionOf_KCF_CEND(GD_VIDEO_FRAME_S img);
@ -233,6 +239,9 @@ private:
void SkyTrackFalse_Process(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, OBJECTSTATUS* ObjStatus, PIPE* m_LockingPipe); void SkyTrackFalse_Process(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, OBJECTSTATUS* ObjStatus, PIPE* m_LockingPipe);
private: private:
ImagePosRecord m_posRecorder; //pos统计
bool bsvmInitDone;// bool bsvmInitDone;//
PipeMainClassifyInfo* pipeClassifyInfo; // 主跟踪管道对应的信息缓存,用于在告警操作中进行类别确认 PipeMainClassifyInfo* pipeClassifyInfo; // 主跟踪管道对应的信息缓存,用于在告警操作中进行类别确认

@ -70,6 +70,8 @@ SA_Tracker::SA_Tracker(int nWidth, int nHeight)
memset(nSimTargetNum_Counter, -1, GLB_SIMOBJ_VALID_CNT * sizeof(SINT32)); memset(nSimTargetNum_Counter, -1, GLB_SIMOBJ_VALID_CNT * sizeof(SINT32));
SATrkState = LockStateUnknown; // 小面记忆跟踪状态跟踪 SATrkState = LockStateUnknown; // 小面记忆跟踪状态跟踪
} }
@ -204,9 +206,14 @@ int SA_Tracker::Track(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, API_MOT_PIPE
SINT32 nRealPipeNum = g_GLB_PipeProc->PIPE_GetAlarmNum(); SINT32 nRealPipeNum = g_GLB_PipeProc->PIPE_GetAlarmNum();
SINT32 m_nMaxPipeNum = g_GLB_PipeProc->PIPE_GetMaxPipeNum(); SINT32 m_nMaxPipeNum = g_GLB_PipeProc->PIPE_GetMaxPipeNum();
SINT32 nPipeRadiusTrack = g_GLB_PipeProc->GetParam().nPipeRadiusTrack; SINT32 nPipeRadiusTrack = g_GLB_PipeProc->GetParam().nPipeRadiusTrack;
SINT32 nPipeRaduisLost = g_GLB_PipeProc->GetParam().nPipeRadiusLost;
PIPE_PARAMETERS MOT_PARA = g_GLB_PipeProc->GetParam();
nTrackTargetID = -1; nTrackTargetID = -1;
// 同步管道参数
m_TSA_Param.nPipeRadiusTrack = nPipeRadiusTrack;
m_TSA_Param.nPipeRadiusLost = nPipeRaduisLost;
//调整搜索区域大小,为分块宽高的整数倍 //调整搜索区域大小,为分块宽高的整数倍
SetAutoSearchZone(nWidth, nHeight, p_GLB_Input); SetAutoSearchZone(nWidth, nHeight, p_GLB_Input);
@ -399,7 +406,7 @@ SINT32 SA_Tracker::getInterfereAreaTargteNum(RECT32S bbox)
TARGET_OBJECT* pObj = &pDAT_Module->GetTargetArray()[i]; TARGET_OBJECT* pObj = &pDAT_Module->GetTargetArray()[i];
if (ABS(pObj->pfCenPos.x - nX) < MAX(50, bbox.w * 3) && if (ABS(pObj->pfCenPos.x - nX) < MAX(50, bbox.w * 3) &&
ABS(pObj->pfCenPos.x - nY) < MAX(50, bbox.h * 3)) ABS(pObj->pfCenPos.y - nY) < MAX(50, bbox.h * 3))
{ {
nNum++; nNum++;
} }
@ -438,8 +445,6 @@ void SA_Tracker::SetAutoSearchZone(SINT32 nWidth, SINT32 nHeight, GLB_INPUT* p_G
// 伺服太晃,直接使用短时预测。 // 伺服太晃,直接使用短时预测。
nEnd = m_LockingPipe->ubEnd; nEnd = m_LockingPipe->ubEnd;
pPipe->ptCurrentPnt.x = pPipe->stMotionMod_mean.crnObjPrediRtNear.cx;
pPipe->ptCurrentPnt.y = pPipe->stMotionMod_mean.crnObjPrediRtNear.cy;
// 取长时预测点作为管道当前位置预测 // 取长时预测点作为管道当前位置预测
if (PIPE_EVENT_JUST_LOCK == m_LockingPipe->ubEventStatus) if (PIPE_EVENT_JUST_LOCK == m_LockingPipe->ubEventStatus)
@ -454,7 +459,6 @@ void SA_Tracker::SetAutoSearchZone(SINT32 nWidth, SINT32 nHeight, GLB_INPUT* p_G
} }
//判断管道目标是否超出视场 //判断管道目标是否超出视场
//if (IMGO_IsPoint16SOutImg(nWidth, nHeight, pPipe->ptCurrentPnt)) //if (IMGO_IsPoint16SOutImg(nWidth, nHeight, pPipe->ptCurrentPnt))
if(IMGO_IsPoint32FOutImg(nWidth, nHeight, ptCurrentPnt)) if(IMGO_IsPoint32FOutImg(nWidth, nHeight, ptCurrentPnt))
@ -630,6 +634,8 @@ void SA_Tracker::SARegionDet(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, SINT3
DAT_PARAMETERS* pDAT_stPara = pDAT_Module->GetDatParm(); DAT_PARAMETERS* pDAT_stPara = pDAT_Module->GetDatParm();
SINT32 nObjCombineDist = pDAT_stPara->nObjCombineDist; SINT32 nObjCombineDist = pDAT_stPara->nObjCombineDist;
FilterMeanNL stMotionMod_mean = m_LockingPipe->stMotionMod_mean; // 使用运动模型 FilterMeanNL stMotionMod_mean = m_LockingPipe->stMotionMod_mean; // 使用运动模型
TARGET_OBJECT* trackTarget = &m_LockingPipe->objHistoryList[m_LockingPipe->ubEnd];//跟踪最近的目标
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
//////////////////////////小面目标检测//////////////////////////////////// //////////////////////////小面目标检测////////////////////////////////////
BBOOL bEnableAreaObjDetect = FALSE; BBOOL bEnableAreaObjDetect = FALSE;
@ -670,6 +676,12 @@ void SA_Tracker::SARegionDet(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, SINT3
pDST_Module->SetCombinDist(nCombinDist); pDST_Module->SetCombinDist(nCombinDist);
// 首次挑选使用自适应SNR阈值尽量避免低SNR阈值下虚警
if (trackTarget->fSNR > 9)
{
pDST_Module->SetDetSnr(MAX(trackTarget->fSNR * 0.5, 4.0f));
}
SINT32 nSmallTargetNum = pDST_Module->Detect(img, m_TSA_Input.crCenterRect, GLB_STATUS_TRACK); SINT32 nSmallTargetNum = pDST_Module->Detect(img, m_TSA_Input.crCenterRect, GLB_STATUS_TRACK);
// 小目标可以开面目标检测 // 小目标可以开面目标检测
if (bEnableAreaObjDetect) if (bEnableAreaObjDetect)
@ -698,8 +710,8 @@ void SA_Tracker::SARegionDet(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, SINT3
//小、面目标原地合并 //小、面目标原地合并
m_nTargetNum = MergeSmallAndAreaTarget(m_Target_Array, nSmallTargetNum, nCpNum, nCombinDist, GLB_STATUS::GLB_STATUS_TRACK); m_nTargetNum = MergeSmallAndAreaTarget(m_Target_Array, nSmallTargetNum, nCpNum, nCombinDist, GLB_STATUS::GLB_STATUS_TRACK);
// 小面目标检测信息使用后重置,为了提高效率这里只重置个数 // 小面目标检测信息使用后重置,为了提高效率这里只重置个数
pDST_Module->SetTargetNum(0); //pDST_Module->SetTargetNum(0);
pDAT_Module->SetTargetNum(0); //pDAT_Module->SetTargetNum(0);
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
@ -1178,7 +1190,7 @@ SINT32 SA_Tracker::FindMatchTarget(PIPE* pPipe, TARGET_OBJECT* ptTargetArray, SI
//局部变量 //局部变量
FLOAT32 fSim = 0.0f; //目标相似度 FLOAT32 fSim = 0.0f; //目标相似度
FLOAT32 fSimMax = -1.0f;//目标相似度最大值 FLOAT32 fSimMax = -1.0f;//目标相似度最大值
FLOAT32 fSimThres = 0.2f; //相似度阈值 FLOAT32 fSimThres = 0.5f; //相似度阈值
SINT32 nFrmsStep = 1; //帧间隔 SINT32 nFrmsStep = 1; //帧间隔
TARGET_OBJECT* ptMainTarget = NULL; //主管道目标 TARGET_OBJECT* ptMainTarget = NULL; //主管道目标
TARGET_OBJECT* ptTarget = NULL; //候选目标 TARGET_OBJECT* ptTarget = NULL; //候选目标
@ -1238,6 +1250,7 @@ SINT32 SA_Tracker::FindMatchTarget(PIPE* pPipe, TARGET_OBJECT* ptTargetArray, SI
// fApparentModelWeight = 0.0; // fApparentModelWeight = 0.0;
//} //}
//统计所有当前帧目标与管道目标的灰度、与中心距离、信噪比差异 //统计所有当前帧目标与管道目标的灰度、与中心距离、信噪比差异
for (int i = 0; i < nFrmObjsCnt; i++) for (int i = 0; i < nFrmObjsCnt; i++)
{ {
@ -1371,17 +1384,17 @@ SINT32 SA_Tracker::FindMatchTarget(PIPE* pPipe, TARGET_OBJECT* ptTargetArray, SI
} }
// 小目标特殊处理 //// 小目标特殊处理
if (pPipe->ObjectFilter.fPxlsCnt < 9) if (pPipe->ObjectFilter.fPxlsCnt < 9)
{ {
fSScaleChangeLowThres = 0.3; fSScaleChangeLowThres = 0.3;
fSScaleChangeHighThres = 3.f; fSScaleChangeHighThres = 3.f;
fAScaleChangeLowThres = 0.5; fAScaleChangeLowThres = 0.5;
fAScaleChangeHighThres = 2.0; fAScaleChangeHighThres = 2.0;
nLastDiffThresX = MAX(nMoveMin, 6); nLastDiffThresX = MAX(nMoveMin, 4);
nLastDiffThresY = MAX(nMoveMin, 6); nLastDiffThresY = MAX(nMoveMin, 4);
nPredictDiffThresX = MAX(nFThreMin, 12); nPredictDiffThresX = MAX(nFThreMin, 6);
nPredictDiffThresY = MAX(nFThreMin, 12); nPredictDiffThresY = MAX(nFThreMin, 6);
} }
@ -1435,22 +1448,13 @@ SINT32 SA_Tracker::FindMatchTarget(PIPE* pPipe, TARGET_OBJECT* ptTargetArray, SI
nLastDiffThresX = MAX(ptTarget->snSize.w / 2, nLastDiffThresX); nLastDiffThresX = MAX(ptTarget->snSize.w / 2, nLastDiffThresX);
nLastDiffThresY = MAX(ptTarget->snSize.h / 2, nLastDiffThresY); nLastDiffThresY = MAX(ptTarget->snSize.h / 2, nLastDiffThresY);
//if (g_GLB_stPara->nWorkScene == GLB_WATCH_SKY)
//{
// nPredictDiffThres = 70;
// nLastDiffThres = 15;
//}
//if (g_GLB_stPara->nWorkScene == GLB_WATCH_GROUND)
//{
// nPredictDiffThres = 5;
// nLastDiffThres = 5;
//}
// 非初始锁定阶段执行运动距离强逻辑 // 非初始锁定阶段执行运动距离强逻辑
//小目标情况下,周围可能检测出干扰的相似目标(真正的目标无法检出),需要强逻辑限定 //小目标情况下,周围可能检测出干扰的相似目标(真正的目标无法检出),需要强逻辑限定
//面目标情况下,单个目标允许大范围关联,关闭距离限定;非单个目标限定关联距离 //面目标情况下,单个目标允许大范围关联,关闭距离限定;非单个目标限定关联距离
if (PIPE_EVENT_JUST_LOCK != m_LockingPipe->ubEventStatus && if (/*PIPE_EVENT_JUST_LOCK != m_LockingPipe->ubEventStatus && */
m_LockingPipe->stMotionMod_mean.bTrackStable &&
m_SizeMode <= SizeType::SmallTarget || (m_SizeMode >= SizeType::MiddleTarget && !bSingleTarget)) m_SizeMode <= SizeType::SmallTarget || (m_SizeMode >= SizeType::MiddleTarget && !bSingleTarget))
{ {
if ((ABS(ptTarget->pfCenPos.x - stMotionMod_mean.crnObjPrediRtLong.cx) > MAX(ABS(fAzSpeed) * 2, nPredictDiffThresX) if ((ABS(ptTarget->pfCenPos.x - stMotionMod_mean.crnObjPrediRtLong.cx) > MAX(ABS(fAzSpeed) * 2, nPredictDiffThresX)
@ -1799,12 +1803,12 @@ SINT32 SA_Tracker::FindMatchPipe(SINT32 nWidth, SINT32 nHeight, PIPE* pLockingPi
FLOAT32 fThres = fSimThres; FLOAT32 fThres = fSimThres;
if (bSingleTarget) if (bSingleTarget)
{ {
fThres = 0.1f;//没有底线的跟踪 fThres = 0.0f;//没有底线的跟踪
// 超过10帧丢失降低阈值搜索 //// 超过10帧丢失降低阈值搜索
if (m_ObjStatus.unContiLostCnt >= 10) //if (m_ObjStatus.unContiLostCnt >= 10)
{ //{
fThres = 0.1f; // fThres = 0.1f;
} //}
} }
else else
@ -2098,8 +2102,8 @@ void SA_Tracker::UpdateObject2Tracker(TARGET_OBJECT* pTarget, GLB_INPUT* p_GLB_I
//仅使用长时预测更新目标位置 //仅使用长时预测更新目标位置
pObjStatus->ptPosPre = pObjStatus->ptPos; pObjStatus->ptPosPre = pObjStatus->ptPos;
pObjStatus->ptPos.x = m_LockingPipe->stMotionMod_mean.crnObjPrediRtLong.cx; pObjStatus->ptPos.x = m_LockingPipe->ptCurrentPnt.x; //使用管道预测位置
pObjStatus->ptPos.y = m_LockingPipe->stMotionMod_mean.crnObjPrediRtLong.cy; pObjStatus->ptPos.y = m_LockingPipe->ptCurrentPnt.y;
pObjStatus->ptPosFilter = pObjStatus->ptPos; pObjStatus->ptPosFilter = pObjStatus->ptPos;
SATrkState = Locked_Losting; SATrkState = Locked_Losting;

@ -135,6 +135,8 @@ struct TSA_Parameters
UINT16 nUseAIDetFeq; //使用AI管道更新频率 UINT16 nUseAIDetFeq; //使用AI管道更新频率
BBOOL bEnableSecDetect;//小目标二次检测开关 BBOOL bEnableSecDetect;//小目标二次检测开关
BBOOL bEnableGeoPredict;//允许惯性预测开关。
}; };

@ -150,13 +150,21 @@ 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); 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.ObjAglListsNear.arfFilter.afAngle; if (m_LockingPipe->stMotionMod_mean.bTrackStable)
m_LockingPipe->ptCurrentPnt.x = m_LockingPipe->stMotionMod_mean.crnObjPrediRtNear.cx; {
m_LockingPipe->ptCurrentPnt.y = m_LockingPipe->stMotionMod_mean.crnObjPrediRtNear.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;
}
else
{
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) if (m_type == GLB_SCEN_MODE::GLB_SCEN_SKY)
@ -196,9 +204,9 @@ SINT32 Tracker::MemTrack(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, API_MOT_P
// 基于窗口平均计算管道长短时预测点 // 基于窗口平均计算管道长短时预测点
Predict_ObjAglTrackPredict(&m_LockingPipe->stMotionMod_mean, img.u32Width, img.u32Height, p_GLB_Input); 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->afCurrentAgl = m_LockingPipe->stMotionMod_mean.ObjAglListsNear.arfFilter.afAngle;
m_LockingPipe->ptCurrentPnt.x = m_LockingPipe->stMotionMod_mean.crnObjPrediRtLong.cx; m_LockingPipe->ptCurrentPnt.x = m_LockingPipe->stMotionMod_mean.crnObjPrediRtNear.cx;
m_LockingPipe->ptCurrentPnt.y = m_LockingPipe->stMotionMod_mean.crnObjPrediRtLong.cy; m_LockingPipe->ptCurrentPnt.y = m_LockingPipe->stMotionMod_mean.crnObjPrediRtNear.cy;
// 跟踪找到目标 // 跟踪找到目标
if (m_type == GLB_SCEN_MODE::GLB_SCEN_SKY) if (m_type == GLB_SCEN_MODE::GLB_SCEN_SKY)

@ -200,7 +200,7 @@ void Predict_ObjAglTrackPredict(FilterMeanNL* pFilter, SINT32 nWidth, SINT32 nHe
pFilter->nObjPredictFarCnt = 0; pFilter->nObjPredictFarCnt = 0;
pFilter->bObjPredictAbnormal = FALSE; pFilter->bObjPredictAbnormal = FALSE;
} }
if (pFilter->nObjPredictFarCnt > 5 if (pFilter->nObjPredictFarCnt > 3
&& fNLDist2 > nNLDist2Thres) && fNLDist2 > nNLDist2Thres)
{ {
pFilter->bObjPredictAbnormal = TRUE; pFilter->bObjPredictAbnormal = TRUE;

@ -92,6 +92,8 @@
#define TRACK_STATUS_DEPTH_MAX 50 //目标状态监控最大深度 #define TRACK_STATUS_DEPTH_MAX 50 //目标状态监控最大深度
#define TRACK_POS_REC_MAX 20 // 目标像方坐标记录深度
#define GLB_GROUP_NUM_MAX 5 //组的最大个数 #define GLB_GROUP_NUM_MAX 5 //组的最大个数
#define GLB_GROUP_PIPENUM_MAX 3 //组包含的管道个数只支持3个合并 #define GLB_GROUP_PIPENUM_MAX 3 //组包含的管道个数只支持3个合并
@ -681,6 +683,7 @@ typedef struct tagFilterMeanNL
SINT32 nObjTrackLostCntNear; //目标短时轨迹预测失败帧数 SINT32 nObjTrackLostCntNear; //目标短时轨迹预测失败帧数
SINT32 nObjTrackLostCntLong; //目标长时轨迹预测失败帧数 SINT32 nObjTrackLostCntLong; //目标长时轨迹预测失败帧数
SINT32 nAbnormalCnt; //跟踪异常计数器(连续---坏点 SINT32 nAbnormalCnt; //跟踪异常计数器(连续---坏点
BBOOL bTrackStable; //跟踪稳态判断
}FilterMeanNL; }FilterMeanNL;

@ -179,6 +179,9 @@ public:
// 设置小目标合并距离 // 设置小目标合并距离
virtual void SetCombinDist(SINT32 ndistance) = 0; virtual void SetCombinDist(SINT32 ndistance) = 0;
// 设置检测基础阈值
virtual void SetDetSnr(FLOAT32 fSNR) = 0;
// 获取小目标检测队列 // 获取小目标检测队列
virtual TARGET_OBJECT* GetTargetArray() = 0; virtual TARGET_OBJECT* GetTargetArray() = 0;

@ -1824,8 +1824,8 @@ SINT32 DetectAreaObj::DAT_ObjsSegmentation(UINT16* pFrame, UBYTE8* pnGrayBinary,
//MSSu, 20150514: 弱目标检测时,灰度、梯度二值点取并集,否则取交集 //MSSu, 20150514: 弱目标检测时,灰度、梯度二值点取并集,否则取交集
BBOOL bSeedPt = FALSE; BBOOL bSeedPt = FALSE;
if (DAT_FLAG_BINARY == pnGrayBinary[nIndex] if ((DAT_FLAG_BINARY == pnGrayBinary[nIndex]
&& DAT_FLAG_BINARY == pnGradBinary[nIndex] || DAT_FLAG_BINARY == pnGradBinary[nIndex])
&& DAT_FLAG_CONNECTED != pnFlagHasSr[nIndex]) && DAT_FLAG_CONNECTED != pnFlagHasSr[nIndex])
{ {
bSeedPt = TRUE; bSeedPt = TRUE;

@ -52,6 +52,28 @@ SINT32 g_DST_nFilter_5_9[DST_KERNAL_SIZE_5_9] =
}; };
SINT32 g_DST_nFilter_13_17[DST_KERNAL_SIZE_13_17] =
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
};
DetectSmallObj::DetectSmallObj(SINT32 nWidth, SINT32 nHeight) DetectSmallObj::DetectSmallObj(SINT32 nWidth, SINT32 nHeight)
{ {
@ -130,6 +152,11 @@ void DetectSmallObj::SetTargetNum(SINT32 num)
m_FrmObjsCnt = num; m_FrmObjsCnt = num;
} }
void DetectSmallObj::SetDetSnr(FLOAT32 fSNR)
{
m_DST_stPara.fgdk = fSNR;
}
DST_PARAMETERS* DetectSmallObj::GetDstParm() DST_PARAMETERS* DetectSmallObj::GetDstParm()
{ {
return &m_DST_stPara; return &m_DST_stPara;
@ -324,7 +351,7 @@ void DetectSmallObj::DST_Initialization(SINT32 nWidth, SINT32 nHeight, CENTERREC
m_DST_stPara.fObjWHRatioMax = 5.0f; m_DST_stPara.fObjWHRatioMax = 5.0f;
m_DST_stPara.fObjRectRatioMin = 0.2f; m_DST_stPara.fObjRectRatioMin = 0.2f;
m_DST_stPara.nBGObjNumThres = 2; m_DST_stPara.nBGObjNumThres = 2;
m_DST_stPara.nBTGrayMinThres = 5; m_DST_stPara.nBTGrayMinThres = 10;
m_DST_stPara.bDimDetecting = false; m_DST_stPara.bDimDetecting = false;
m_DST_stPara.bEnableDimDetect = false; m_DST_stPara.bEnableDimDetect = false;
@ -347,10 +374,13 @@ void DetectSmallObj::DST_Initialization(SINT32 nWidth, SINT32 nHeight, CENTERREC
m_DST_stPara.nDetectGrayType = GLB_OBJ_GRAY_BRIGHT; m_DST_stPara.nDetectGrayType = GLB_OBJ_GRAY_BRIGHT;
// 模板参数 // 模板参数
m_DST_stPara.pnFilter = g_DST_nFilter_9_13; //m_DST_stPara.pnFilter = g_DST_nFilter_9_13;
m_DST_stPara.nFilterBGW = DST_KERNAL_SIZE_Bm_13; //m_DST_stPara.nFilterBGW = DST_KERNAL_SIZE_Bm_13;
m_DST_stPara.nFilterTGW = DST_KERNAL_SIZE_Tm_9; //m_DST_stPara.nFilterTGW = DST_KERNAL_SIZE_Tm_9;
m_DST_stPara.pnFilter = g_DST_nFilter_5_9;
m_DST_stPara.nFilterBGW = 9;
m_DST_stPara.nFilterTGW = 5;
// 申请内存 // 申请内存
DST_MallocMemory(nWidth, nHeight, mmCenterRect); DST_MallocMemory(nWidth, nHeight, mmCenterRect);

@ -246,6 +246,11 @@ public:
// 设置当前帧小目标检测个数 // 设置当前帧小目标检测个数
void SetTargetNum(SINT32 num); void SetTargetNum(SINT32 num);
// 设置检测阈值
void SetDetSnr(FLOAT32 fSNR);
// 获取小目标检测参数 // 获取小目标检测参数
DST_PARAMETERS* GetDstParm(); DST_PARAMETERS* GetDstParm();

@ -652,6 +652,14 @@ void MOT_Pipe::PIPE_UpdatePipes(TARGET_OBJECT* ptTargetArray, SINT32 pnFrmObjsCn
//自适应调节“管道目标没有被找到的次数阈值” //自适应调节“管道目标没有被找到的次数阈值”
pPipe->nDelCntThres = MAX(3, pPipe->nDelCntThres); pPipe->nDelCntThres = MAX(3, pPipe->nDelCntThres);
// 弱小目标,不容易删除
if (pPipe->ObjectFilter.fPxlsCnt < 5)
{
pPipe->nDelCntThres = 10;
}
if (pPipe->unLostCnt > (UINT32)pPipe->nDelCntThres) if (pPipe->unLostCnt > (UINT32)pPipe->nDelCntThres)
{ {
DelPipe(pPipe); DelPipe(pPipe);

@ -3,4 +3,4 @@
#pragma once #pragma once
#include <string> #include <string>
std::string BUILD_TIME = "BUILD_TIME @build_time@"; std::string BUILD_TIME = "BUILD_TIME @build_time@";
std::string VERSION = "BUILD_VERSION 1.3.3"; std::string VERSION = "BUILD_VERSION 1.4.0";

@ -482,7 +482,7 @@ VideoStream* QVideoPlayer::OpenOneStream(QString lpszFileName)
{ {
pVid = new GDFileStream(); pVid = new GDFileStream();
} }
else if(extName == "raw" || extName == "xraw" || extName == "rawx" || extName == "yuv") else if(extName == "raw" || extName == "xraw" || extName == "rawx" || extName == "yuv" || extName == "data")
{ {
// 在当前路径下寻找raw文件默认配置 // 在当前路径下寻找raw文件默认配置
int first = lpszFileName.lastIndexOf("/"); int first = lpszFileName.lastIndexOf("/");
@ -638,6 +638,7 @@ void QVideoPlayer::DrawArithResult()
{ {
return; return;
} }
// 更新指南针 // 更新指南针
UpdateCompass(m_stInputPara.stServoInfo.fServoAz, m_stInputPara.stServoInfo.fServoPt); UpdateCompass(m_stInputPara.stServoInfo.fServoAz, m_stInputPara.stServoInfo.fServoPt);
@ -768,7 +769,6 @@ void QVideoPlayer::DrawTrackersInfo()
QGraphicsScene* scene = m_ImageViewer->imgScene; QGraphicsScene* scene = m_ImageViewer->imgScene;
int num = m_stOutput.nTrackObjCnts; int num = m_stOutput.nTrackObjCnts;
for (size_t i = 0; i < num; i++) for (size_t i = 0; i < num; i++)
{ {
auto obj = &m_stOutput.stTrackers[i]; auto obj = &m_stOutput.stTrackers[i];
@ -850,6 +850,7 @@ void QVideoPlayer::DrawTrackersInfo()
{ {
str = QString::number(obj->nOutputID); str = QString::number(obj->nOutputID);
} }
DrawArtRect(m_ImageViewer, QPen(QColor(255, 0, 0)), bbox, str, false,15, QColor(255,0,0)); DrawArtRect(m_ImageViewer, QPen(QColor(255, 0, 0)), bbox, str, false,15, QColor(255,0,0));
@ -926,7 +927,7 @@ void QVideoPlayer::DrawTrackersInfo()
// 查询跟踪阶段目标列表 // 查询跟踪阶段目标列表
DrawFrameRegionDetectObjs(); DrawFrameRegionDetectObjs();
// 绘制小目标极值点 //// 绘制小目标极值点
//POINT16S* pList = ARIDLL_GetSATracker_DSTPoint(m_ArithRunner->pEOTracker, nInPipesID); //POINT16S* pList = ARIDLL_GetSATracker_DSTPoint(m_ArithRunner->pEOTracker, nInPipesID);
//for (size_t i = 0; i < (640 / 16 * 512 / 16) * 2; i++) //for (size_t i = 0; i < (640 / 16 * 512 / 16) * 2; i++)
@ -1014,10 +1015,10 @@ void QVideoPlayer::DrawFrameRegionDetectObjs()
int cx = obj->pfCenPos.x; int cx = obj->pfCenPos.x;
int cy = obj->pfCenPos.y; int cy = obj->pfCenPos.y;
//int w = MAX(15, obj->snSize.w); int w = MAX(5, obj->snSize.w);
//int h = MAX(15, obj->snSize.h); int h = MAX(5, obj->snSize.h);
int w = obj->snSize.w; //int w = obj->snSize.w;
int h = obj->snSize.h; //int h = obj->snSize.h;
QRectF bbox(cx - w / 2, cy - h / 2, w, h); QRectF bbox(cx - w / 2, cy - h / 2, w, h);
scene->addRect(bbox, QPen(QColor(20, 255, 147), 0.3)); scene->addRect(bbox, QPen(QColor(20, 255, 147), 0.3));
str = QString::number(obj->fMatchConf, 'f', 2); str = QString::number(obj->fMatchConf, 'f', 2);
@ -1279,7 +1280,7 @@ void QVideoPlayer::PrintSkyInfo(QString str, QString strShow, ArithHandle hArith
// 划分为0 - 上、1 - 右上、2 - 右、3 - 右下、4 - 下、5 - 左下、6 - 左、7 - 左上8个背景区域 // 划分为0 - 上、1 - 右上、2 - 右、3 - 右下、4 - 下、5 - 左下、6 - 左、7 - 左上8个背景区域
auto obj = &mrnBkgBlks[i]; auto obj = &mrnBkgBlks[i];
QRectF bbox(obj->minX, obj->minY, obj->maxX - obj->minX, obj->maxY - obj->minY); QRectF bbox(obj->minX, obj->minY, obj->maxX - obj->minX, obj->maxY - obj->minY);
scene->addRect(bbox, QPen(QColor(147, 20, 255), 0.3)); //scene->addRect(bbox, QPen(QColor(147, 20, 255), 0.3));
} }
TSky_Output* pSky_Output = GetSkyTrackerObjectStatus(pEOTracker, obj->nInPipesID); TSky_Output* pSky_Output = GetSkyTrackerObjectStatus(pEOTracker, obj->nInPipesID);

Loading…
Cancel
Save