使用OpenCV和MediaPipe库——驼背检测(姿态监控)

目录

驼背检测的运用

1. 驾驶姿态与疲劳关联分析

2. 行业应用案例

1. 教育场景痛点分析

2. 智能教室系统架构

代码实现思路

1. 初始化与配置

2. MediaPipe和摄像头设置

3. 主循环

4. 资源释放

RGB与BGR的区别

一、本质区别

二、OpenCV的特殊性

内存结构示意图:

三、转换必要性分析

转换流程图示:

四、常见问题场景

五、性能优化建议

六、底层原理

七、验证实验

八、现代发展趋势

整体代码

效果展示


驼背检测的运用

1. 驾驶姿态与疲劳关联分析
  • 生理机制:驼背姿势会压迫胸腔,减少氧气摄入量,加速疲劳感产生(研究显示,不良坐姿使疲劳出现时间提前30%)

  • 典型场景

    • 长途货运司机连续驾驶超过2小时后,脊柱弯曲度增加15-20度

    • 夜间驾驶时,50%的司机出现头部前倾超过安全阈值

2. 行业应用案例
  • 沃尔沃S90:配备驾驶员姿态监测系统,当检测到持续不良姿势时,自动调节座椅支撑

  • 滴滴出行:试点运用AI姿势评估,对连续工作超8小时的司机强制休息

1. 教育场景痛点分析
问题维度传统方式缺陷姿态监控解决方案
实时反馈教师无法持续关注每个学生智能课桌每15分钟震动提醒
数据追踪家长会依赖主观描述生成每周姿势分析报告
习惯养成被动式口头教育AR游戏化矫正训练
2. 智能教室系统架构
graph TDA[3D摄像头矩阵] --> B(骨骼关键点提取)B --> C{脊柱曲度分析}C -->|异常| D[课桌触觉反馈]C -->|持续异常| E[教师端预警]C --> F[云端健康档案]F --> G[家长可视化终端]

代码实现思路

1. 初始化与配置

        先导库,包括OpenCV(用于图像处理)、MediaPipe(用于人体姿势估计)、csv(用于日志记录)、datetime和time(用于时间相关操作)等。然后再定义一些全局变量和参数,比如POSTURE_THRESHOLD(头部前倾判断阈值)、ALARM_COLOR(警报颜色)、ALARM_SOUND(警报声音文件路径)等。最后还初始化了一个CSV文件用于记录姿势数据。

2. MediaPipe和摄像头设置

        使用MediaPipe的Pose解决方案初始化姿势估计器,并设置摄像头为默认设备。这里设置了姿势检测和跟踪的置信度阈值(大家可以自行调整,我完整代码中给出的是我个人认为比较好的参数,但是可能由于摄像头不同的角度等问题会导致不同的结论,所以可以自己调一调),以调整灵敏度。

3. 主循环

主循环负责持续从摄像头读取视频帧,然后进行以下操作:

  • 图像预处理:将BGR格式的图像转换为RGB格式供MediaPipe处理,并禁用图像写入权限以提高效率。

  • 姿势估计:通过MediaPipe获取当前帧中的人体关键点位置。如果成功检测到关键点,则计算耳朵、肩膀和髋部的平均Y坐标(垂直位置),以此作为评估姿势的基础。

  • 姿势状态判断:基于耳肩高度差和肩髋高度差来判断用户是否处于不良姿势状态。如果满足特定条件(例如头部前倾超过一定阈值且没有弯腰动作),则认为姿势不正确。

  • 绘制和显示:根据姿势状态,在图像上绘制相应的视觉反馈(如连线的颜色变化或警示边框)。同时,也在图像上显示一些实时信息,如耳肩和肩髋的高度差。

  • 警报:当检测到不良姿势时,会播放音频警报,并确保警报不会过于频繁地播放。

  • 数据记录:将每个帧的姿势数据(包括时间戳、耳肩差、肩髋差和姿势状态)记录到CSV文件中。

4. 资源释放

        当你想程序结束时,按下Q键退出(英文状态下按下Q不然不行),释放摄像头资源并关闭所有OpenCV窗口。


