[C++]使用纯opencv部署yolov11目标检测onnx模型

news2024/11/28 6:53:51

yolov11官方框架:https://github.com/ultralytics/ultralytics

【算法介绍】

在C++中使用纯OpenCV部署YOLOv11进行目标检测是一项具有挑战性的任务,因为YOLOv11通常是用PyTorch等深度学习框架实现的,而OpenCV本身并不直接支持加载和运行PyTorch模型。然而,你可以通过一些间接的方法来实现这一目标,比如将PyTorch模型转换为ONNX格式,然后使用OpenCV的DNN模块加载ONNX模型。

以下是一个大致的步骤指南,用于在C++中使用OpenCV部署YOLOv11(假设你已经有了YOLOv11的ONNX模型):

  1. 安装依赖
    • 确保你的开发环境已经安装了OpenCV 4.x(带有DNN模块)和必要的C++编译器。
  2. 准备模型
    • 将YOLOv11模型从PyTorch转换为ONNX格式。这通常涉及使用PyTorch的torch.onnx.export函数。
    • 确保你有YOLOv11的ONNX模型文件、配置文件(描述模型架构)和类别名称文件。
  3. 编写C++代码
    • 使用OpenCV的DNN模块加载ONNX模型。
    • 预处理输入图像(如调整大小、归一化等),以符合模型的输入要求。
    • 将预处理后的图像输入到模型中,并获取检测结果。
    • 对检测结果进行后处理,包括解析输出、应用非极大值抑制(NMS)和绘制边界框。
  4. 编译和运行
    • 使用C++编译器(如g++)编译你的代码。
    • 运行编译后的程序,输入图像或视频,并观察目标检测结果。

需要注意的是,由于YOLOv11是一个复杂的模型,其输出可能包含多个层的信息(如特征图、置信度、边界框坐标等),因此你需要仔细解析模型输出,并根据YOLOv11的具体实现进行后处理。

此外,由于OpenCV的DNN模块对ONNX的支持可能有限,某些YOLOv11的特性(如自定义层、特定的激活函数等)可能无法在OpenCV中直接实现。在这种情况下,你可能需要寻找替代方案,如使用其他深度学习库(如TensorRT、ONNX Runtime等)来加载和运行模型,并通过C++接口与这些库进行交互。

总之,在C++中使用纯OpenCV部署YOLOv11是一项具有挑战性的任务,需要深入理解YOLOv11的模型架构、OpenCV的DNN模块以及ONNX格式。如果你不熟悉这些领域,可能需要花费更多的时间和精力来学习和解决问题。

【效果展示】

【测试环境】

vs2019
cmake==3.24.3
opencv==4.8.0

【部分实现代码】

#include <iostream>
#include<opencv2/opencv.hpp>

#include<math.h>
#include "yolov11.h"
#include<time.h>
#define  VIDEO_OPENCV //if define, use opencv for video.

using namespace std;
using namespace cv;
using namespace dnn;

template<typename _Tp>
int yolov11(_Tp& cls,Mat& img,string& model_path)
{

	Net net;
	if (cls.ReadModel(net, model_path, false)) {
		cout << "read net ok!" << endl;
	}
	else {
		return -1;
	}
	//生成随机颜色
	vector<Scalar> color;
	srand(time(0));
	for (int i = 0; i < 80; i++) {
		int b = rand() % 256;
		int g = rand() % 256;
		int r = rand() % 256;
		color.push_back(Scalar(b, g, r));
	}
	vector<OutputSeg> result;


	if (cls.Detect(img, net, result)) {
		DrawPred(img, result, cls._className, color);
	}
	else {
		cout << "Detect Failed!" << endl;
	}
	system("pause");
	return 0;
}




template<typename _Tp>
int video_demo(_Tp& cls, string& model_path)
{
	vector<Scalar> color;
	srand(time(0));
	for (int i = 0; i < 80; i++) {
		int b = rand() % 256;
		int g = rand() % 256;
		int r = rand() % 256;
		color.push_back(Scalar(b, g, r));
	}
	vector<OutputSeg> result;
	cv::VideoCapture cap("D:\\car.mp4");
	if (!cap.isOpened())
	{
		std::cout << "open capture failured!" << std::endl;
		return -1;
	}
	Mat frame;
#ifdef VIDEO_OPENCV
	Net net;
	if (cls.ReadModel(net, model_path, true)) {
		cout << "read net ok!" << endl;
	}
	else {
		cout << "read net failured!" << endl;
		return -1;
	}

#else
	if (cls.ReadModel(model_path, true)) {
		cout << "read net ok!" << endl;
	}
	else {
		cout << "read net failured!" << endl;
		return -1;
	}

#endif

	while (true)
	{

		cap.read(frame);
		if (frame.empty())
		{
			std::cout << "read to end" << std::endl;
			break;
		}
		result.clear();
#ifdef VIDEO_OPENCV

		if (cls.Detect(frame, net, result)) {
			DrawPred(frame, result, cls._className, color, true);
		}
#else
		if (cls.OnnxDetect(frame, result)) {
			DrawPred(frame, result, cls._className, color, true);
		}
#endif
		int k = waitKey(10);
		if (k == 27) { //esc 
			break;
		}

	}
	cap.release();

	system("pause");

	return 0;
}


