一. 引言
MediaPipe 是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架。在谷歌,一系列重要产品,如 YouTube、Google Lens、ARCore、Google Home 以及 Nest,都已深度整合了 MediaPipe。MediaPipe大有用武之地,可以做物体检测、自拍分割、头发分割、人脸检测、手部检测、运动追踪,等等。基于此可以实现更高级的功能。
更多详细可以查看官方文档地址MediaPipe | Google for Developers
mediaipe提供了很多功能,包含目标识别,骨骼识别,图像分割,人脑识别检测等功能
官方也提供了基于Android,python和web的例子,这里测试是基于python
这里测试的是手指骨骼识别,模型包检测21个手关节的关键点定位 检测到的手区域内的坐标。
二、环境搭建
1、创建虚拟环境(conda环境搭建,请参考前面文章)
conda create -n mediapipe python=3.8
2、激活
conda activate mediapipe
3、安装mediapipe
pip install mediapipe
或
pip install mediapipe -i https://pypi.douban.com/simple
4、安装OpenCV
pip install opencv-python
5、安装OpenCV拓展
pip install opencv-contrib-python
6、安装pycharm
pycharm使用的是社区版本,喜欢使用指令的,可以不用安装
安装后界面
7、pycharm配置环境
导入虚拟环境
确定后,会发现,pycharm会把环境切换成创建的虚拟环境。
这里有个要注意的,如果终端显示的不是我们的虚拟环境,我这边显示的是base需要修改
修改Terminal的Application Settings改成powershell.exe
三、测试
程序参考Example:Gesture recognition guide for Python | MediaPipe | Google for Developers
代码流程
1、导入库
2、使用cv2打开摄像头
3、使用mediapipe推理摄像头捕捉到的图片
4、显示结果
源代码
import sys
import cv2
import mediapipe as mp
mp_face_detection = mp.solutions.face_detection
mp_drawing = mp.solutions.drawing_utils
mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands
# For webcam input:
cap = cv2.VideoCapture(0)
with mp_hands.Hands(
min_detection_confidence=0.9,
min_tracking_confidence=0.9) as hands:
while cap.isOpened():
success, image = cap.read()
if not success:
print("Ignoring empty camera frame.")
# If loading a video, use 'break' instead of 'continue'.
continue
# Flip the image horizontally for a later selfie-view display, and convert
# the BGR image to RGB.
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
# To improve performance, optionally mark the image as not writeable to
# pass by reference.
image.flags.writeable = False
results = hands.process(image)
# Draw the hand annotations on the image.
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)
cv2.imshow('MediaPipe Hands', image)
if cv2.waitKey(5) & 0xFF == 27:
break
cap.release()
使用的电脑是cpu版本,测试显示感觉还是可以的。
至此测试结束,接下来将使用mediapipe做手势识别及音量控制等。