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.

363 lines
11 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.

// 单目标对地跟踪流程测试:将TLD从算法中剥离到外部导致API调用形式调整
// 读取avi视频进行测试
#include "NeoArithStandardDll.h"
#include <tchar.h>
#include <windows.h>
#include <iostream>
#include <memory>
#include <string.h>
#include <algorithm>
#include <thread>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
#define TEST_WITH_AID 0 // 是否使用AI Detect
#define TEST_WITH_AIT 0 // 是否使用AI Tracker如果设置为1最外部的CMakeLists.txt 需要设置set(BUILD_AI_TRACK TRUE)
#if TEST_WITH_AID
#include "Arith_YOLO_Detect.h"
#endif
#if TEST_WITH_AIT
#include "Arith_AITracker.h"
#endif
unsigned short bcmd = 0;
short SelectCX = 0;
short SelectCY = 0;
unsigned short setLockBoxW = 0;
unsigned short setLockBoxH = 0;
bool draw = false;
cv::Point cursor = cv::Point(0, 0);
cv::Rect rect;
int key;
cv::Mat frame, dstImage;
//控制视频流
VideoCapture capture;
const char* windowName = "test"; //播放窗口名称
const char* trackBarName = "Progress"; //trackbar控制条名称
double totalFrame = 1.0; //视频总帧数
double currentFrame = 1.0; //当前播放帧
int trackbarValue = 1; //trackbar控制量
int trackbarMax = 255; //trackbar控制条最大值
double frameRate = 1.0; //视频帧率
double controlRate = 0.1;
int frameValue = 0;
// 算法输入部分
ARIDLL_INPUTPARA stInputPara = { 0 };
// 算法输出部分
ARIDLL_OUTPUT stOutput = { 0 };
// AI Detect算法结果
#if TEST_WITH_AID
obj_res* g_pGLB_AIDetOutput = NULL;
int g_GLB_AIDetNum = 0;
#endif
// AI Tracker算法结果
#if TEST_WITH_AIT
API_AI_Tracker* g_GLB_AITracker = NULL;
AIT_OUTPUT g_GLB_AITrackOutput = { 0 };
#endif
//控制条回调函数
static void TrackBarFunc(int, void(*))
{
controlRate = (double)trackbarValue / trackbarMax * totalFrame; //trackbar控制条对视频播放进度的控制
capture.set(CAP_PROP_POS_FRAMES, controlRate); //设置当前播放帧
frameValue = controlRate;
}
static void onMouse(int event, int x, int y, int flags, void* param)
{
//flags定义#define CV_EVENT_FLAG_LBUTTON 1 左鍵拖曳
switch (event)
{
case cv::EVENT_LBUTTONDOWN: // 鼠标左键按下
SelectCX = x;
SelectCY = y;
cursor = cv::Point(x, y);
rect = cv::Rect(x, y, 0, 0);
draw = true;
break;
case cv::EVENT_LBUTTONUP: //鼠标左键松开
setLockBoxW = rect.width;
setLockBoxH = rect.height;
SelectCX = rect.x + rect.width / 2;
SelectCY = rect.y + rect.height / 2;
bcmd = 1;
draw = false;
break;
case cv::EVENT_RBUTTONDOWN: //鼠标右键按下
bcmd = 2;
break;
case cv::EVENT_RBUTTONUP: //鼠标右键松开
break;
case cv::EVENT_MBUTTONUP://左键双击
bcmd = 1;
break;
case cv::EVENT_MOUSEMOVE: //移动光标
if (draw)
{
cv::Mat dstImage1 = frame.clone();
rect.x = MIN(x, cursor.x);
rect.y = MIN(y, cursor.y);
rect.width = abs(cursor.x - x);
rect.height = abs(cursor.y - y);
rectangle(dstImage1, rect, cv::Scalar(0, 0, 255), 1);
cv::imshow("test", dstImage1);
}
break;
}
}
#if TEST_WITH_AID
static void AIDetRun(ArithHandle pTracker, GD_VIDEO_FRAME_S img, int frameID)
{
// 异步调用考虑机器上传输延时注意异步方式结果天然缓1帧。
Async_YOLO_DetectTarget(img.u64VirAddr[0], img.u32Width, img.u32Height, frameID);
g_pGLB_AIDetOutput = Async_YOLO_GetTargetArray(g_GLB_AIDetNum);
int targetNum = 0;
TARGET_OBJECT* pArray = ARIDLL_SearchFrameTargets(pTracker, img, &targetNum);
int mergeNum = ARIDLL_MergeAITargets(pTracker, pArray, targetNum, g_pGLB_AIDetOutput, g_GLB_AIDetNum);
stInputPara.nInputTargetNum = mergeNum;
memcpy(stInputPara.stInputTarget, pArray, sizeof(TARGET_OBJECT) * mergeNum);
}
#endif
#if TEST_WITH_AIT
static int AITrackerRun(GD_VIDEO_FRAME_S img, int frameID)
{
// 从传统算法输出中获取AI跟踪器的控制指令
CENTERRECT32F InitBox = stOutput.stAI_TkCmd.InitBox;
CENTERRECT32F TargetBox = stOutput.stAI_TkCmd.TargetBox;
if (InitBox.w > 0 && InitBox.h > 0)
{
g_GLB_AITracker->init(img, InitBox);
return 0;
}
if (!stOutput.stAI_TkCmd.bTrack)
{
g_GLB_AITracker->stopTrack();
memset(&stInputPara.stAITrackerInfo, 0, sizeof(AIT_OUTPUT));
memset(&g_GLB_AITrackOutput, 0, sizeof(AIT_OUTPUT));
return 0;
}
g_GLB_AITracker->Track(img, TargetBox);
g_GLB_AITracker->getTrackResult_Async(&g_GLB_AITrackOutput);
// 向传统算法传参
memcpy(&stInputPara.stAITrackerInfo, &g_GLB_AITrackOutput, sizeof(AIT_OUTPUT));
return 0;
}
#endif
static void RunProcess(ArithHandle pTracker, GD_VIDEO_FRAME_S img)
{
#if TEST_WITH_AID
// 运行AI识别算法
AIDetRun(pTracker, img, stInputPara.unFrmId);
#endif
#if TEST_WITH_AIT
// 运行SiamRPN跟踪算法
AITrackerRun(img, stInputPara.unFrmId);
#endif
// 调用TLD流程
//ARIDLL_RunTLDTracker(pTracker, img);
// 运行算法主控逻辑API
ARIDLL_RunController(pTracker, img, stInputPara, &stOutput);
}
int main()
{
#ifdef _WIN32
char message[128];
TCHAR szBuffer[MAX_PATH] = { 0 };
OPENFILENAME ofn = { 0 };
ofn.lStructSize = sizeof(ofn);
//ofn.hwndOwner = m_hWnd;
ofn.lpstrFilter = _T("所有文件(*.*)\0*.*\0Exe文件(*.mp4)\0*.avi\0");//要选择的文件后缀
ofn.lpstrInitialDir = _T("F:\\Datasets\\20240219_AutoTest");//默认的文件路径
ofn.lpstrFile = szBuffer;//存放文件的缓冲区
ofn.nMaxFile = sizeof(szBuffer) / sizeof(*szBuffer);
ofn.nFilterIndex = 0;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER;//标志如果是多选要加上OFN_ALLOWMULTISELECT
bool bSel = GetOpenFileName(&ofn);
string video_fileName = ofn.lpstrFile;
capture.open(video_fileName);
if (!capture.isOpened())
return 0;
#elif __linux__
cv::VideoCapture capture("/home/temp/VL_公司门口车辆3.avi");
#endif
int nWidth = int(capture.get(cv::CAP_PROP_FRAME_WIDTH));
int nHeight = int(capture.get(cv::CAP_PROP_FRAME_HEIGHT));
//控制视频流进度
totalFrame = capture.get(CAP_PROP_FRAME_COUNT); //获取总帧数
frameRate = capture.get(CAP_PROP_FPS); //获取帧率
trackbarMax = totalFrame;
namedWindow(windowName, 0);
//resizeWindow(windowName, 960, 540);
//在图像窗口上创建控制条
createTrackbar(trackBarName, windowName, &trackbarValue, trackbarMax, TrackBarFunc);
TrackBarFunc(0, 0);
// 创建算法句柄
ArithHandle pTracker = STD_CreatEOArithHandle();
#if TEST_WITH_AID
// AI检测初始化
//YOLO_Init();
Async_YOLO_Init();
#endif
#if TEST_WITH_AIT
// AI跟踪器初始化
//CreatSiamRPN();
//Async_CreatSiamRPN();
// AI跟踪器初始化
g_GLB_AITracker = API_AI_Tracker::Create(AITrackerType::DaSaimRPN);
g_GLB_AITracker->loadModel();
memset(&g_GLB_AITrackOutput, 0, sizeof(AIT_OUTPUT));
#endif
// 初始化为凝视-对地模式
ARIDLL_EOArithInitWithMode(pTracker,nWidth,nHeight,GD_PIXEL_FORMAT_E::GD_PIXEL_FORMAT_RGB_PACKED,
GLB_SYS_MODE::GLB_SYS_STARE,GLB_SCEN_MODE::GLB_SCEN_GROUND);
stInputPara.unFreq = frameRate;
stInputPara.stAirCraftInfo.stAtt.fYaw = 0;
stInputPara.stAirCraftInfo.stAtt.fRoll = 0;
stInputPara.stAirCraftInfo.stAtt.fPitch = 0;
stInputPara.stServoInfo.fServoAz = 0;
stInputPara.stServoInfo.fServoPt = 0;
stInputPara.stCameraInfo.fPixelSize = 15;
stInputPara.stCameraInfo.nFocus = 600;
stInputPara.unFrmId = 0;
//stInputPara.nInputTargetNum = 0;
while(1)
{
stInputPara.unFrmId++;
//stInputPara.nInputTargetNum = 0;
capture.read(frame);
if (frame.empty())
{
/*
capture.set(CAP_PROP_POS_FRAMES, 0);
frameValue = 0;
capture >> frame;*/
break;
}
dstImage = frame.clone();
///控制台交互界面调试用----------------------------------
//cv::namedWindow("SOT_TRACKING", cv::WINDOW_NORMAL);
cv::setMouseCallback(windowName, onMouse, NULL);
// 首帧算法内部需要初始化,不要进行锁定
if (key == 32 || stInputPara.unFrmId == 2)
{
imshow("test", frame);
waitKey(0);
}
// 构建图像类型
GD_VIDEO_FRAME_S img = { 0 };
img.enPixelFormat = GD_PIXEL_FORMAT_E::GD_PIXEL_FORMAT_RGB_PACKED;
img.u32Width = nWidth;
img.u32Height = nHeight;
img.u32Stride[0] = img.u32Width * 3;
img.u64VirAddr[0] = frame.data;
//点选转跟踪
if (1 == bcmd)
{
/* setLockBoxW = 65;
setLockBoxH = 31;
SelectCX = 1525 + setLockBoxW / 2;
SelectCY = 354 + setLockBoxH / 2;*/
//ARIDLL_LockCommand(pTracker, SelectCX, SelectCY, setLockBoxW, setLockBoxH);
// 调用该接口,可在当前帧完成锁定响应,不必缓一帧得到结果有利于运动目标锁定,同时将锁定决策结果返回,提供外部跟踪器同步锁定
// 主要原因是点选锁定时无宽高,波门设置等来源于传统跟踪器决策结果。
ARIDLL_OBJINFO obj = { 0 };
obj = ARIDLL_LockTarget(pTracker, img, SelectCX, SelectCY, setLockBoxW, setLockBoxH);
#if TEST_WITH_AIT
if (obj.nObjW > 0)
{
// 使用EOTracker的锁定决策初始化AI跟踪器
CENTERRECT32F initBox = { obj.nX,obj.nY, obj.nObjW, obj.nObjH };
g_GLB_AITracker->init(img, initBox);
// 获取跟踪结果
g_GLB_AITracker->getTrackResult_Async(&g_GLB_AITrackOutput);
}
#endif
}
//右键解锁退出跟踪状态
if (2 == bcmd)
{
// 解锁传统跟踪器
ARIDLL_unLockCommand(pTracker, SelectCX, SelectCY, 0);
#if TEST_WITH_AIT
// 解锁AI跟踪器
g_GLB_AITracker->stopTrack();
#endif
}
RunProcess(pTracker, img);
auto trackerOut = stOutput.stTrackers[0];
cv::Rect outRect;
outRect.width = (int)trackerOut.nObjW;
outRect.height= (int)trackerOut.nObjH;
outRect.x = (int)trackerOut.nX - outRect.width / 2;
outRect.y = (int)trackerOut.nY - outRect.height / 2;
cv::rectangle(dstImage, outRect, cv::Scalar(0, 0, 255));
//cv::rectangle(dstImage, cv::Rect(g_GLB_AITrackOutput.fX - g_GLB_AITrackOutput.nObjW / 2,
// g_GLB_AITrackOutput.fY - g_GLB_AITrackOutput.nObjH / 2,
// g_GLB_AITrackOutput.nObjW,
// g_GLB_AITrackOutput.nObjH), cv::Scalar(0, 255, 255));
bcmd = 0;
SelectCX = 0;
SelectCY = 0;
setLockBoxW = 0;
setLockBoxH = 0;
cv::imshow("test", dstImage);
key = cv::waitKey(10);
}
return 0;
}