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

【官方框架地址】

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的结合为解决复杂场景下的目标追踪问题提供了新的思路和方法。在未来的人工智能技术发展中,这种结合方式有望成为目标追踪领域的研究热点。

【效果展示】

【实现部分代码】

复制代码
#include <iostream>
#include<opencv2/opencv.hpp>

#include<math.h>
#include "yolov8.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/yolov8n.onnx";
	Yolov8 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 failed!" << 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("result", frame);
		keyvalue = waitKey(1);
		if (keyvalue == 113 || keyvalue == 81)
		{
			break;
		}

	}
	cap.release();

}

【视频演示】

https://www.bilibili.com/video/BV15w411j7nP/?vd_source=989ae2b903ea1b5acebbe2c4c4a635ee

【测试环境】

vs2019

cmake==3.24.3

opencv==4.7.0

相关推荐
王哈哈^_^9 小时前
YOLO11实例分割训练任务——从构建数据集到训练的完整教程
人工智能·深度学习·算法·yolo·目标检测·机器学习·计算机视觉
xuehaikj12 小时前
香烟品牌识别与分类:yolov5-LSKNet模型应用
yolo·数据挖掘
Sunhen_Qiletian14 小时前
YOLO的再进步---YOLOv3算法详解(上)
算法·yolo·计算机视觉
王哈哈^_^19 小时前
【完整源码+数据集】中药材数据集,yolov8中药分类检测数据集 9709 张,中药材分类识别数据集,中药材识别系统实战教程
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·毕业设计
深度学习lover21 小时前
<数据集>yolo遥感航拍船舶识别数据集<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·航拍船舶识别
深蓝海拓1 天前
YOLO v11的学习记录(六) 把标注好的大图切割成小图
深度学习·学习·yolo
minhuan2 天前
构建AI智能体:九十五、YOLO视觉大模型入门指南:从零开始掌握目标检测
人工智能·yolo·目标检测·计算机视觉·视觉大模型
xuehaikj2 天前
YOLOv8多场景人物识别定位与改进ASF-DySample算法详解
算法·yolo·目标跟踪
番茄小能手2 天前
【全网唯一】按键精灵安卓版纯本地离线yolo插件
yolo
jay神2 天前
【原创】基于YOLO模型的手势识别系统
深度学习·yolo·计算机·毕业设计·软件设计与开发