使用OpenCV和MediaPipe库——实现人体姿态检测
目录
准备工作如何在Windows系统中安装OpenCV和MediaPipe库?
安装Python
安装OpenCV
安装MediaPipe
验证安装
代码逻辑
整体代码
效果展示
准备工作如何在Windows系统中安装OpenCV和MediaPipe库?
安装Python
可以通过命令行运行python --version
来检查版本号。如果没有安装,可以从Python官方网站下载并安装。
安装OpenCV
-
打开命令提示符(Command Prompt)。
-
输入以下命令来安装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__)
如果打印出了版本号,安装成功。
代码逻辑
-
导入必要的库:
cv2
: OpenCV库,用于处理图像和视频。mediapipe as mp
: MediaPipe库,提供了一种简单的方法来访问先进的机器学习模型,这里用于人体姿态估计。time
: 用于时间相关的操作,比如计算FPS。
-
初始化MediaPipe姿势检测对象:
- 使用
mp_pose.Pose()
创建了一个姿势检测器对象,设置了最小检测置信度和跟踪置信度为0.5。
- 使用
-
打开摄像头获取视频流:
- 使用
cv2.VideoCapture(0)
打开默认摄像头。
- 使用
-
主循环开始:
- 在
while cap.isOpened():
循环中不断读取摄像头数据。
- 在
-
处理每一帧图像:
- 首先检查是否成功读取图像。
- 然后计算当前帧的FPS。
- 将BGR格式的图像转换为RGB格式,因为MediaPipe需要RGB格式的输入。
- 使用姿势检测器对象对图像进行处理,得到关键点位置。
-
绘制关键点和连接线:
- 如果检测到了关键点(
results.pose_landmarks
),则使用mp_drawing.draw_landmarks()
函数在图像上绘制这些关键点及其连接线。 - 可以自定义关键点和连线的颜色、粗细等属性。
- 如果检测到了关键点(
-
显示FPS信息:
- 在图像上显示当前帧的FPS值,帮助用户了解程序运行的流畅度。
-
展示结果并监听退出指令:
- 使用
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()
效果展示
相关文章:

使用OpenCV和MediaPipe库——实现人体姿态检测
目录 准备工作如何在Windows系统中安装OpenCV和MediaPipe库? 安装Python 安装OpenCV 安装MediaPipe 验证安装 代码逻辑 整体代码 效果展示 准备工作如何在Windows系统中安装OpenCV和MediaPipe库? 安装Python 可以通过命令行运行python --versio…...

JWT的学习
1、HTTP无状态及解决方案 HTTP一种是无状态的协议,每次请求都是一次独立的请求,一次交互之后就是陌生人。 以CSDN为例,先登录一次,然后浏览器退出,这个时候在进入CSDN,按理说服务器是不知道你已经登陆了&…...

elasticsearch是哪家的
Elasticsearch:数据搜索与分析的领航者 在当今这个信息爆炸的时代,快速且准确地处理海量数据成为了众多企业和组织追求的目标。而Elasticsearch正是在这个背景下脱颖而出的一款强大的开源搜索引擎。它是由位于美国加利福尼亚州的Elastic公司所开发和维护…...

《A++ 敏捷开发》- 18 软件需求
需求并不是关于需求 (Requirements are not really about requirements) 大家去公共图书馆寄存物品,以前都是扫二维码开箱,有些图书馆升级了使用指纹识别。 “是否新方法比以前好?”我问年轻的开发人员。 “当然用指纹识别好。新技术&#x…...

计算机网络:计算机网络的组成和功能
计算机网络的组成: 计算机网络的工作方式: 计算机网络的逻辑功能; 总结: 计算机网络的功能: 1.数据通信 2.资源共享 3.分布式处理:计算机网络的分布式处理是指将计算任务分散到网络中的多个节点(计算机或设备&…...

Upload-Labs-Linux 1-20
前端校验绕过:pass 01 两种思路:1.通过抓包,修改后缀 2.前端禁用js绕过前端后缀检验 首先写一个木马,改为图片格式GIF89a<?php eval($_POST[cmd])?>抓包之后改为PHP格式: 使用蚁剑连接木马,第一次尝…...
Compose笔记(八)--权限
这一节主要了解一下Compose中权限的申请,其中主要用到accompanist-permissions这个权限库,它是一个简化的Android Compose 中权限管理的库,如下使用: 栗子: 依赖添加 dependencies {implementation("com.google.accompani…...
单例模式:确保一个类只有一个实例
目录 引言 1. 单例模式的核心思想 2. 单例模式的实现方式 2.1 饿汉式单例 2.2 懒汉式单例 2.3 线程安全的懒汉式单例 2.4 双重检查锁定(Double-Checked Locking) 2.5 静态内部类实现单例 2.6 枚举实现单例 3. 单例模式的使用场景 4. 单例模式…...

推荐一个好用的在线文本对比网站 - diffchecker
推荐网址:https://www.diffchecker.com UI设计也很不错,响应也很快,广告少 生成的对比还可以生成在线链接:(点击右上角“分享”) 可设置过期时间等 我生成的示例:https://www.diffchecker.c…...
学习第八十五行
[capture](parameters) -> return_type {// function body }capture: 捕获列表,指定如何捕获周围作用域中的变量。parameters: 参数列表,与普通函数类似。return_type: 返回类型,可以省略,编译器会自动推断。function body: 函…...

基于Django创建一个WEB后端框架(DjangoRestFramework+MySQL)流程
一、Django项目初始化 1.创建Django项目 Django-admin startproject 项目名 2.安装 djangorestframework pip install djangorestframework 解释: Django REST Framework (DRF) 是基于 Django 框架的一个强大的 Web API 框架,提供了多种工具和库来构建 RESTf…...

【Python 2D绘图】Matplotlib绘图(统计图表)
【Python 2D绘图】Matplotlib绘图(统计图表) 1. 概述1.1 简介1.2 安装1.3 导入1.4 保存1.5 数据来源1.5.1 Numpy ndarray1.5.2 Pandas DataFrame 1.6 中文显示 2. 基础样式2.1 颜色2.1.1 简称2.1.2 全称 2.2 布局2.2.1 Matplotlib 画布划分2.2.2 绘制子图…...
vue3框架的响应式依赖追踪机制
当存在一个响应式变量于视图中发生改变时会更新当前组件的所以视图显示,但是没有视图中不写这个响应式变量就就算修改该变量也不会修改视图,这是为什么?我们能否可以理解宽泛的理解为vue组件的更新就是视图的更新,单当视图中不存在…...
.Net 6 上传文件接口 文件大小报错整体配置
/// <summary>/// 上传文件/// </summary>/// <param name"file"></param>/// <returns></returns>[HttpPost("UploadifyFile")][RequestSizeLimit(2000 * 1024 * 1024)] // 设置最大请求体大小为 100MBpublic async …...

Git基础之工作原理
基础概念 git本地有三个工作区域,工作目录 Working Directory,暂存区Stage/Index和资源区Repository/Git Directory,如果在加上远程的git仓库就是四个工作区域 四个区域与文件交换的命令之间的关系 WorkSpace:工作区,就…...

小程序 wxml 语法 —— 41列表渲染 - 进阶用法
这一节讲解列表渲染的两个进阶用法: 如果需要对默认的变量名和下标进行修改,可以使用 wx:for-item 和 wx:for-item: 使用 wx:for-item 可以指定数组当前元素的变量名使用 wx:for-index 可以指定数组当前下标的变量名 将 wx:for 用在 标签上&…...
ElasticSearch 入门教程
ElasticSearch 入门教程 ElasticSearch 是一个分布式、可扩展的搜索和分析引擎,基于 Apache Lucene 构建,支持全文检索、结构化查询和聚合分析。本教程将带你深入了解 ElasticSearch 的核心概念、安装配置、常见操作,并提供示例代码…...

用Python写一个算24点的小程序
一、运行界面 二、显示答案——递归介绍 工作流程: 1. 基本情况:函数首先检查输入的数字列表 nums 的长度。如果列表中只剩下一个数字,它会判断这个数字是否接近 24(使用 abs(nums[0] - 24) < 1e-10 来处理浮点数精度问题&…...
分布式网络
分布式网络(Distributed Network)指的是一种计算机网络架构,其中计算资源(计算、存储、数据处理等)分布在多个物理或逻辑上的节点上,而不是集中在单一的服务器或数据中心中。这种架构的主要目标是提高系统的…...

忘记dedecms后台超级管理员账号和密码的解决方案
解决方案: 方案一、数据库修改: 1、前提是您能登录到数据库后台,登录MySQL数据库管理工具(如phpMyAdmin) 2、打开数据库中的 dede_admin 表,找到管理员记录,将 pwd 字段的值改成 f297a57a5a7…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...