RGB与BGR的区别

        RGB和BGR是两种不同的颜色通道排列方式,它们的核心区别在于颜色分量的顺序不同。以下是详细的技术解析:

一、本质区别

特性RGBBGR
通道顺序Red-Green-BlueBlue-Green-Red
内存布局[R,G,B][B,G,R]
典型应用领域大部分图像处理库OpenCV默认格式

二、OpenCV的特殊性

# OpenCV的历史设计决策
cv2.imread() → BGR格式
cv2.imshow() → 期待BGR输入
内存结构示意图:
BGR像素布局 → | B | G | R | B | G | R | ... 
RGB像素布局 → | R | G | B | R | G | B | ...

三、转换必要性分析

在代码中出现的两次转换:

image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # ← 转换1:给MediaPipe
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)  # ← 转换2:回显准备
转换流程图示:
摄像头原始帧(BGR)↓ 转换1
MediaPipe处理格式(RGB)↓ 算法处理↓ 转换2
OpenCV显示格式(BGR)

四、常见问题场景

  1. 颜色显示异常

    # 错误示例:直接显示未转换的MediaPipe结果
    cv2.imshow('错误演示', results_image)  # 会出现颜色失真

  2. 跨库兼容问题

    matplotlib.pyplot.imshow(cv2_image)  # 需要先做BGR→RGB转换

五、性能优化建议

# 原始代码
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image.flags.writeable = False  # ← 优化点:禁止写入加速处理
results = pose.process(image)# 高级优化方案(使用numpy视图):
rgb_image = image[..., ::-1]  # BGR→RGB通过数组倒序实现

六、底层原理

OpenCV使用BGR的根本原因可追溯到:

  1. 早期相机传感器的硬件设计

  2. Windows系统显示驱动的历史遗留问题

  3. 与Intel图像处理库(IPP)的兼容性

七、验证实验

# 颜色通道分离验证
b, g, r = cv2.split(bgr_image)
print(r[0,0], g[0,0], b[0,0])  # 输出顺序为BGRr, g, b = cv2.split(rgb_image)
print(r[0,0], g[0,0], b[0,0])  # 输出顺序为RGB

八、现代发展趋势

技术方向说明
硬件加速转换GPU直接处理颜色空间转换
自动格式检测智能识别输入图像的颜色空间
统一颜色标准DCI-P3等广色域标准的普及应用

整体代码

