Mediapipe
Mediapipe 是一个由 Google 开发的开源框架,用于构建多模态应用的机器学习管道。它提供了一系列预训练模型和工具,使得开发者可以更容易地在各种平台上实现复杂的感知功能,如手势识别、面部追踪、人体姿态估计等。Mediapipe 的主要特点包括:
-
跨平台支持:Mediapipe 支持多种操作系统(如 Windows, Linux, macOS)以及移动设备(Android 和 iOS),并且可以通过 WebAssembly 在浏览器中运行。
-
高效的实时处理:通过优化的算法和并行计算技术,Mediapipe 能够实现实时的视频流处理,这对于需要快速响应的应用场景非常重要。
-
易于使用的 API:提供了 Python 和 C++ 接口,让开发者能够方便地集成到自己的项目中。
-
丰富的示例库:包含了大量的示例代码,涵盖了从基础的手势检测到复杂的人脸网格生成等多种应用场景。
-
灵活的组件化设计:允许用户自定义或扩展现有的 ML 管道,以适应特定的需求。
-
强大的可视化工具:内置了可视化工具,可以帮助开发者调试和展示模型的工作过程。
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),这些关键点代表了手的不同部分。cvzone
的 HandDetector
模块遵循一个标准的21个关键点的手部模型,这些点覆盖了手掌和五个手指的主要关节。
这21个关键点按照以下顺序编号:
- 0: 手腕 (Wrist)
- 1-4: 大拇指 (Thumb) - 从根部到指尖
- 5-8: 食指 (Index finger) - 从根部到指尖
- 9-12: 中指 (Middle finger) - 从根部到指尖
- 13-16: 无名指 (Ring finger) - 从根部到指尖
- 17-20: 小指 (Pinky) - 从根部到指尖