回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页
best-icon

基于行空板的mediapipe手势识别与追踪 简单

头像 虚怀若谷 2024.04.29 169 2

一、实践目标

本项目在行空板上外接USB摄像头,通过摄像头来识别手掌,并在其上绘制关键点。

 

二、知识目标

1、学习使用MediaPipe的Hands模型进行手势识别并绘制关键点的方法。

 

三、实践准备

软件使用:Mind+编程软件x1

材料清单

一、实践过程

1、硬件搭建

1、将摄像头接入行空板的USB接口。

image.png

 

2、通过USB连接线将行空板连接到计算机。

image.png

2、软件编写

第一步:打开Mind+,远程连接行空板

image.png

第二步:编写程序

在“行空板的文件”中找到名为AI的文件夹,在其中新建一个名为“基于行空板的mediapipe手势识别与追踪”的文件夹,再新建一个项目文件,并命名为“main.py”。

 

示例程序:
 

 

 

代码
import cv2    # 导入OpenCV库,用于图像处理
import mediapipe as mp    # 导入MediaPipe库,用于机器学习模型的应用

mp_drawing = mp.solutions.drawing_utils    # 从MediaPipe的解决方案中导入绘图工具
mp_drawing_styles = mp.solutions.drawing_styles    # 从MediaPipe的解决方案中导入绘图样式工具
mp_hands = mp.solutions.hands    # 从MediaPipe的解决方案中导入Hands模型

# 打开摄像头,准备获取实时视频流
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)    # 设置视频流的宽度为320
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)    # 设置视频流的高度为240
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)    # 设置视频流的缓冲区大小为1

# 设置窗口为全屏模式
cv2.namedWindow('MediaPipe Hands', cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty('MediaPipe Hands', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)

# 加载Hands模型
with mp_hands.Hands(
    model_complexity=0,
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5) as hands:
  while cap.isOpened():
    # 读取摄像头的每一帧图像
    success, image = cap.read()
    if not success:
        print("Ignoring empty camera frame.")
        continue

    # 将图像转换为RGB格式
    image.flags.writeable = False
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

    # 使用Hands模型处理图像
    results = hands.process(image)

    # 将图像转换回BGR格式
    image.flags.writeable = True
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)

    # 如果在图像中检测到手,则在图像上绘制手的关键点和连接线
    if results.multi_hand_landmarks:
        for hand_landmarks in results.multi_hand_landmarks:
            mp_drawing.draw_landmarks(
                image,
                hand_landmarks,
                mp_hands.HAND_CONNECTIONS,
                mp_drawing_styles.get_default_hand_landmarks_style(),
                mp_drawing_styles.get_default_hand_connections_style())

    # 将图像旋转90度并翻转,然后显示图像
    image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)
    cv2.imshow('MediaPipe Hands', cv2.flip(image, 1))

    # 如果用户按下ESC键(ASCII值为27),则退出循环
    if cv2.waitKey(5) & 0xFF == 27:
        break

# 释放摄像头
cap.release()

3、运行调试

第一步:运行主程序

运行“main.py”程序,可以看到初始时屏幕上显示着摄像头拍摄到的实时画面,将摄像头画面对准手部,可以看到手掌被识别了出来并标记了关键点。

 

image.png

 

程序解析

在上述的“main.py”文件中,我们主要通过opencv库来调用摄像头,获取实时视频流,然后借助MediaPipe的Hands模型对每一帧图像进行手势识别并绘制关键点。整体流程如下,

 

①打开摄像头:程序首先打开摄像头获取实时视频流。

 

②读取每一帧图像:在一个无限循环中,程序读取摄像头的每一帧图像。

 

③图像预处理:读取到的图像首先转换为RGB格式(因为OpenCV读取的图像默认是BGR格式,而大部分的图像处理和计算机视觉算法都假定输入的图像是RGB格式的)。

 

④应用Hands模型:将预处理后的图像输入到Hands模型中,模型会输出一个包含多个手的关键点坐标的列表。

 

⑤绘制关键点和连接线:如果在图像中检测到手,程序会在图像上绘制出手的关键点和连接线。

 

⑥显示处理后的图像:将绘制了关键点和连接线的图像显示出来。

 

⑦检查用户输入:如果用户按下ESC键,则退出循环,程序结束。

 

 

五、知识园地

 

1. 了解MediaPipe的Hands模型

MediaPipe的Hands模型是一个用于手部关键点检测的模型,它能够在RGB图像中识别多只手的21个关键点。这些关键点包括手腕、各个指关节等,能够用于描述手的姿态和手势。

 

Hands模型使用了一个基于回归的方法,通过预测图像中手的关键点的坐标位置来实现手部关键点的检测。模型的输入是一张RGB图像,输出是图像中每只手的21个关键点的坐标。

 

模型的结构基于一个被称为BlazePalm的模型,该模型在进行手部关键点检测的同时,还会预测一个手掌的方向向量,这对于区分左手和右手以及手的朝向非常有用。模型在训练时使用了大量的真实世界图像以及合成图像,能够处理各种复杂的场景,包括不同的光照条件、手部遮挡等。

MediaPipe提供了完整的模型文件和相关的API,开发者可以非常方便地在自己的应用中集成Hands模型。并且,MediaPipe还提供了一套完整的解决方案,包括手部追踪、手势识别等功能,可以帮助开发者更容易地开发出复杂的交互应用。

 

评论

user-avatar
  • 花生编程

    花生编程2024.05.02

    厉害

    0
    • 三春牛-创客

      三春牛-创客2024.05.01

      不错

      0