当前位置: 首页 > news >正文

计算机视觉(opencv)——基于 MediaPipe 的手势识别系统


基于 MediaPipe 与 OpenCV 的手势识别系统实现详解

在计算机视觉和人机交互领域,手势识别是一项非常重要的技术。它使得计算机能够通过摄像头识别人类手部动作,从而实现自然交互。例如,虚拟鼠标控制、手势命令控制、游戏互动等,都依赖于精准的手势检测与识别。
本文将通过 Python + OpenCV + MediaPipe 的方式,详细讲解一个能够实时识别手势(0~10)的系统实现原理与代码结构。


一、系统原理概述

手势识别的核心在于:

  1. 检测手部关键点(如手指、掌心、手腕等位置);

  2. 通过关键点之间的距离关系判断手指是否伸展或弯曲

  3. 根据手指伸展数量映射为具体的数字或手势

Google 的 MediaPipe 提供了高精度的手部检测与关键点跟踪模型,可实时返回 21 个关键点坐标。我们可以基于这些坐标信息,计算手指弯曲程度,从而判断出用户展示的手势。


二、所需库与环境

本项目需要以下 Python 库:

pip install opencv-python mediapipe
  • OpenCV:用于图像采集与显示;

  • MediaPipe:用于手部检测与关键点识别;

  • NumPy:用于数学计算(本例中可选)。


三、完整代码实现

import cv2
import mediapipe as mp# 手势标签定义(0~10)
gesture = ["none", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
flag = 0# 初始化 MediaPipe 模块
mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands# 手部检测器配置
hands = mp_hands.Hands(static_image_mode=False,          # 视频流模式max_num_hands=2,                  # 最多检测两只手min_detection_confidence=0.75,    # 检测置信度阈值min_tracking_confidence=0.75)     # 跟踪置信度阈值# 打开摄像头
cap = cv2.VideoCapture(0)while True:flag = 0ret, frame = cap.read()frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)frame = cv2.flip(frame, 1)  # 镜像翻转results = hands.process(frame)frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)# 如果检测到手部if results.multi_hand_landmarks:for hand_landmarks in results.multi_hand_landmarks:# 取若干关键点的坐标p0_x = hand_landmarks.landmark[0].xp0_y = hand_landmarks.landmark[0].yp5_x = hand_landmarks.landmark[5].xp5_y = hand_landmarks.landmark[5].y# 基准距离(大拇指根部到掌心距离)distance_0_5 = pow(p0_x - p5_x, 2) + pow(p0_y - p5_y, 2)base = distance_0_5 / 0.6# 获取其他指尖关键点p4_x, p4_y = hand_landmarks.landmark[4].x, hand_landmarks.landmark[4].yp8_x, p8_y = hand_landmarks.landmark[8].x, hand_landmarks.landmark[8].yp12_x, p12_y = hand_landmarks.landmark[12].x, hand_landmarks.landmark[12].yp16_x, p16_y = hand_landmarks.landmark[16].x, hand_landmarks.landmark[16].yp20_x, p20_y = hand_landmarks.landmark[20].x, hand_landmarks.landmark[20].y# 计算各指尖到手腕的平方距离distance_5_4 = pow(p5_x - p4_x, 2) + pow(p5_y - p4_y, 2)distance_0_8 = pow(p0_x - p8_x, 2) + pow(p0_y - p8_y, 2)distance_0_12 = pow(p0_x - p12_x, 2) + pow(p0_y - p12_y, 2)distance_0_16 = pow(p0_x - p16_x, 2) + pow(p0_y - p16_y, 2)distance_0_20 = pow(p0_x - p20_x, 2) + pow(p0_y - p20_y, 2)# 判断手指是否伸直if distance_0_8 > base: flag += 1   # 食指if distance_0_12 > base: flag += 1  # 中指if distance_0_16 > base: flag += 1  # 无名指if distance_0_20 > base: flag += 1  # 小指if distance_5_4 > base * 0.3: flag += 1  # 拇指if flag >= 10: flag = 10# 绘制关键点mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)# 显示识别结果cv2.putText(frame, gesture[flag], (50, 50), 0, 1.3, (0, 0, 255), 3)cv2.imshow('MediaPipe Hands', frame)# 按 ESC 退出if cv2.waitKey(1) & 0xFF == 27:breakcap.release()
cv2.destroyAllWindows()

四、算法逻辑详解

该程序的核心逻辑可以分为以下几个步骤:

1. 摄像头帧采集

使用 cv2.VideoCapture(0) 读取实时视频流,并进行逐帧处理。

2. 手部检测与关键点提取

通过 hands.process(frame),MediaPipe 会自动检测手部位置,并返回 21 个关键点坐标。
这些关键点在手部不同部位,如:

编号名称(英文)中文说明所属手指
0WRIST手腕(连接手臂)——
1THUMB_CMC拇指掌骨基部拇指
2THUMB_MCP拇指第一关节(掌指关节)拇指
3THUMB_IP拇指第二关节(指间关节)拇指
4THUMB_TIP拇指指尖拇指
5INDEX_FINGER_MCP食指根部(掌指关节)食指
6INDEX_FINGER_PIP食指中部关节食指
7INDEX_FINGER_DIP食指末端关节食指
8INDEX_FINGER_TIP食指指尖食指
9MIDDLE_FINGER_MCP中指根部中指
10MIDDLE_FINGER_PIP中指中部关节中指
11MIDDLE_FINGER_DIP中指末端关节中指
12MIDDLE_FINGER_TIP中指指尖中指
13RING_FINGER_MCP无名指根部无名指
14RING_FINGER_PIP无名指中部关节无名指
15RING_FINGER_DIP无名指末端关节无名指
16RING_FINGER_TIP无名指指尖无名指
17PINKY_MCP小指根部小指
18PINKY_PIP小指中部关节小指
19PINKY_DIP小指末端关节小指
20PINKY_TIP小指指尖小指

3. 距离计算与手势判断

通过比较各指尖与手腕(或掌根)的相对距离,判断该手指是否伸直。
例如:

  • distance_0_8 > base,说明食指伸直;

  • distance_0_12 > base,说明中指伸直;

  • 若四根手指均满足条件,且拇指距离也大,则识别为“5”。

4. 手势编号与映射

程序维护一个手势数组:

gesture = ["none", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]

根据检测到的手指数量 flag,直接映射为相应的手势名称。


五、效果展示与扩展

运行程序后,摄像头窗口会实时显示手部关键点与骨架线。当你伸出不同数量的手指时,左上角的文本会显示相应的数字(如 “three”、“five” 等)。

示例效果:

手势识别结果描述
none全部弯曲
☝️one伸出食指
✌️two食指+中指
🖐five全部伸展

六、改进与优化方向

  1. 引入深度信息
    当前算法仅基于二维坐标,容易受角度影响。可利用深度相机或双目视觉增强鲁棒性。

  2. 增加动态手势识别
    结合时间序列(如 LSTM 网络)可识别挥手、比划等动作。

  3. 加入多手识别与左右手分类
    通过 results.multi_handedness 可判断是左手还是右手,扩展为更复杂的交互。

  4. 与应用系统结合
    例如将手势映射为鼠标点击、音量调节、虚拟键盘输入等功能。


七、总结

本文展示了一个基于 MediaPipe + OpenCV 的实时手势识别系统。
通过检测手部 21 个关键点并计算距离关系,我们能够识别从“0”到“10”的静态手势。
该系统具有 实时性强、部署简单、可扩展性高 的优点,非常适合作为入门级手势识别项目或交互式系统原型。

未来可以结合深度学习模型(如 CNN + LSTM)实现更复杂的手势分类与动作识别,推动自然人机交互的发展。

http://www.dtcms.com/a/474862.html

相关文章:

  • 免费建网站代码网站登录超时怎么解决
  • 网站开发与管理对应的职业及岗位眉县网站开发
  • 网站建设销售求职东莞建设网住房保障专栏20批公示栏
  • 传统文本特征提取三巨头:TF-IDF、Word2Vec与FastText的深度对比
  • 网站开发怎么拉客户揭阳网站建设价格
  • 网站建设心得.doc网页架构
  • css `scrollbar-width` 渲染一个细滚动条甚至隐藏它,同时保持区域可滚动
  • 西安做网站的价格外贸网站宗旨
  • 晋江外贸网站开发国内精自视频品线一区
  • 网站模版的软件做网站一般注册哪几类商标
  • Golang 项目中使用 Swagger
  • 电子科技东莞网站建设百度经验实用生活指南
  • 网站私信界面站长之家seo查找
  • 领略算法真谛:求组合数
  • 企业网站建设费用会计科目哪些网站可以免费看剧
  • 自己做单词卡的网站是什么广州市外贸网站建设品牌
  • 【强化学习】#10 Actor-Critic:从QAC到A3C/A2C
  • 存储栈学习笔记
  • 廊坊网站快速排名优化域名更换网站
  • 个人网站制作程序南昌地宝网租房信息网
  • 一流的龙岗网站设计内网建设网站
  • 大连网站建设服务东莞营销网站建设价格
  • 外贸网站做多少钱的4399影视在线观看免费高清
  • 网站层级关系装修平台网站有哪些
  • 【完整源码+数据集+部署教程】 落叶植物叶片分类系统源码和数据集:改进yolo11-LVMB
  • 公司网站宣传设计方案本地最新招聘信息
  • 茶叶网站flash模板免费下载wordpress开发的网站有哪些
  • wordpress ajax 注册个人做seo怎么赚钱
  • seata原理源码分析(二)事务模式-TCC(一) 织入拦截器,rpc,资源分析
  • 网站建设创意广告苏州北京网站建设