赞
踩
【简介】
在C++中实现YOLOv9的目标检测与ByteTrack的多目标追踪是一个相对复杂的过程,涉及到深度学习、计算机视觉和实时数据处理等多个领域。下面我将简单介绍这两个技术,并概述如何在C++中实现它们。
YOLOv9(You Only Look Once,版本9)是一种实时目标检测算法,它通过在单个网络中同时预测所有目标的位置和类别来实现高效的目标检测。YOLOv9在速度和精度之间取得了很好的平衡,使其成为许多实时应用的首选方法。
ByteTrack是一种多目标追踪算法,它结合了目标检测和目标追踪两个步骤。ByteTrack使用目标检测算法(如YOLOv9)来识别视频帧中的目标,并使用追踪算法来跟踪这些目标在连续帧之间的运动。ByteTrack通过关联相邻帧中的目标来实现多目标追踪,从而可以准确地跟踪多个目标的运动轨迹。
在C++中实现YOLOv9和ByteTrack的结合,需要以下几个步骤:
需要注意的是,实现这一过程需要一定的计算机视觉和深度学习基础,以及对C++编程的熟悉。此外,由于YOLOv9和ByteTrack都是比较新的技术,因此可能需要使用较新的深度学习框架和库来支持。
总的来说,在C++中实现YOLOv9和ByteTrack的多目标追踪是一个具有挑战性的任务,但它为实时目标检测和追踪提供了强大的工具。通过不断学习和实践,你可以逐渐掌握这些技术,并将其应用于各种实际应用中。
【效果展示】
演示结果
【演示视频】
【部分实现代码】
- #include <iostream>
- #include<opencv2/opencv.hpp>
-
- #include<math.h>
- #include "yolov9.h"
- #include<time.h>
- #include <math.h>
- #include <time.h>
- #include <vector>
- #include <chrono>
- #include <float.h>
- #include <stdio.h>
- #include "BYTETracker.h"
-
- using namespace std;
- using namespace cv;
- using namespace dnn;
-
-
-
- int main() {
-
- string detect_model_path = "./models/yolov9-c.onnx";
- Yolov9 detector;
- detector.ReadModel(detect_model_path,"labels.txt",false);
- vector<Object> objects;
- cv::VideoCapture cap("D:\\car.mp4");
- int img_w = cap.get(CAP_PROP_FRAME_WIDTH);
- int img_h = cap.get(CAP_PROP_FRAME_HEIGHT);
- int fps = cap.get(CAP_PROP_FPS);
- long nFrame = static_cast<long>(cap.get(CAP_PROP_FRAME_COUNT));
- if (!cap.isOpened())
- {
- std::cout << "open capture failured!" << std::endl;
- return -1;
- }
- Mat frame;
- BYTETracker tracker(fps, 30);
- int num_frames = 0;
- int keyvalue = 0;
- int total_ms = 1;
- while (true)
- {
- cap.read(frame);
- if (frame.empty())
- {
- std::cout << "read to end" << std::endl;
- break;
- }
- num_frames++;
- auto start = chrono::system_clock::now();
- objects.clear();
- detector.Detect(frame, objects);
- vector<STrack> output_stracks = tracker.update(objects);
- auto end = chrono::system_clock::now();
- total_ms = total_ms + chrono::duration_cast<chrono::microseconds>(end - start).count();
- for (int i = 0; i < output_stracks.size(); i++)
- {
- vector<float> tlwh = output_stracks[i].tlwh;
- bool vertical = tlwh[2] / tlwh[3] > 1.6;
- if (tlwh[2] * tlwh[3] > 20 && !vertical)
- {
- Scalar s = tracker.get_color(output_stracks[i].track_id);
- putText(frame, format("%d", output_stracks[i].track_id), Point(tlwh[0], tlwh[1] - 5),
- 0, 0.6, Scalar(0, 0, 255), 2, LINE_AA);
- rectangle(frame, Rect(tlwh[0], tlwh[1], tlwh[2], tlwh[3]), s, 2);
- }
- }
- putText(frame, format("frame: %d fps: %d num: %d", num_frames, num_frames * 1000000 / total_ms, (int)output_stracks.size()),
- Point(0, 30), 0, 0.6, Scalar(0, 0, 255), 2, LINE_AA);
-
- imshow("demo", frame);
- keyvalue = waitKey(1);
- if (keyvalue == 113 || keyvalue == 81)
- {
- break;
- }
-
- }
- cap.release();
-
- }
-
-
-
【源码下载】
https://download.csdn.net/download/FL1623863129/88903992
【测试环境】
vs2019
cmake==3.24.3
opencv==4.8.0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。