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


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

【效果展示】

【实现部分代码】

#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();
 
}
 
 
 


【视频演示】

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

vs2019
cmake==3.24.3
opencv==4.7.0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值