# 导入所需库
import cv2  # OpenCV库,用于图像处理和摄像头操作
import mediapipe as mp  # MediaPipe库,提供人体姿势识别模型
import csv  # 用于CSV文件读写
import datetime  # 生成时间戳
import time  # 时间相关操作
import numpy as np  # 数值计算(虽然代码中未直接使用)
from playsound import playsound  # 播放音频文件# 初始化MediaPipe组件
mp_pose = mp.solutions.pose
mp_drawing = mp.solutions.drawing_utils  # 绘制姿势关键点和连线的工具# 摄像头初始化(0表示默认摄像头)
cap = cv2.VideoCapture(0)# ================== 全局配置参数 ==================
POSTURE_THRESHOLD = -0.255  # 头部前倾判断阈值(需根据实际情况调整)
ALARM_COLOR = (0, 0, 255)  # 警报显示颜色(BGR格式-红色)
NORMAL_COLOR = (0, 255, 0)  # 正常状态颜色(BGR格式-绿色)
ALARM_SOUND = "alert.wav"  # 警报音效文件路径
LOG_FILE = "posture_log.csv"  # 日志文件名# 初始化CSV日志文件(带异常处理)
try:with open(LOG_FILE, 'w', newline='') as f:csv.writer(f).writerow(['Timestamp',           # 时间戳'EarShoulderDiff',      # 耳-肩垂直差值'ShoulderHipDiff',     # 肩-髋垂直差值'PostureStatus'         # 姿势状态(True/False)])
except Exception as e:print(f"文件初始化失败: {str(e)}")last_play_time = 0  # 记录上次播放警报的时间(用于防止重复播放)# 校准相关变量(代码中暂未实现完整校准逻辑)
calibration_values = []      # 存储校准数据
start_calibration = time.time()  # 校准开始时间# ================== 主处理流程 ==================
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:  # 摄像头读取失败处理break# ============= 图像预处理 =============try:image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 转换颜色空间(MediaPipe需要RGB格式)image.flags.writeable = False  # 设为只读以提高处理效率results = pose.process(image)  # 使用MediaPipe处理图像获取姿势数据image.flags.writeable = Trueimage = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)  # 转换回BGR格式供OpenCV显示except Exception as e:print(f"图像处理异常: {str(e)}")continue# 初始化姿势状态变量posture_status = Falseear_shoulder_diff = 0.0shoulder_hip_diff = 0.0if results.pose_landmarks:  # 如果检测到姿势关键点try:# ========== 关键点坐标获取 ==========landmarks = results.pose_landmarks.landmark# 定义安全获取关键点平均值的函数def get_landmark_avg(landmark1, landmark2):"""获取两个关键点Y坐标的平均值(归一化坐标)"""try:return (landmark1.y + landmark2.y) / 2except:return 0.0  # 异常时返回默认值# 计算各身体部位的平均Y坐标(归一化坐标,原点在图像左上角)ear_y = get_landmark_avg(landmarks[mp_pose.PoseLandmark.LEFT_EAR],landmarks[mp_pose.PoseLandmark.RIGHT_EAR])shoulder_y = get_landmark_avg(landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER],landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER])hip_y = get_landmark_avg(landmarks[mp_pose.PoseLandmark.LEFT_HIP],landmarks[mp_pose.PoseLandmark.RIGHT_HIP])# ========== 姿势参数计算 ==========ear_shoulder_diff = float(ear_y - shoulder_y)   # 耳肩高度差(正值表示头部前倾)shoulder_hip_diff = float(shoulder_y - hip_y)   # 肩髋高度差# ========== 姿势状态判断 ==========# 判断条件:# 1. 耳肩高度差超过阈值(头部前倾)# 2. 肩髋高度差绝对值小于0.5(排除弯腰动作)posture_status = bool((ear_shoulder_diff > POSTURE_THRESHOLD) and(abs(shoulder_hip_diff) < 0.62))# ========== 姿势关键点绘制 ==========mp_drawing.draw_landmarks(image,results.pose_landmarks,mp_pose.POSE_CONNECTIONS,  # 绘制关键点连线landmark_drawing_spec=mp_drawing.DrawingSpec(color=ALARM_COLOR if posture_status else NORMAL_COLOR,thickness=2  # 关键点连线粗细))# ========== 警报处理逻辑 ==========if posture_status:# 绘制红色警示边框cv2.rectangle(image, (0, 0),(image.shape[1] - 1, image.shape[0] - 1),ALARM_COLOR, 10)# 添加警示文字cv2.putText(image, "POSTURE WARNING!", (50, 50),cv2.FONT_HERSHEY_SIMPLEX, 1, ALARM_COLOR, 3)# 播放警报音效(2秒间隔)try:current_time = time.time()if current_time - last_play_time > 2:playsound(ALARM_SOUND)last_play_time = current_timeexcept Exception as e:print(f"声音警报错误: {str(e)}")except (KeyError, AttributeError) as e:print(f"关键点处理错误: {str(e)}")continue  # 跳过当前帧处理# ========== 数据记录模块 ==========try:timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]  # 精确到毫秒with open(LOG_FILE, 'a', newline='') as f:csv.writer(f).writerow([str(timestamp),f"{ear_shoulder_diff:.4f}",   # 保留4位小数f"{shoulder_hip_diff:.4f}",str(posture_status)])except Exception as e:print(f"数据记录错误: {str(e)}")# ========== 界面显示模块 ==========try:# 显示实时参数cv2.putText(image,f"Ear-Shoulder: {ear_shoulder_diff:.3f}",(10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 0), 2)cv2.putText(image,f"Shoulder-Hip: {shoulder_hip_diff:.3f}",(10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 0), 2)# 显示状态指示cv2.putText(image,f"Status: {'WARNING' if posture_status else 'NORMAL'}",(10, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.6,ALARM_COLOR if posture_status else NORMAL_COLOR, 2)except Exception as e:print(f"界面渲染错误: {str(e)}")# 显示处理后的图像cv2.imshow('Posture Correction', image)# 按Q键退出if cv2.waitKey(1) & 0xFF == ord('q'):break# ================== 资源释放 ==================
cap.release()  # 释放摄像头
cv2.destroyAllWindows()  # 关闭所有OpenCV窗口

效果展示

驼背检测

       

总结,多学多看多练。

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

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

相关文章

网络版汉译英服务(muduo)

文章目录 网络版汉译英服务&#xff08;muduo&#xff09;muduo库muduo 库是什么muduo 库常见接口介绍muduo::net::EventLoopmuduo::net::TcpConnectionmuduo::net::TcpServermuduo::net::TcpClientmuduo::net::Buffer 汉译英服务服务端客户端 网络版汉译英服务&#xff08;mud…

“此电脑”中删除WPS云盘方法(百度网盘通用)

&#x1f4e3;此方法适用于卸载WPS云盘后&#xff0c;WPS云盘图标依然在此电脑中显示的问题。 原理&#xff1a;通过注册来进行删除 步骤&#xff1a; WIN键R,打开运行窗口&#xff0c;输入regedit命令&#xff0c;来打开【注册表编辑器】&#xff1b; 从左侧&#xff0c;依…

在ArcMap中通过Python编写自定义工具(Python Toolbox)实现点转线工具

文章目录 一、需求二、实现过程2.1、创建Python工具箱&#xff08;.pyt&#xff09;2.2、使用catalog测试代码2.3、在ArcMap中使用工具 三、测试 一、需求 通过插件的形式将点转线功能嵌入ArcMap界面&#xff0c;如何从零开始创建一个插件&#xff0c;包括按钮的添加、工具的实…

Cursor 使用经验,一个需求开发全流程

软件开发中 Cursor 的使用经验成为关注焦点&#xff0c;尤其是处理大型数据集的需求。用户提到“Cursor 使用经验&#xff0c;一个需求开发全流程”&#xff0c;但“Cursor”可能指数据库游标&#xff0c;涉及逐行处理数据。本文将详细探讨开发一个需求的完整流程&#xff0c;包…

selenium库

一、什么是selenium库&#xff1f; selenim是一个用于Web应用程序自动化测试工具&#xff0c;selenium测试直接运行在浏览器中 像真正的用户在操作一样&#xff0c;驱动浏览器执行特定的动作&#xff0c;如点击&#xff0c;下拉等操作 二、selenium在爬虫中的应用 获取动态…

[密码学实战]Java实现国密TLSv1.3单向认证

一、代码运行结果 1.1 运行环境 1.2 运行结果 1.3 项目架构 二、TLS 协议基础与国密背景 2.1 TLS 协议的核心作用 TLS(Transport Layer Security) 是保障网络通信安全的加密协议,位于 TCP/IP 协议栈的应用层和传输层之间,提供: • 数据机密性:通过对称加密算法(如 AE…

## DeepSeek写水果记忆配对手机小游戏

DeepSeek写水果记忆配对手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端水果记忆配对小游戏H5文件&#xff1a; 要求 可以重新开始游戏 可以暂停游戏 卡片里的水果…

【愚公系列】《Python网络爬虫从入门到精通》045-Charles的SSL证书的安装

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…

夸父工具箱(安卓版) 手机超强工具箱

如今&#xff0c;人们的互联网活动日益频繁&#xff0c;导致手机内存即便频繁清理&#xff0c;也会莫名其妙地迅速填满&#xff0c;许多无用的垃圾信息悄然占据空间。那么&#xff0c;如何有效应对这一难题呢&#xff1f;答案就是今天新推出的这款工具软件&#xff0c;它能从根…

探秘Transformer系列之(11)--- 掩码

探秘Transformer系列之&#xff08;11&#xff09;— 掩码 文章目录 探秘Transformer系列之&#xff08;11&#xff09;--- 掩码0x00 概述0x01 需求1.1 避免偏差实际情况问题所在解决方案 1.2 防止偷看实际情况问题所在解决方案 0x02 Padding Mask2.1 逻辑掩码矩阵计算注意力步…

使用MPU6050产生中断,唤醒休眠中的STM32

本篇文章源码&#xff1a;STM32L431_RT_Thread_PM_mpu6050_wakeup: 使用MPU6050产生中断&#xff0c;唤醒休眠中的STM32L4 书接上回【笔记】STM32L4系列使用RT-Thread Studio电源管理组件&#xff08;PM框架&#xff09;实现低功耗-CSDN博客 上一篇文章使用PA0外接一个按键实…

国产编辑器EverEdit - 宏功能介绍

1 宏 1.1 应用场景 宏是一种重复执行简单工作的利器&#xff0c;可以让用户愉快的从繁琐的工作中解放出来&#xff0c;其本质是对键盘和菜单的操作序列的录制&#xff0c;并不会识别文件的内容&#xff0c;属于无差别无脑执行。 特别是对一些有规律的重复按键动作&#xff0c;…

ubuntu22.04安装P104-100一些经验(非教程)

一、版本&#xff1a; 系统&#xff1a;ubuntu-22.04.5-desktop-amd64.iso Nvidia 驱动&#xff1a;NVIDIA-Linux-x86_64-570.124.04.run。官网下载即可 二、经验 1、通用教程⭐ 直接关键词搜“ubuntu p104”会有一些教程&#xff0c;比如禁用nouveau等 安装参考&#xff1a…

后智能体时代的LLM和Agent

文章目录 1. 关于AI重塑的哲学体系2. 关于AI大模型体系的认知3. 关于AI大模型体系的畅想4. 关于人和AI大模型体系的共处5. 写在最后 随着OpenAI、Deepseek、Manus等等智能体的爆火&#xff0c;人们茶前饭后、插科打诨的话题都离不开这些智能体&#xff0c;现状也正如《人民日报…

Denoising Diffusion Probabilistic Models

这篇文章就是所谓的DDPM 前向扩散过程之和前一步有关&#xff0c;是一阶马尔可夫链&#xff0c;是图像和标准高斯噪声I的加权&#xff0c;认为方差全部来自I&#xff0c;并且多步可以通过连乘合并为一步&#xff1a; 反向的过程也是类似的形式&#xff1a; 并且由贝叶斯公式&am…

【DeepSeek】5分钟快速实现本地化部署教程

一、快捷部署 &#xff08;1&#xff09;下载ds大模型安装助手&#xff0c;下载后直接点击快速安装即可。 https://file-cdn-deepseek.fanqiesoft.cn/deepseek/deepseek_28348_st.exe &#xff08;2&#xff09;打开软件&#xff0c;点击立即激活 &#xff08;3&#xff09;选…

mac本地安装运行Redis-单机

记录一下我以前用的连接服务器的跨平台SSH客户端。 因为还要准备毕设...... 服务器又过期了&#xff0c;只能把redis安装下载到本地了。 目录 1.github下载Redis 2.安装homebrew 3.更新GCC 4.自行安装Redis 5.通过 Homebrew 安装 Redis 安装地址&#xff1a;https://git…

GCC RISCV 后端 -- GCC Passes 注释

在前面文章提到&#xff0c;当GCC 前端完成对C源代码解析完成后&#xff0c;就会使用 处理过程&#xff08;Passes&#xff09;机制&#xff0c;通过一系列的处理过程&#xff0c;将 GENERIC IR 表示的C程序 转步转换成 目标机器的汇编语言。过程描述如下图所示&#xff1a; 此…

OSPF的各种LSA类型,多区域及特殊区域

一、OSPF的LSA类型 OSPF&#xff08;开放最短路径优先&#xff09;协议使用多种LSA&#xff08;链路状态通告&#xff09;类型来交换网络拓扑信息。以下是主要LSA类型的详细分类及其作用&#xff1a; 1. Type 1 LSA&#xff08;路由器LSA&#xff09; 生成者&#xff1a;每个…

UV,纹理,材质,对象

先上代码&#xff1a; Shader "Unlit/MyFirstShder" {Properties{_MainTex ("Texture", 2D) "white" {}}SubShader{Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex …