YOLOv8-pose针对视频实时提取打印对应关节点序号及坐标

本文主要是介绍YOLOv8-pose针对视频实时提取打印对应关节点序号及坐标,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因为我在找如何提取YOLOv8-pose的关键点的时候,大多都是针对静态图像,视频直接套用不太行,因此就改进了一下,如下:

初步代码:

import torch  # 导入PyTorch库
import cv2 as cv  # 导入OpenCV库并重命名为cv
import numpy as np  # 导入NumPy库并重命名为np
from ultralytics.data.augment import LetterBox  # 从ultralytics.data.augment中导入LetterBox类
from ultralytics.utils import ops  # 从ultralytics.utils中导入ops模块
from ultralytics.engine.results import Results  # 从ultralytics.engine.results中导入Results类
import copy  # 导入copy模块# 视频路径
video_path = 'D:/cs/yolov8_2/ultralytics/ceshi1.mp4'  # 将此处路径改为你的视频文件路径
device = 'cuda:0'  # 设备类型,此处使用CUDA
conf = 0.25  # 置信度阈值
iou = 0.7  # IoU(交并比)阈值# 加载视频
cap = cv.VideoCapture(video_path)# 检查视频是否成功打开
if not cap.isOpened():print("Error: Could not open video.")  # 打印错误消息exit()  # 退出程序# 加载模型
ckpt = torch.load('yolov8n-pose.pt', map_location='cpu')  # 加载模型参数
model = ckpt['model'].to(device).float()  # 将模型加载到指定设备(CPU或GPU)并转换为浮点数类型
model.eval()  # 将模型设置为评估模式results = []  # 存储结果的列表while True:ret, frame = cap.read()  # 读取视频帧# 如果没有读取到帧或者视频结束,则退出循环if not ret:breakorig_img = frame  # 原始图像# 预处理im = [orig_img]  # 图像列表im = [LetterBox([640, 640], auto=True, stride=32)(image=x) for x in im]  # 对图像进行LetterBox缩放im = im[0][None]  # 转换为数组形式im = im[..., ::-1].transpose((0, 3, 1, 2))  # BGR转RGB,BHWC转BCHWim = np.ascontiguousarray(im)  # 转换为连续的内存布局im = torch.from_numpy(im)  # 将数组转换为PyTorch张量img = im.to(device)  # 将张量移动到指定设备img = img.float()  # 转换为浮点数类型img /= 255  # 归一化# 推理preds = model(img)  # 模型推理prediction = ops.non_max_suppression(preds, conf, iou, agnostic=False, max_det=300, classes=None, nc=len(model.names))  # 非最大抑制得到预测结果for i, pred in enumerate(prediction):shape = orig_img.shape  # 图像形状pred[:, :4] = ops.scale_boxes(img.shape[2:], pred[:, :4], shape).round()  # 缩放边界框坐标pred_kpts = pred[:, 6:].view(len(pred), *model.kpt_shape) if len(pred) else pred[:, 6:]  # 获取关键点坐标pred_kpts = ops.scale_coords(img.shape[2:], pred_kpts, shape)  # 缩放关键点坐标results.append(Results(orig_img=orig_img,  # 原始图像path=video_path,  # 视频路径names=model.names,  # 类别名称boxes=pred[:, :6],  # 边界框keypoints=pred_kpts))  # 关键点# 获取关键点坐标及其对应的序号for j, kpts in enumerate(pred_kpts):keypoints = kpts.cpu().numpy()  # 将关键点转换为NumPy数组# keypoints 包含了所有关键点的坐标,每一行是一个关键点的坐标# 根据模型的结构,关键点序号可能是从0到N-1,N是关键点的总数# 您可以在这里使用 keypoints 获取关键点的坐标和对应的序号for k, keypoint in enumerate(keypoints):x, y = keypoint[:2]  # 关键点的坐标keypoint_index = k  # 关键点的序号# 这里可以对每个关键点的坐标和序号执行您需要的操作print("关键点序号:", keypoint_index, "关键点坐标:", (x, y))# 显示帧plot_args = {'line_width': None, 'boxes': True, 'conf': True, 'labels': True}  # 绘图参数plot_args['im_gpu'] = img[0]  # 图像张量plotted_img = results[-1].plot(**plot_args)  # 显示处理后的最后一帧结果cv.imshow('plotted_img', plotted_img)  # 显示图像# 按 'q' 键退出if cv.waitKey(1) & 0xFF == ord('q'):break# 释放视频捕获并关闭所有窗口
cap.release()
cv.destroyAllWindows()

效果:

这篇关于YOLOv8-pose针对视频实时提取打印对应关节点序号及坐标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/934494

相关文章

Java如何获取视频文件的视频时长

《Java如何获取视频文件的视频时长》文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案... 目录Java获取视频文件的视频时长1、导入maven依赖2、代码案例3、SLF4J: Failed to lo

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

使用Python在Excel中插入、修改、提取和删除超链接

《使用Python在Excel中插入、修改、提取和删除超链接》超链接是Excel中的常用功能,通过点击超链接可以快速跳转到外部网站、本地文件或工作表中的特定单元格,有效提升数据访问的效率和用户体验,这... 目录引言使用工具python在Excel中插入超链接Python修改Excel中的超链接Python

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea