使用OpenCV和MediaPipe库——实现人体姿态检测

目录

准备工作如何在Windows系统中安装OpenCV和MediaPipe库?

安装Python

安装OpenCV

安装MediaPipe

验证安装

代码逻辑

整体代码

效果展示


准备工作如何在Windows系统中安装OpenCV和MediaPipe库?

安装Python

    可以通过命令行运行python --version来检查版本号。如果没有安装,可以从Python官方网站下载并安装。

安装OpenCV

  1. 打开命令提示符(Command Prompt)。

  2. 输入以下命令来安装OpenCV-python:

    pip install opencv-python

    如果你也需要OpenCV的额外模块(如SIFT、SURF等),可以运行:

    pip install opencv-contrib-python

安装MediaPipe

安装MediaPipe同样简单,只需要在命令提示符下运行:

pip install mediapipe

验证安装

为了验证OpenCV和MediaPipe是否成功安装,可以在命令提示符中启动Python解释器,然后尝试导入这两个库:

import cv2
import mediapipe as mp
print(cv2.__version__)
print(mp.__version__)

如果打印出了版本号,安装成功。


代码逻辑

  1. 导入必要的库:

    • cv2: OpenCV库,用于处理图像和视频。
    • mediapipe as mp: MediaPipe库,提供了一种简单的方法来访问先进的机器学习模型,这里用于人体姿态估计。
    • time: 用于时间相关的操作,比如计算FPS。
  2. 初始化MediaPipe姿势检测对象:

    • 使用mp_pose.Pose()创建了一个姿势检测器对象,设置了最小检测置信度和跟踪置信度为0.5。
  3. 打开摄像头获取视频流:

    • 使用cv2.VideoCapture(0)打开默认摄像头。
  4. 主循环开始:

    • while cap.isOpened():循环中不断读取摄像头数据。
  5. 处理每一帧图像:

    • 首先检查是否成功读取图像。
    • 然后计算当前帧的FPS。
    • 将BGR格式的图像转换为RGB格式,因为MediaPipe需要RGB格式的输入。
    • 使用姿势检测器对象对图像进行处理,得到关键点位置。
  6. 绘制关键点和连接线:

    • 如果检测到了关键点(results.pose_landmarks),则使用mp_drawing.draw_landmarks()函数在图像上绘制这些关键点及其连接线。
    • 可以自定义关键点和连线的颜色、粗细等属性。
  7. 显示FPS信息:

    • 在图像上显示当前帧的FPS值,帮助用户了解程序运行的流畅度。
  8. 展示结果并监听退出指令:

    • 使用cv2.imshow()展示处理后的图像。
    • 监听键盘事件,当按下'q'键时退出循环,释放资源并关闭所有窗口。


整体代码