int main() {

	string detect_model_path = "./yolo11n.onnx";
	Yolov11 detector;
	video_demo(detector, detect_model_path);
}



【视频演示】

C++使用纯opencv部署yolov11目标检测onnx模型演示源码+模型_哔哩哔哩_bilibili【测试环境】vs2019cmake==3.24.3opencv==4.8.0更多实现细节和源码下载参考博文https://blog.csdn.net/FL1623863129/article/details/142688868, 视频播放量 1、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 未来自主研究中心, 作者简介 未来自主研究中心,相关视频:用C#部署yolov8的tensorrt模型进行目标检测winform最快检测速度,将yolov5-6.2封装成一个类几行代码完成语义分割任务,C++使用纯opencv去部署yolov8官方obb旋转框检测,使用C#的winform部署yolov8的onnx实例分割模型,超变态的AI换脸工具,解除限制!解锁高级功能!,YOLOv8检测界面-PyQt5实现,基于onnx模型加密与解密深度学习模型保护方法介绍,基于opencv封装易语言读写视频操作模块支持视频读取和写出,使用易语言调用opencv进行视频和摄像头每一帧处理,使用纯opencv部署yolov5目标检测模型onnxicon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1Nc4LekE1d/
【源码下载】

https://download.csdn.net/download/FL1623863129/89837170

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2186818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python+Matplotlib展示单射、双射、满射

import matplotlib.pyplot as pltplt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号def create_function_plot(ax, title, x, y, connections):ax.set_xlim(0, 5)ax.set_ylim(0, 5)ax.set_aspect…

UE4 材质学习笔记01(什么是着色器/PBR基础)

1.什么是shader 着色器是控制屏幕上每个像素颜色的代码&#xff0c;这些代码通常在图形处理器上运行。 现如今游戏引擎使用先进的基于物理的渲染和照明。而且照明模型模型大多数是被锁定的。 因此我们创建着色器可以控制颜色&#xff0c;法线&#xff0c;粗糙度&#xff0c;…

十一假期不停歇-学习ROS第二天

一、自动修改环境变量 source install/setup.bash 这句指令可不重复添加环境变量&#xff0c;直接运行就可以。 从左右图即可即可看出有所不同的。以后写完功能包发现不存在那就source一下就好了。 实际上它运行的是 python3.10那里的功能包与节点 我们在创建完功能包会出…

python-矩阵转置/将列表分割成块/和超过N的最短子数组

一&#xff1a;矩阵转置 题目描述 输入一个 n 行 m 列的矩阵 A&#xff0c;输出它的转置 AT。输入 第一行包含两个整数 n 和 m&#xff0c;表示矩阵 A 的行数和列数。1≤n≤100&#xff0c;1≤m≤100。接下来 n 行&#xff0c;每行 m 个整数&#xff0c;表示矩阵 A 的元素。相邻…

别再为开题报告发愁了,ChatGPT可以助力你高效完成!

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 面对开题报告时&#xff0c;我们常常感到迷茫和压力。如何清晰地表达研究目的、梳理文献综述、明确研究问题与假设&#xff0c;以及构建合理的研究方法&#xff0c;这些环节都对开题报告…

OpenCV-图像拼接

文章目录 一、基本原理二、步骤三、代码实现1.定义函数2.读取图像3.图像配准&#xff08;1&#xff09;.特征点检测&#xff08;2&#xff09;.特征匹配 4.透视变换5.图像拼接 四、图像拼接的注意事项 图像拼接是一种将多张有重叠部分的图像合并成一张无缝的全景图或高分辨率图…

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555 第一节 硬件解读第二节 CubeMx配置第三节 代码1&#xff0c;脉冲部分代码2&#xff0c;ADC部分代码![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/57531a4ee76d46daa227ae0a52993191.png) 第一节 …

基于工业物联网的能源监控系统:边缘数据处理的应用

