python机器学习:Mediapipe-手势识别(附具体代码)

Mediapipe

Mediapipe 是一个由 Google 开发的开源框架,用于构建多模态应用的机器学习管道。它提供了一系列预训练模型和工具,使得开发者可以更容易地在各种平台上实现复杂的感知功能,如手势识别、面部追踪、人体姿态估计等。Mediapipe 的主要特点包括:

  1. 跨平台支持:Mediapipe 支持多种操作系统(如 Windows, Linux, macOS)以及移动设备(Android 和 iOS),并且可以通过 WebAssembly 在浏览器中运行。

  2. 高效的实时处理:通过优化的算法和并行计算技术,Mediapipe 能够实现实时的视频流处理,这对于需要快速响应的应用场景非常重要。

  3. 易于使用的 API:提供了 Python 和 C++ 接口,让开发者能够方便地集成到自己的项目中。

  4. 丰富的示例库:包含了大量的示例代码,涵盖了从基础的手势检测到复杂的人脸网格生成等多种应用场景。

  5. 灵活的组件化设计:允许用户自定义或扩展现有的 ML 管道,以适应特定的需求。

  6. 强大的可视化工具:内置了可视化工具,可以帮助开发者调试和展示模型的工作过程。

Mediapipe 在计算机视觉领域尤其受欢迎,因为它简化了许多高级任务的开发流程,比如手部追踪、面部识别、身体姿势估计等。此外,Mediapipe 也支持音频处理,使其成为多媒体应用开发的强大工具。

cvzone

cvzone 是一个基于 OpenCV 的 Python 库,它提供了一系列易于使用的函数和工具,使得在计算机视觉项目中实现某些功能变得更加简单。cvzone 旨在简化一些常见的计算机视觉任务,如手部追踪、姿态估计、颜色检测等,并且它还包含了一些预构建的功能,比如游戏开发中的图像处理、图形用户界面(GUI)元素的创建等。

cvzone 库通常与 MediaPipe 库一起使用,cvzone 利用了 MediaPipe 提供的一些高级功能,例如手部和身体姿态估计,然后将其封装成更加直观易用的形式。

cvzone 的主要特点包括:

  • 手部追踪:可以轻松地检测并跟踪视频流中的手部动作。
  • 姿态估计:能够识别视频或图像中的人体姿态,包括关键点的位置。
  • 面部检测:提供面部特征点检测的能力。
  • 颜色检测:帮助检测图像中特定的颜色区域。
  • 虚拟画笔:允许用户通过摄像头作为输入设备进行绘画。
  • 游戏开发:提供了一些游戏开发相关的功能,如碰撞检测、游戏逻辑等。
  • 图形用户界面:可以创建简单的 GUI 元素,如按钮、滑块等,直接在图像上操作。

手势识别代码:

import math  # 导入数学库,虽然在本段代码中未直接使用
import random  # 导入随机数库,虽然在本段代码中未直接使用
import cvzone  # 导入cvzone库,用于简化OpenCV操作
import cv2  # 导入OpenCV库,用于处理图像和视频
import numpy as np  # 导入NumPy库,用于数值计算

# 从cvzone导入HandDetector类,用于手部检测
from cvzone.HandTrackingModule import HandDetector

# 初始化摄像头
cap = cv2.VideoCapture(0)  # 打开默认摄像头(索引0)
if not cap.isOpened():  # 检查摄像头是否成功打开
    print("Error: Could not open camera.")
    exit()  # 如果不能打开摄像头则退出程序

# 设置视频流的分辨率
cap.set(3, 1280)  # 设置宽度为1280像素
cap.set(4, 720)   # 设置高度为720像素

# 创建一个HandDetector对象,设置检测置信度为0.8,最多追踪一只手
detector = HandDetector(detectionCon=0.8, maxHands=1)

try:
    while True:  # 开始无限循环以持续读取帧
        success, img = cap.read()  # 从摄像头读取一帧图像
        if not success:  # 如果读取失败
            print("Failed to grab frame")
            break  # 退出循环

        # 水平翻转图像,使得看起来更自然(镜像效果)
        img = cv2.flip(img, 1)
        
        # 使用handDetector检测手部,并将结果绘制在图像上
        hands, img = detector.findHands(img, flipType=False)
        # 如果想不绘制手部关键点和连接线
        #hands, img = detector.findHands(img, draw=False, flipType=False)

        if hands:  # 如果检测到了手
            lmList = hands[0]['lmList']  # 获取第一只手的关键点列表
            # 确保关键点列表中有足够的元素后,获取食指指尖位置
            #lmList[8][0:2] 提取了这个关键点的x和y坐标
            pointIndex = lmList[8][0:2] if len(lmList) > 8 else None
            
            # 在这里可以添加更多逻辑来利用pointIndex做其他事情

        # 显示带有手部标记的图像
        cv2.imshow("Image", img)

        # 检查是否有按键按下,且该键是'q',如果是则退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
finally:
    # 释放摄像头资源并关闭所有OpenCV窗口
    cap.release()
    cv2.destroyAllWindows()

 具体解释:

在手部关键点检测中,每个手通常会被识别为一系列的关键点(landmarks),这些关键点代表了手的不同部分。cvzoneHandDetector 模块遵循一个标准的21个关键点的手部模型,这些点覆盖了手掌和五个手指的主要关节。

这21个关键点按照以下顺序编号:

  • 0: 手腕 (Wrist)
  • 1-4: 大拇指 (Thumb) - 从根部到指尖
  • 5-8: 食指 (Index finger) - 从根部到指尖
  • 9-12: 中指 (Middle finger) - 从根部到指尖
  • 13-16: 无名指 (Ring finger) - 从根部到指尖
  • 17-20: 小指 (Pinky) - 从根部到指尖

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值