import cv2  # 导入 OpenCV 库,用于图像处理和显示
import mediapipe as mp  # 导入 MediaPipe 库,用于姿势检测
import time  # 导入时间模块,用于计算 FPS# 初始化 MediaPipe 的绘图工具和姿势检测模型
mp_drawing = mp.solutions.drawing_utils  # 用于绘制关键点和连接线
mp_pose = mp.solutions.pose  # 用于姿势检测# 打开摄像头
cap = cv2.VideoCapture(0)  # 0 表示默认摄像头,如果有多个摄像头可以尝试 1, 2, 等# 初始化 FPS 计算相关变量
prev_time = 0  # 用于存储上一帧的时间戳# 使用 MediaPipe 的姿势检测模型
with mp_pose.Pose(min_detection_confidence=0.5,  # 检测置信度阈值,高于此值才认为检测到姿势min_tracking_confidence=0.5    # 跟踪置信度阈值,高于此值才继续跟踪
) as pose:# 进入主循环,持续读取摄像头画面while cap.isOpened():success, image = cap.read()  # 读取一帧画面if not success:  # 如果读取失败(如摄像头断开)print("无法读取摄像头画面。")break# --- 计算 FPS ---curr_time = time.time()  # 获取当前帧的时间戳dt = curr_time - prev_time  # 计算与上一帧的时间间隔(秒)fps = 1 / dt if dt != 0 else 0  # 计算帧率(FPS),避免除以零错误prev_time = curr_time  # 更新上一帧的时间戳# 将图像从 BGR 格式转换为 RGB 格式(MediaPipe 需要 RGB 格式)image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 使用姿势检测模型处理图像results = pose.process(image_rgb)# 如果检测到姿势关键点,绘制关键点和连接线if results.pose_landmarks:mp_drawing.draw_landmarks(image,  # 要绘制的图像results.pose_landmarks,  # 检测到的姿势关键点mp_pose.POSE_CONNECTIONS,  # 定义关键点之间的连接线landmark_drawing_spec=mp_drawing.DrawingSpec(color=(0, 255, 0), thickness=2),  # 关键点的颜色和粗细connection_drawing_spec=mp_drawing.DrawingSpec(color=(0, 0, 255), thickness=2)  # 连接线的颜色和粗细)# --- 在画面上显示 FPS ---fps_text = "FPS: {:.2f}".format(fps)  # 格式化 FPS 值,保留两位小数cv2.putText(image,  # 要绘制的图像fps_text,  # 显示的文本内容(10, 30),  # 文本位置(左上角,距离左边 10 像素,距离顶部 30 像素)cv2.FONT_HERSHEY_SIMPLEX,  # 字体类型1,  # 字体大小(0, 255, 0),  # 字体颜色(绿色)2  # 字体粗细)# 显示处理后的图像cv2.imshow('Real-Time Pose Detection', image)# 检测按键输入,如果按下 'q' 键则退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放摄像头资源
cap.release()# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()

效果展示

 

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

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

相关文章

5G学习笔记之BWP

我们只会经历一种人生,我们选择的人生。 参考:《5G NR标准》、《5G无线系统指南:如微见著,赋能数字化时代》 目录 1. 概述2. BWP频域位置3. 初始与专用BWP4. 默认BWP5. 切换BWP 1. 概述 在LTE的设计中,默认所有终端均能处理最大2…

创建Electron35 + vue3 + electron-builder项目,有很过坑,记录过程