论文标题&#xff1a;《Industrial IoT-Based Energy Monitoring System: Using Data Processing at Edge》 作者信息&#xff1a; Akseer Ali MiraniAnshul AwasthiNiall O’MahonyJoseph Walsh 他们均来自爱尔兰的芒斯特技术大学IMaR研究中心&#xff0c;以及位于利默里克的…

秋招校招北森笔试测评北森笔测评常见图推题目解答

北森笔试测评常见题目解析第二弹&#xff1a; P1&#xff1a;每一行均出现圆&#xff0c;米&#xff0c;口加上内部的菱形和小圆形&#xff0c;行测上称之为遍历。 P2&#xff1a;题干也给提示了&#xff0c;肯定不选9&#xff0c;考虑封闭部分&#xff0c;选11. P3&#xf…

面试速通宝典——7

150. 数据库连接池的作用 数据库连接池的作用包括以下几个方面&#xff1a; 资源重用&#xff1a;连接池允许多个客户端共享有限的数据库连接&#xff0c;减少频繁创建和销毁连接的开销&#xff0c;从而提高资源的利用率。 统一的连接管理&#xff1a;连接池集中管理数据库连…

访问webapps下边的内容不能访问解决办法

1、看是否是带有中文路径&#xff0c;中文路径访问不了 2、是否在访问的时候没有带8080端口 如图&#xff0c;带有8080就可以访问了 原因&#xff1a; 当你尝试通过 http://localhost:8080/hello/hello.html 访问网页时&#xff0c;端口号 “8080” 指定了该请求将发送到本地主…

STM32-MPU6050+DAM库源码(江协笔记)

目录 1、MPU6050简介 2、MPU6050参数 3、MPU6050硬件电路 4、MPU6050结构 5、MPU6000和MPU6050的区别 6、MPU6050应用场景 7、MPU6050电气参数 8、MPU6050时钟源选择 9、MPU6050中断源 10、MPU6050的I2C读写操作 11、DMP库移植 1、MPU6050简介 10轴传感器&#xff1…

使用CSS实现酷炫加载

使用CSS实现酷炫加载 效果展示 整体页面布局 <div class"container"></div>使用JavaScript添加loading加载动画的元素 document.addEventListener("DOMContentLoaded", () > {let container document.querySelector(".container&q…

Unity初识+面板介绍

Unity版本使用 小版本号高&#xff0c;出现bug可能性更小&#xff1b;一台电脑可以安装多个版本的Unity&#xff0c;但是需要安装在不同路径&#xff1b;安装Unity时不能有中文路径&#xff1b;Unity项目路径也不要有中文。 Scene面板 相当于拍电影的片场&#xff0c;Unity程…

前缀和+思维,CF 1984C2 - Magnitude (Hard Version)

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1984C2 - Magnitude (Hard Version) 二、解题报告 1、思路分析 C1 是只要…

Docker巩固十七问

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 1. 如何批量清理临时镜像文件&#xff1f; 所谓的“临时镜像”或“虚悬镜像”&#xff08;dangling images&#xff09;是指那些…

动态规划算法专题(二):路径问题

1. 不同路径 . - 力扣&#xff08;LeetCode&#xff09; 1.1 算法原理 状态表示dp[i][j]&#xff1a;走到(i,j)位置&#xff0c;一共有多少种方法&#xff08;以(i,j)位置为结尾&#xff09;状态转移方程&#xff1a;dp[i][j]dp[i-1][j]dp[i][j-1];初始化&#xff1a;dp[0][1…

SSM超市进销存管理系统源码

主要功能说明&#xff1a; 管理员角色包含以下功能&#xff1a;管理员登录、进货管理、商品信息、类别管理、库存管理、销售管理、 客户信息管理、供应商管理、员工管理、修改管理员个人信息等功能。 员工角色包含以下功能&#xff1a;员工登录、进货信息查看、退货信息管理…

大华智慧园区综合管理平台系统存在多处漏洞

漏洞描述 大华智慧园区综合管理平台是一个集智能化、信息化、网络化、安全化为一体的智慧园区管理平台&#xff0c;旨在为园区提供一站式解决方案&#xff0c;包括安防、能源管理、环境监测、人员管理、停车管理等多个方面。 FOFA app"dahua-智慧园区综合管理平台"…

【Linux庖丁解牛】—Linux基本指令(中)!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a; Linux庖丁解牛 &#x1f516;克心守己&#xff0c;律己则安 目录 1、rmdir与rm指令 2、man指令 3、cp指令 4、mv指令 5、cat与tac指令 6、重定向 7、more指令 8、…