一、实践目标
本项目在行空板上外接USB摄像头,通过摄像头来识别手掌,并在其上绘制关键点。
二、知识目标
1、学习使用MediaPipe的Hands模型进行手势识别并绘制关键点的方法。
三、实践准备
软件使用:Mind+编程软件x1
一、实践过程
1、硬件搭建
1、将摄像头接入行空板的USB接口。
2、通过USB连接线将行空板连接到计算机。
2、软件编写
第一步:打开Mind+,远程连接行空板
第二步:编写程序
在“行空板的文件”中找到名为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”程序,可以看到初始时屏幕上显示着摄像头拍摄到的实时画面,将摄像头画面对准手部,可以看到手掌被识别了出来并标记了关键点。
程序解析
在上述的“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还提供了一套完整的解决方案,包括手部追踪、手势识别等功能,可以帮助开发者更容易地开发出复杂的交互应用。
附件
罗罗罗2024.10.14
666
CYL2024.07.10
MediaPipe库导入不成功咋整
yM7RdfqzYG5y2024.07.08
厉害,不过运行在板子上有点卡,一顿一顿的
花生编程2024.05.02
厉害
三春牛-创客2024.05.01
不错