[C++]使用纯opencv部署yolov11-pose姿态估计onnx模型

news/2024/10/7 19:12:44 标签: c++, opencv, YOLO

【算法介绍】

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

YOLOv11-Pose结合了YOLO(You Only Look Once)的高效物体检测算法和Pose Estimation(姿态估计)专注于识别人体关键点的能力,能在多种计算平台上实时处理人体姿态数据。其采用的核心原理是特殊神经网络结构YOLOv3-tiny,能快速计算出图像中所有人体关键点的位置,实现姿态估计。同时,该模型还采用了ONNX格式,这是一种开放的模型表示,使得模型能在不同的深度学习框架和工具之间轻松转换。

在使用OpenCV部署YOLOv11-Pose ONNX模型时,需要确保开发环境已经安装了OpenCV 4.x(带有DNN模块)和必要的C++编译器。具体步骤包括加载ONNX模型、预处理输入图像、将预处理后的图像输入到模型中获取检测结果、对检测结果进行后处理等。由于YOLOv11是一个复杂的模型,其输出可能包含多个层的信息,因此需要仔细解析模型输出,并根据YOLOv11的具体实现进行后处理。

总的来说,使用纯OpenCV部署YOLOv11-Pose ONNX模型需要深入理解相关领域的知识,包括YOLOv11的模型架构、OpenCV的DNN模块以及ONNX格式等。

【效果展示】

【实现代码】

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

#include<math.h>
#include "yolov11_pose.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& task, cv::Mat& img, std::string& model_path)
{


	cv::dnn::Net net;
	if (task.ReadModel(net, model_path, false)) {
		std::cout << "read net ok!" << std::endl;
	}
	else {
		return -1;
	}
	//生成随机颜色
	std::vector<cv::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(cv::Scalar(b, g, r));
	}
	std::vector<OutputParams> result;

	bool isPose = false;
	if (typeid(task) == typeid(Yolov8Pose)) {
		isPose = true;
	}
	PoseParams poseParams;
	if (task.Detect(img, net, result)) {

		if (isPose)
			DrawPredPose(img, result, poseParams);
		else
		DrawPred(img, result, task._className, color);
		
	}
	else {
		std::cout << "Detect Failed!" << std::endl;
	}
	system("pause");
	return 0;
}


template<typename _Tp>
int video_demo(_Tp& task, std::string& model_path)
{
	std::vector<cv::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(cv::Scalar(b, g, r));
	}
	std::vector<OutputParams> result;
	cv::VideoCapture cap("video.avi");
	if (!cap.isOpened())
	{
		std::cout << "open capture failured!" << std::endl;
		return -1;
	}
	cv::Mat frame;
	bool isPose = false;
	PoseParams poseParams;
#ifdef VIDEO_OPENCV
	cv::dnn::Net net;
	if (typeid(task) == typeid(Yolov11Pose)) {
		isPose = true;
	}
	if (task.ReadModel(net, model_path, true)) {
		std::cout << "read net ok!" << std::endl;
	}
	else {
		std::cout << "read net failured!" << std::endl;
		return -1;
	}