环境: node v20.18.0 npm 11.1.0 用到的所有依赖: "dependencies": {"core-js": "^3.8.3","vue": "^3.2.13","vue-router": "^4.5.0"},"devDependencies": {"ba…

Linux下安装elasticsearch(Elasticsearch 7.17.23)

Elasticsearch 是一个分布式的搜索和分析引擎,能够以近乎实时的速度存储、搜索和分析大量数据。它被广泛应用于日志分析、全文搜索、应用程序监控等场景。 本文将带你一步步在 Linux 系统上安装 Elasticsearch 7.17.23 版本,并完成基本的配置&#xff0…

NVIDIA显卡驱动、CUDA、cuDNN 和 TensorRT 版本匹配指南

一、驱动安装 1、下载驱动 前往NVIDIA驱动下载页,输入显卡型号和操作系统类型,选择≥目标CUDA版本要求的驱动版本‌。 2、安装驱动‌ ‌Windows‌:双击安装包按向导操作。‌Linux‌:建议使用apt或官方.run文件安装‌。 3、验证…

plt和cv2有不同的图像表示方式和颜色通道顺序

在处理图像时,matplotlib.pyplot (简称 plt) 和 OpenCV (简称 cv2) 有不同的图像表示方式和颜色通道顺序。了解这些区别对于正确处理和显示图像非常重要。 1. 图像形状和颜色通道顺序 matplotlib.pyplot (plt) 形状:plt 通常使用 (height, width, cha…

基于PyTorch的深度学习5——神经网络工具箱

可以学习如下内容: • 介绍神经网络核心组件。 • 如何构建一个神经网络。 • 详细介绍如何构建一个神经网络。 • 如何使用nn模块中Module及functional。 • 如何选择优化器。 • 动态修改学习率参数。 5.1 核心组件 神经网络核心组件不多,把这些…

模拟调制技术详解

内容摘要 本文系统讲解模拟调制技术原理及Matlab实现,涵盖幅度调制的四种主要类型:双边带抑制载波调幅(DSB-SC)、含离散大载波调幅(AM)、单边带调幅(SSB)和残留边带调幅(…

aws(学习笔记第三十一课) aws cdk深入学习(batch-arm64-instance-type)

aws(学习笔记第三十一课) aws cdk深入学习 学习内容: 深入练习aws cdk下部署batch-arm64-instance-type 1. 深入练习aws cdk下部署batch-arm64-instance-type 代码链接 代码链接 代码链接 -> batch-arm64-instance-type之前代码学习 之前学习代码链接 -> aw…

读书报告」网络安全防御实战--蓝军武器库

一眨眼,20天过去了,刷完了这本书「网络安全防御实战--蓝军武器库」,回味无穷,整理概览如下,可共同交流读书心得。在阅读本书的过程中,我深刻感受到网络安全防御是一个综合性、复杂性极高的领域。蓝军需要掌…

生成任务,大模型

一个生成项目 输入:文字描述(但是给的数据集是一串数字,id,ct描述,医生描述) 输出:诊断报告 一、数据处理 import pandas as pd #处理表格数据pre_train_file "data/train.csv"tr…

Spring Boot API 项目中 HAProxy 与 Nginx 的选择与实践

在开发 Spring Boot 构建的 RESTful API 项目时,负载均衡和反向代理是提升性能与可用性的关键环节。HAProxy 和 Nginx 作为两种流行的工具,经常被用于流量分发,但它们各有侧重。究竟哪一个更适合你的 Spring Boot API 项目?本文将…

Java常用集合与映射的线程安全问题深度解析

Java常用集合与映射的线程安全问题深度解析 一、线程安全基础认知 在并发编程环境下,当多个线程同时操作同一集合对象时,若未采取同步措施,可能导致以下典型问题: 数据竞争:多个线程同时修改数据导致结果不可预测状…

DeepLabv3+改进6:在主干网络中添加SegNext_Attention|助力涨点

🔥【DeepLabv3+改进专栏!探索语义分割新高度】 🌟 你是否在为图像分割的精度与效率发愁? 📢 本专栏重磅推出: ✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化 ✅ 即插即用模块:ASPP+升级、解码器 PS:订阅专栏提供完整代码 目录 论文简介 步骤一 步骤二…

使用 Elastic-Agent 或 Beats 将 Journald 中的 syslog 和 auth 日志导入 Elastic Stack

作者:来自 Elastic TiagoQueiroz 我们在 Elastic 一直努力将更多 Linux 发行版添加到我们的支持矩阵中,现在 Elastic-Agent 和 Beats 已正式支持 Debian 12! 本文演示了我们正在开发的功能,以支持使用 Journald 存储系统和身份验…

3.9[A]csd

在传统CPU中心架构中,中央处理器通过内存访问外部存储器,而数据必须经过网络接口卡才能到达外部存储器。这种架构存在集中式计算、DRAM带宽和容量挑战、大量数据移动(服务器内和网络)以及固定计算导致工作负载容量增长等问题。 而…

ESP32S3读取数字麦克风INMP441的音频数据

ESP32S3 与 INMP441 麦克风模块的集成通常涉及使用 I2S 接口进行数字音频数据的传输。INMP441 是一款高性能的数字麦克风,它通过 I2S 接口输出音频数据。在 Arduino 环境中,ESP32S3 的开发通常使用 ESP-IDF(Espressif IoT Development Framew…

DeepSeek大模型 —— 全维度技术解析

DeepSeek大模型 —— 全维度技术解析 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 文章目录 DeepSeek大模型 —— 全维度技术解析一、模型架构全景解析1…

[Kubernetes] 7控制平面组件

1. 调度 kube- scheduler what 负责分配调度pod到集群节点监听kube-apiserver,查询未分配node的pod根据调度策略分配这些pod(更新pod的nodename)需要考虑的因素: 公平调度,资源有效利用,QoS,affinity, an…

PyTorch系列教程:编写高效模型训练流程

当使用PyTorch开发机器学习模型时,建立一个有效的训练循环是至关重要的。这个过程包括组织和执行对数据、参数和计算资源的操作序列。让我们深入了解关键组件,并演示如何构建一个精细的训练循环流程,有效地处理数据处理,向前和向后…

LeetCode Hot100刷题——反转链表(迭代+递归)

206.反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示例 3&#…