当前位置:   article > 正文

[C++]使用yolov8的onnx模型仅用opencv和bytetrack实现目标追踪_c++调用yolov8

c++调用yolov8


深度学习
专栏收录该内容
95 篇文章12 订阅
订阅专栏
【官方框架地址】

yolov8:

https://github.com/ultralytics/ultralytics

bytetrack:

https://github.com/ifzhang/ByteTrack
【算法介绍】

随着人工智能技术的不断发展,目标追踪已成为计算机视觉领域的重要研究方向。Yolov8和ByTetrack作为当前先进的算法,当它们结合使用时,能够显著提升目标追踪的准确性和实时性。

Yolov8,源于“You Only Look Once”的简称,是一款强大且高效的目标检测算法。它继承了Yolov3和Yolov4的优点,并在其基础上进行了改进,使得检测精度和速度都得到了显著提升。Yolov8特别适合于处理视频流中的目标追踪任务,因为它能够实时地、准确地检测出视频中的目标。

ByTetrack,全称为Background and Tracklet-based Object Tracking,是一种基于背景减除和轨迹匹配的目标追踪方法。它利用背景减除技术初步确定目标的运动轨迹,再结合轨迹匹配算法,对目标进行精确追踪。ByTetrack的优势在于,即使在复杂场景下,如目标遮挡、运动模糊等,它仍能保持较高的追踪精度。

当Yolov8与ByTetrack结合使用时,首先,Yolov8快速并准确地检测出视频中的目标;然后,ByTetrack利用Yolov8提供的信息,对目标进行精确追踪。这种结合方式既发挥了Yolov8的高检测精度,又利用了ByTetrack的高追踪精度,使得整体目标追踪效果更上一层楼。

综上所述,Yolov8与ByTetrack的结合为解决复杂场景下的目标追踪问题提供了新的思路和方法。在未来的人工智能技术发展中,这种结合方式有望成为目标追踪领域的研究热点。

【效果展示】

【实现部分代码】

  1. #include <iostream>
  2. #include<opencv2/opencv.hpp>
  3. #include<math.h>
  4. #include "yolov8.h"
  5. #include<time.h>
  6. #include <math.h>
  7. #include <time.h>
  8. #include <vector>
  9. #include <chrono>
  10. #include <float.h>
  11. #include <stdio.h>
  12. #include "BYTETracker.h"
  13. using namespace std;
  14. using namespace cv;
  15. using namespace dnn;
  16. int main() {
  17. string detect_model_path = "./models/yolov8n.onnx";
  18. Yolov8 detector;
  19. detector.ReadModel(detect_model_path,"labels.txt",false);
  20. vector<Object> objects;
  21. cv::VideoCapture cap("D:\\car.mp4");
  22. int img_w = cap.get(CAP_PROP_FRAME_WIDTH);
  23. int img_h = cap.get(CAP_PROP_FRAME_HEIGHT);
  24. int fps = cap.get(CAP_PROP_FPS);
  25. long nFrame = static_cast<long>(cap.get(CAP_PROP_FRAME_COUNT));
  26. if (!cap.isOpened())
  27. {
  28. std::cout << "open failed!" << std::endl;
  29. return -1;
  30. }
  31. Mat frame;
  32. BYTETracker tracker(fps, 30);
  33. int num_frames = 0;
  34. int keyvalue = 0;
  35. int total_ms = 1;
  36. while (true)
  37. {
  38. cap.read(frame);
  39. if (frame.empty())
  40. {
  41. std::cout << "read to end" << std::endl;
  42. break;
  43. }
  44. num_frames++;
  45. auto start = chrono::system_clock::now();
  46. objects.clear();
  47. detector.Detect(frame, objects);
  48. vector<STrack> output_stracks = tracker.update(objects);
  49. auto end = chrono::system_clock::now();
  50. total_ms = total_ms + chrono::duration_cast<chrono::microseconds>(end - start).count();
  51. for (int i = 0; i < output_stracks.size(); i++)
  52. {
  53. vector<float> tlwh = output_stracks[i].tlwh;
  54. bool vertical = tlwh[2] / tlwh[3] > 1.6;
  55. if (tlwh[2] * tlwh[3] > 20 && !vertical)
  56. {
  57. Scalar s = tracker.get_color(output_stracks[i].track_id);
  58. putText(frame, format("%d", output_stracks[i].track_id), Point(tlwh[0], tlwh[1] - 5),
  59. 0, 0.6, Scalar(0, 0, 255), 2, LINE_AA);
  60. rectangle(frame, Rect(tlwh[0], tlwh[1], tlwh[2], tlwh[3]), s, 2);
  61. }
  62. }
  63. putText(frame, format("frame: %d fps: %d num: %d", num_frames, num_frames * 1000000 / total_ms, (int)output_stracks.size()),
  64. Point(0, 30), 0, 0.6, Scalar(0, 0, 255), 2, LINE_AA);
  65. imshow("result", frame);
  66. keyvalue = waitKey(1);
  67. if (keyvalue == 113 || keyvalue == 81)
  68. {
  69. break;
  70. }
  71. }
  72. cap.release();
  73. }


【视频演示】

基于opencvC++版本yolov8-onnx和bytetrack追踪算法实现目标追踪_哔哩哔哩_bilibili
【测试环境】

vs2019
cmake==3.24.3
opencv==4.7.0

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/737741
推荐阅读
相关标签
  

闽ICP备14008679号