#else
	if (typeid(task) == typeid(Yolov8PoseOnnx)) {
		isPose = true;
	}
	if (task.ReadModel(model_path, true)) {
		std::cout << "read net ok!" << std::endl;
	}
	else {
		std::cout << "read net failured!" << std::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 (task.Detect(frame, net, result)) {

			if (isPose)
				DrawPredPose(frame, result, poseParams,true);
			else
				DrawPred(frame, result, task._className, color,true);
	
		}
#else
		if (task.OnnxDetect(frame, result)) {
			if (isPose)
				DrawPredPose(frame, result, poseParams, true);
			else
				DrawPred(frame, result, task._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-pose.onnx";
	Yolov11Pose detector;
	video_demo(detector, detect_model_path);
}

【视频演示】

C++使用纯opencv部署yolov11-pose姿态估计onnx模型_哔哩哔哩_bilibili【测试环境】vs2019 cmake==3.24.3 opencv==4.8.0【运行步骤】下载模型:https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-pose.pt转换模型:yolo export model=yolo11n-pose.pt format=onnx dynamic=False opset=, 视频播放量 0、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 未来自主研究中心, 作者简介 未来自主研究中心,相关视频:用C#部署yolov8的tensorrt模型进行目标检测winform最快检测速度,使用易语言调用opencv进行视频和摄像头每一帧处理,C#使用纯OpenCvSharp部署yolov8-pose姿态识别,C# winform部署yolov11目标检测的onnx模型,基于opencv封装易语言读写视频操作模块支持视频读取和写出,使用C++部署yolov8的onnx和bytetrack实现目标追踪,C++使用yolov11的onnx模型结合opencv和bytetrack实现目标追踪,yolov5-7.0部署在ros机器人操作系统视频演示,使用C#部署openvino-yolov5s模型,使用C#调用libotrch-yolov5模型实现全网最快winform目标检测icon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1491XY2EWk/
【源码下载】

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


【测试环境】

vs2019
cmake==3.24.3
opencv==4.8.0

【运行步骤】

下载模型:https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-pose.pt

转换模型:yolo export model=yolo11n-pose.pt format=onnx dynamic=False opset=12 

编译项目源码,将模型,视频路径对应到源码即可运行


http://www.niftyadmin.cn/n/5693249.html

相关文章

kubernetes get pods的STATUS字段显示ImagePullBackOff 的解决办法

问题&#xff1a; [rootmaster ingress]# kubectl -n ingress-nginx get pods NAME READY STATUS RESTARTS AGE ingress-nginx-admission-create-mcrc6 0/1 ImagePullBackOff 0 37m ingress-…

一、MQTT简介

一、MQTT 简介与起源 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;&#xff0c;即消息队列遥测传输协议&#xff0c;由 IBM 在 1999 年开发。最初&#xff0c;MQTT 是用于将石油管道上的传感器与卫星相链接&#xff0c;旨在为受限设备和低带宽、高延迟或…

pip install dlib 失败报错的解决方案

pip install dlib 失败报错&#xff1a; 解决方案&#xff1a; 我是按照下面三条指令按照就能解决问题 pip install cmake -i https://pypi.tuna.tsinghua.edu.cn/simple pip install boost -i https://pypi.tuna.tsinghua.edu.cn/simple pip install dlib -i https://p…

(Linux驱动学习 - 8).信号异步通知

一.异步通知简介 1.信号简介 信号类似于我们硬件上使用的“中断”&#xff0c;只不过信号是软件层次上的。算是在软件层次上对中断的一种模拟&#xff0c;驱动可以通过主动向应用程序发送信号的方式来报告自己可以访问了&#xff0c;应用程序获取到信号以后就可以从驱动设备中…

Java学习——JDK

Java的内存需要划分成为5个部分: 栈(Stack):存放的都是方法中的局部变量。方法的运行一定要在栈当中运行。 局部变量:方法的参数&#xff0c;或者是方法内部的变量 作用域:一旦超出作用域&#xff0c;立刻从栈内存当中消失。2.堆(Heap):凡是new出来的东西&#xff0c;都在堆当…

Qt源码-Qt多媒体音频框架

Qt 多媒体音频框架 一、概述二、音频设计1. ALSA 基础2. Qt 音频类1. 接口实现2. alsa 插件实现 一、概述 环境详细Qt版本Qt 5.15操作系统Deepin v23代码工具Visual Code源码https://github.com/qt/qtmultimedia/tree/5.15 这里记录一下在Linux下Qt 的 Qt Multimedia 模块的设…

xlwings直接读取使用区域的数据

这里的读取方法&#xff0c;不用最大行号最大列号&#xff0c;直接使用used_range对应的方法 代码如下&#xff1a; import xlwings as xwfile_path r...\AAA.xlsx# 实例化app&#xff0c;打开文件 app_e xw.App(VisibleFalse,add_bookFalse) work_book appe.books.open(f…