|
|
#include "Arith_AITTracker.h"
|
|
|
#include "Arith_ImgOperate.h"
|
|
|
#include "Arith_CoordModule.h"
|
|
|
#include "Arith_AI_Tracker_API.h"
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
|
|
|
AIT_Interface::AIT_Interface(const char *jsonConf)
|
|
|
{
|
|
|
bAssignflag = false;
|
|
|
m_LockingPipe = NULL;
|
|
|
nTracker = NULL;
|
|
|
m_OccCnt = 0;
|
|
|
m_ArrestCnt = 0;
|
|
|
memset(&m_ObjStatus,0,sizeof(OBJECTSTATUS));
|
|
|
memset(&m_Ai_TkOut,0,sizeof(AIT_OUTPUT));
|
|
|
memset(&m_Ai_TkCmd,0,sizeof(AIT_Command));
|
|
|
|
|
|
gud_nano_config_t nanoConf;
|
|
|
parse_json_to_struct(jsonConf,nanoConf);
|
|
|
#ifdef ENABLE_AI_TRACK
|
|
|
GUD_ALG_AI_TRACK_Create(&nTracker, &nanoConf);
|
|
|
#endif
|
|
|
//printf ("### GUD_ALG_AI_TRACK_Create Success!\n");
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
AIT_Interface::~AIT_Interface()
|
|
|
{
|
|
|
if (nTracker!=NULL)
|
|
|
{
|
|
|
#ifdef ENABLE_AI_TRACK
|
|
|
GUD_ALG_AI_TRACK_Release(nTracker);
|
|
|
#endif
|
|
|
}
|
|
|
}
|
|
|
|
|
|
AIT_Interface::AIT_Interface(Param_AITracker para)
|
|
|
{
|
|
|
#ifdef ENABLE_AI_TRACK
|
|
|
GUD_ALG_AI_TRACK_Create(&nTracker, ¶.nano_config);
|
|
|
printf ("### GUD_ALG_AI_TRACK_Create Success!\n");
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
|
|
|
void AIT_Interface::parse_json_to_struct(const std::string& json_file_path, gud_nano_config_t& config)
|
|
|
{
|
|
|
// 读取 JSON 文件
|
|
|
std::ifstream json_file(json_file_path);
|
|
|
if (!json_file.is_open()) {
|
|
|
std::cerr << "Error: Could not open JSON file!" << std::endl;
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 解析 JSON
|
|
|
nlohmann::json json_data;
|
|
|
json_file >> json_data;
|
|
|
|
|
|
// 填充结构体
|
|
|
config.lr_rate = json_data["lr_rate"];
|
|
|
config.ac_score = json_data["ac_score"];
|
|
|
config.device_type = json_data["device_type"];
|
|
|
config.use_reid = json_data["use_reid"];
|
|
|
config.reid_frq = json_data["reid_frq"];
|
|
|
config.use_trace = json_data["use_trace"];
|
|
|
config.trace_len = json_data["trace_len"];
|
|
|
config.use_update = json_data["use_update"];
|
|
|
config.update_frq = json_data["update_frq"];
|
|
|
|
|
|
// 分配内存并复制字符串
|
|
|
//config.Model_temp = strdup((std::string(SOURCE_PATH) + "/AITracker/x86_onnx/" +json_data["Model_temp"].get<std::string>()).c_str());
|
|
|
//config.Model_search = strdup((std::string(SOURCE_PATH) + "/AITracker/x86_onnx/" + json_data["Model_search"].get<std::string>()).c_str());
|
|
|
//config.Model_head = strdup((std::string(SOURCE_PATH) + "/AITracker/x86_onnx/" + json_data["Model_head"].get<std::string>()).c_str());
|
|
|
//config.reid_json = strdup((std::string(SOURCE_PATH) + "/AITracker/x86_onnx/" + json_data["reid_json"].get<std::string>()).c_str());
|
|
|
|
|
|
#if (1)
|
|
|
// 打印结构体内容
|
|
|
std::cout << "lr_rate: " << config.lr_rate << std::endl;
|
|
|
std::cout << "ac_score: " << config.ac_score << std::endl;
|
|
|
std::cout << "device_type: " << config.device_type << std::endl;
|
|
|
std::cout << "use_reid: " << config.use_reid << std::endl;
|
|
|
std::cout << "reid_frq: " << config.reid_frq << std::endl;
|
|
|
std::cout << "use_trace: " << config.use_trace << std::endl;
|
|
|
std::cout << "trace_len: " << config.trace_len << std::endl;
|
|
|
std::cout << "use_update: " << config.use_update << std::endl;
|
|
|
std::cout << "update_frq: " << config.update_frq << std::endl;
|
|
|
std::cout << "Model_temp: " << config.Model_temp << std::endl;
|
|
|
std::cout << "Model_search: " << config.Model_search << std::endl;
|
|
|
std::cout << "Model_head: " << config.Model_head << std::endl;
|
|
|
std::cout << "reid_json: " << config.reid_json << std::endl;
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool AIT_Interface::AIT_Init(GD_VIDEO_FRAME_S img, PIPE * pLockingPipe, GLB_INPUT * p_GLB_Input)
|
|
|
{
|
|
|
// 跟踪管道
|
|
|
m_LockingPipe = pLockingPipe;
|
|
|
|
|
|
//初始化跟踪输出的目标状态
|
|
|
OBJECTSTATUS* pObjStatus = &m_ObjStatus;
|
|
|
|
|
|
SINT32 nEnd = pLockingPipe->ubEnd;
|
|
|
SINT32 nObjSize = (SINT32)(pLockingPipe->ObjectFilter.fPxlsCnt);
|
|
|
TARGET_OBJECT* pTrackingTarget = &pLockingPipe->objHistoryList[nEnd];
|
|
|
|
|
|
pObjStatus->bObjAssigned = true;
|
|
|
pObjStatus->unTotalCnt = 1;
|
|
|
pObjStatus->unTrackedCnt = 1;
|
|
|
pObjStatus->unContiTrackedCnt = 1;
|
|
|
pObjStatus->unContiLostCnt = 0;
|
|
|
pObjStatus->bObjMiss = false;
|
|
|
|
|
|
|
|
|
|
|
|
pObjStatus->ptPosPre.x = pLockingPipe->ptCurrentPnt.x;
|
|
|
pObjStatus->ptPosPre.y = pLockingPipe->ptCurrentPnt.y;
|
|
|
pObjStatus->ptPos.x = pObjStatus->ptPosPre.x;
|
|
|
pObjStatus->ptPos.y = pObjStatus->ptPosPre.y;
|
|
|
|
|
|
pObjStatus->ptPosFilter.x = pObjStatus->ptPosPre.x;
|
|
|
pObjStatus->ptPosFilter.y = pObjStatus->ptPosPre.y;
|
|
|
pObjStatus->ptPosBorn = pObjStatus->ptPos;
|
|
|
pObjStatus->sfSize.w = pTrackingTarget->snSize.w;
|
|
|
pObjStatus->sfSize.h = pTrackingTarget->snSize.h;
|
|
|
pObjStatus->sfSize.s = pObjStatus->sfSize.w * pObjStatus->sfSize.h;
|
|
|
pObjStatus->sfSizeBorn = pObjStatus->sfSize;
|
|
|
pObjStatus->fObjPxlsCnt = (FLOAT32)pTrackingTarget->unObjPxlsCnt;
|
|
|
|
|
|
//更新目标速度、角速度、置信度
|
|
|
pObjStatus->sfSpeed.vx = 0.0f;
|
|
|
pObjStatus->sfSpeed.vy = 0.0f;
|
|
|
pObjStatus->sfAglSpeed.vx = pLockingPipe->sfAglSpeed.vx;
|
|
|
pObjStatus->sfAglSpeed.vy = pLockingPipe->sfAglSpeed.vy;
|
|
|
pObjStatus->fConfidence = 1.0f;
|
|
|
|
|
|
|
|
|
//更新目标角度
|
|
|
Pole pole = getStablePoleFromImagePos(pTrackingTarget->pfCenPos,
|
|
|
p_GLB_Input->stCamera, p_GLB_Input->servoInfo, p_GLB_Input->afPlatformRPY, p_GLB_Input->setupErr);
|
|
|
|
|
|
// 外推一帧,送AI跟踪
|
|
|
//pole.beta = DEGLIM360(pObjStatus->afAngle.fAz + pObjStatus->sfAglSpeed.vx);
|
|
|
//pole.alpha = DEGLIM(pObjStatus->afAngle.fPt + pObjStatus->sfAglSpeed.vy);
|
|
|
|
|
|
pObjStatus->afAngle.fAz = (FLOAT32)pole.beta;
|
|
|
pObjStatus->afAngle.fPt = (FLOAT32)pole.alpha;
|
|
|
pObjStatus->afAngleBorn = pObjStatus->afAngle;
|
|
|
|
|
|
//POINT32F imgPos = getImagePosFromStablePole(pole, p_GLB_Input->stCamera, p_GLB_Input->servoInfo, p_GLB_Input->afPlatformRPY, p_GLB_Input->setupErr);
|
|
|
|
|
|
// 控制指令生成:AI跟踪初始化指令直接在外部进行
|
|
|
memset(&m_Ai_TkCmd,0,sizeof(AIT_Command));
|
|
|
|
|
|
|
|
|
gud_rect_f initRect;
|
|
|
initRect.w = MAX(10.0, (float)pObjStatus->sfSize.w);
|
|
|
initRect.h = MAX(10.0, (float)pObjStatus->sfSize.h);
|
|
|
initRect.cx = (float)pObjStatus->ptPos.x;
|
|
|
initRect.cy = (float)pObjStatus->ptPos.y;
|
|
|
initRect.used = 1;
|
|
|
initRect.label = 10001;
|
|
|
//printf ("initBox:[%.2f %.2f %.2f %.2f]\n",initRect.w,initRect.h,initRect.cx,initRect.cy);
|
|
|
|
|
|
std::vector<AI_Target> odRes;
|
|
|
#ifdef ENABLE_AI_TRACK
|
|
|
GUD_ALG_AI_TRACK_Init(nTracker, img, initRect, odRes, &m_Ai_TkOut);
|
|
|
#endif
|
|
|
|
|
|
m_OccCnt = 0;
|
|
|
m_ArrestCnt = 0;
|
|
|
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
|
|
|
int AIT_Interface::AIT_Run_Nano(GD_VIDEO_FRAME_S img, CENTERRECT32F srBbox, GLB_INPUT * g_GLB_Input)
|
|
|
{
|
|
|
gud_rect_f searchBox;
|
|
|
// int setbox[4] = {650,488,716,537};
|
|
|
// searchBox.w = float(setbox[2] - setbox[0]);
|
|
|
// searchBox.h = float(setbox[3] - setbox[1]);
|
|
|
// searchBox.cx = float(setbox[0] + searchBox.w/2);
|
|
|
// searchBox.cy = float(setbox[1] + searchBox.h/2);
|
|
|
searchBox.used = 0;
|
|
|
std::vector<AI_Target> odRes;
|
|
|
#ifdef ENABLE_AI_TRACK
|
|
|
GUD_ALG_AI_TRACK_Process(nTracker, img, searchBox, odRes, &m_Ai_TkOut);
|
|
|
#endif
|
|
|
Track_Res_Nano temRs;
|
|
|
temRs = m_Ai_TkOut.stNanoTrack_out;
|
|
|
m_ObjStatus.ptPos.x = (temRs.rect.x + temRs.rect.w/2);
|
|
|
m_ObjStatus.ptPos.y = (temRs.rect.y + temRs.rect.h/2);
|
|
|
m_ObjStatus.sfSize.w = temRs.rect.w;
|
|
|
m_ObjStatus.sfSize.h = temRs.rect.h;
|
|
|
|
|
|
//printf ("[%d %d %d %d] score:%.2f \n",temRs.rect.x,temRs.rect.y,temRs.rect.w,temRs.rect.h,temRs.score);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
void AIT_Interface::AIT_UpdateTracker(SINT16 nWidth, SINT16 nHeight, OBJECTSTATUS * pObjStatus, GLB_INPUT * g_GLB_Input)
|
|
|
{
|
|
|
// 更新帧编号
|
|
|
pObjStatus->unFrmId = g_GLB_Input->unFrmId;
|
|
|
|
|
|
// 更新目标计数器
|
|
|
pObjStatus->unTotalCnt++;
|
|
|
pObjStatus->unTrackedCnt++;
|
|
|
pObjStatus->unContiTrackedCnt++;
|
|
|
pObjStatus->unContiLostCnt = 0;
|
|
|
pObjStatus->bObjMiss = FALSE;
|
|
|
// pObjStatus->ptPosBorn;
|
|
|
|
|
|
// 更新目标位置
|
|
|
POINT32F pfPosPrePre = pObjStatus->ptPosPre;
|
|
|
pObjStatus->ptPosPre = pObjStatus->ptPos;
|
|
|
pObjStatus->ptPos.x = m_Ai_TkOut.fX;
|
|
|
pObjStatus->ptPos.y = m_Ai_TkOut.fY;
|
|
|
|
|
|
|
|
|
pObjStatus->ptPosFilter.x = (pObjStatus->ptPosPre.x + pObjStatus->sfSpeed.vx + pObjStatus->ptPos.x) / 2;
|
|
|
pObjStatus->ptPosFilter.y = (pObjStatus->ptPosPre.y + pObjStatus->sfSpeed.vy + pObjStatus->ptPos.y) / 2;
|
|
|
|
|
|
// 20170915,wsa,非射击期间出视场解锁
|
|
|
if (IMGO_IsPoint32FOutImg(nWidth, nHeight, pObjStatus->ptPos))
|
|
|
{
|
|
|
pObjStatus->bObjMiss = TRUE;
|
|
|
}
|
|
|
|
|
|
// 更新目标尺寸
|
|
|
pObjStatus->sfSize.w = m_Ai_TkOut.fObjW;
|
|
|
pObjStatus->sfSize.h = m_Ai_TkOut.fObjH;
|
|
|
pObjStatus->sfSize.s = pObjStatus->sfSize.w * pObjStatus->sfSize.h;
|
|
|
|
|
|
// pObjStatus->sfSizeBorn;
|
|
|
pObjStatus->fObjPxlsCnt = pObjStatus->sfSize.s;
|
|
|
|
|
|
|
|
|
// 更新目标速度
|
|
|
pObjStatus->sfSpeed.vx = (pObjStatus->ptPos.x - pfPosPrePre.x) / 2;
|
|
|
pObjStatus->sfSpeed.vy = (pObjStatus->ptPos.y - pfPosPrePre.y) / 2;
|
|
|
|
|
|
|
|
|
// 标记目标来源
|
|
|
pObjStatus->nObjTypeSrc = ObjSrc::Arith_NanoTrack;
|
|
|
|
|
|
//// 更新目标角度
|
|
|
Pole pole = getStablePoleFromImagePos(pObjStatus->ptPos,
|
|
|
g_GLB_Input->stCamera, g_GLB_Input->servoInfo, g_GLB_Input->afPlatformRPY, g_GLB_Input->setupErr);
|
|
|
|
|
|
pObjStatus->afAngle.fAz = (FLOAT32)pole.beta;
|
|
|
pObjStatus->afAngle.fPt = (FLOAT32)pole.alpha;
|
|
|
|
|
|
|
|
|
////更新目标角速度,从跟踪管道统一取
|
|
|
pObjStatus->sfAglSpeed.vx = m_LockingPipe->sfAglSpeed.vx;
|
|
|
pObjStatus->sfAglSpeed.vy = m_LockingPipe->sfAglSpeed.vy;
|
|
|
}
|
|
|
|
|
|
UBYTE8 AIT_Interface::AIT_MemTracker(OBJECTSTATUS * pObjStatus, SINT32 nWidth, SINT32 nHeight, GLB_INPUT * g_GLB_Input)
|
|
|
{
|
|
|
// 记忆跟踪是否成功的标志
|
|
|
UBYTE8 ubTrackerSuccFlg = TRUE;
|
|
|
|
|
|
pObjStatus->unFrmId = g_GLB_Input->unFrmId;
|
|
|
|
|
|
// 判断记忆跟踪次数是否超过阈值
|
|
|
pObjStatus->unContiLostCnt++;
|
|
|
pObjStatus->unContiTrackedCnt = 0;
|
|
|
pObjStatus->unTotalCnt++;
|
|
|
|
|
|
// 取管道运动模型
|
|
|
FilterMeanNL stMotionMod_mean = m_LockingPipe->stMotionMod_mean;
|
|
|
|
|
|
pObjStatus->ptPos.x = stMotionMod_mean.crnObjPrediRtLong.cx;
|
|
|
pObjStatus->ptPos.y = stMotionMod_mean.crnObjPrediRtLong.cy;
|
|
|
|
|
|
pObjStatus->sfAglSpeed.vx = m_LockingPipe->sfAglSpeed.vx;
|
|
|
pObjStatus->sfAglSpeed.vy = m_LockingPipe->sfAglSpeed.vy;
|
|
|
|
|
|
// 更新目标角度值
|
|
|
pObjStatus->afAngle = stMotionMod_mean.ObjAglListsLong.arfPredict.afAngle;
|
|
|
|
|
|
// 更新目标尺寸
|
|
|
pObjStatus->sfSize.w = m_Ai_TkOut.fObjW;
|
|
|
pObjStatus->sfSize.h = m_Ai_TkOut.fObjH;
|
|
|
pObjStatus->sfSize.s = pObjStatus->sfSize.w * pObjStatus->sfSize.h;
|
|
|
|
|
|
|
|
|
// 若预测帧数超出阈值,或目标超出视场,则标记目标丢失
|
|
|
BBOOL bInsideFOV = true;
|
|
|
bInsideFOV = !IMGO_IsPoint32FOutImg(nWidth, nHeight, pObjStatus->ptPos);
|
|
|
|
|
|
|
|
|
SINT32 nTrackMemFrmNum = GLB_MEMORY_FRM_NUM;
|
|
|
if ((pObjStatus->unContiLostCnt > (UINT32)(nTrackMemFrmNum)) || (!bInsideFOV))
|
|
|
{
|
|
|
pObjStatus->bObjMiss = TRUE;
|
|
|
ubTrackerSuccFlg = FALSE;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
ubTrackerSuccFlg = TRUE;
|
|
|
pObjStatus->bObjMiss = FALSE;
|
|
|
}
|
|
|
|
|
|
return ubTrackerSuccFlg;
|
|
|
}
|
|
|
|
|
|
|
|
|
void AIT_Interface::AIT_SyncInfo(AIT_OUTPUT* out)
|
|
|
{
|
|
|
memcpy(&m_Ai_TkOut, out, sizeof(AIT_OUTPUT));
|
|
|
}
|
|
|
|
|
|
OBJECTSTATUS* AIT_Interface::GetTrackeStatus()
|
|
|
{
|
|
|
return &m_ObjStatus;
|
|
|
}
|
|
|
|
|
|
AIT_OUTPUT* AIT_Interface::GetAIPara()
|
|
|
{
|
|
|
return &m_Ai_TkOut;
|
|
|
}
|
|
|
|
|
|
|
|
|
void AIT_Interface::AIT_Cancle()
|
|
|
{
|
|
|
#ifdef ENABLE_AI_TRACK
|
|
|
GUD_ALG_AI_TRACK_Unlock(nTracker);
|
|
|
#endif
|
|
|
//清空跟踪结果
|
|
|
memset(&m_ObjStatus, 0, sizeof(OBJECTSTATUS));
|
|
|
bAssignflag = FALSE;//将AI跟踪器解绑定
|
|
|
memset(&m_Ai_TkCmd,0,sizeof(AIT_Command));// 清空对ai跟踪器的控制字
|
|
|
}
|
|
|
|
|
|
|
|
|
BBOOL AIT_Interface::AIT_Run(GD_VIDEO_FRAME_S img, GLB_INPUT* p_GLB_Input, PIPE* m_LockingPipe)
|
|
|
{
|
|
|
// 跟踪成功状态
|
|
|
BBOOL bTrackStatus = TRUE;
|
|
|
gud_rect_f searchBox = {0};
|
|
|
SINT32 occStatus = 0;
|
|
|
OBJECTSTATUS* pObjStatusAIT = &m_ObjStatus;
|
|
|
|
|
|
searchBox.cx = m_LockingPipe->ptCurrentPnt.x;
|
|
|
searchBox.cy = m_LockingPipe->ptCurrentPnt.y;
|
|
|
//外部控制此处宽高采用原始浮点宽高
|
|
|
searchBox.w = (FLOAT32)m_LockingPipe->objHistoryList[m_LockingPipe->ubEnd].snSize.w;
|
|
|
searchBox.h = (FLOAT32)m_LockingPipe->objHistoryList[m_LockingPipe->ubEnd].snSize.h;
|
|
|
|
|
|
//不使用外部指定搜索区域
|
|
|
if (0 == pObjStatusAIT->nOcclude_flag)
|
|
|
{
|
|
|
searchBox.used = 0;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
searchBox.used = 1;
|
|
|
}
|
|
|
std::vector<AI_Target> odRes;
|
|
|
|
|
|
#ifdef ENABLE_AI_TRACK
|
|
|
GUD_ALG_AI_TRACK_Process(nTracker, img, searchBox, odRes, &m_Ai_TkOut);
|
|
|
GUD_ALG_AI_TRACK_Get_ResopneMap(nTracker, responeMap);
|
|
|
#endif
|
|
|
pObjStatusAIT->fConfidence = m_Ai_TkOut.stNanoTrack_out.score;
|
|
|
|
|
|
//根据算法类型取对应的干扰结果
|
|
|
m_Ai_TkOut.type = AITrackerType::NanoTrack;
|
|
|
if (m_Ai_TkOut.type == AITrackerType::NanoTrack)
|
|
|
{
|
|
|
occStatus = m_Ai_TkOut.stNanoTrack_out.disturb_status;
|
|
|
}
|
|
|
|
|
|
if (occStatus > 0)
|
|
|
{
|
|
|
m_OccCnt++;
|
|
|
m_ArrestCnt = 0;
|
|
|
if (m_OccCnt >= 3)
|
|
|
{
|
|
|
pObjStatusAIT->nOcclude_flag = 3;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_OccCnt = 0;
|
|
|
m_ArrestCnt++;
|
|
|
if (m_ArrestCnt >= 3)
|
|
|
{
|
|
|
pObjStatusAIT->nOcclude_flag = 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (3 == pObjStatusAIT->nOcclude_flag)
|
|
|
{
|
|
|
bTrackStatus = AIT_MemTracker(pObjStatusAIT, (SINT32)img.u32Width, (SINT32)img.u32Height, p_GLB_Input);
|
|
|
memcpy(&m_ObjStatus, pObjStatusAIT, sizeof(OBJECTSTATUS));
|
|
|
return bTrackStatus;
|
|
|
}
|
|
|
|
|
|
|
|
|
// 更新跟踪器
|
|
|
AIT_UpdateTracker((SINT32)img.u32Width, (SINT32)img.u32Height, pObjStatusAIT, p_GLB_Input);
|
|
|
|
|
|
memcpy(&m_ObjStatus, pObjStatusAIT, sizeof(OBJECTSTATUS));
|
|
|
|
|
|
// 返回跟踪状态
|
|
|
return bTrackStatus;
|
|
|
}
|