保姆级教程:ROS 中调用 MediaPipe,实现手势识别,人像抠图,人脸检测,人脸网格,人体骨架检测等功能
一、项目说明
MediaPipe 是 Google 的一个开源项目,可以提供开源的、跨平台的常用机器学习 (machine learning) 方案。MediaPipe 实际上是一个集成的机器学习视觉算法的工具库,包含了人脸检测、人脸关键点、手势识别、头像分割和姿态识别等各种模型。
项目主页:https://google.github.io/mediapipe/
mediapipe_ros 是一个增加了 ROS 接口的开源功能包,可以直接调用 MediaPipe。
开源地址:mediapipe_ros: mediapipe in ros
二、使用前准备
注意:使用冰达提供的嵌入式板卡镜像已经预装相关的软件,不需要执行以下的安装步骤,可直接跳到测试运行章节。
- 安装 pip3
确保系统中已经安装了 pip3,它是 Python 3 的包管理工具,用于安装 MediaPipe 等 Python 库。 - 安装 mediapipe
使用 pip3 安装 MediaPipe 库,命令如下:bash
pip3 install mediapipe - 安装其他依赖软件
根据实际需求,可能还需要安装一些其他依赖软件,例如与 ROS 相关的依赖包等。具体依赖请参考项目相关文档。 - 克隆 mediapipe_ros 源码到工作空间
假设工作空间名为mediapipe_ws,进入该工作空间的src目录,执行以下命令克隆源码:bash
cd ~/mediapipe_ws/src git clone https://gitee.com/bingda-robot/mediapipe_ros.git
然后回到工作空间根目录,编译工作空间:bash
cd ~/mediapipe_ws catkin_make
三、测试运行
(一)启动摄像头
根据实际使用的摄像头设备号填写 device 值,例如:
bash
roslaunch mediapipe_ros rgb_camera.launch device:=video0
(二)打开一个 rqt 窗口
(三)手部骨骼检测
可以识别标出手部 21 个关键点的 3D 坐标。
在 rqt 终端中选择图像话题显示图像。
操作步骤:
bash
rosrun mediapipe_ros hands_gesture.py
(四)手势识别
根据识别出的手部 21 个关键点的 3D 坐标判断当前手势,支持 1~6 的数字,竖大拇指,以及一个国际友好手势。
在 rqt 终端中选择图像话题显示图像。
操作步骤:
bash
rosrun mediapipe_ros hands_gesture.py
(五)人像抠图
运行代码:
bash
rosrun mediapipe_ros selfie_segmentation.py
将人像从当前画面中除人像部分以外的背景消除掉,在 rqt 终端中选择图像话题显示图像。
(六)人脸检测
运行代码:
bash
rosrun mediapipe_ros face_detection.py
MediaPipe 将会捕捉人脸的眼睛、鼻子、嘴巴和耳朵的六个关键点位置,在 rqt 终端中选择图像话题显示图像。
(七)人脸网格
运行代码:
bash
rosrun mediapipe_ros face_mesh.py
提取出人脸的 3D 网格特征,在 rqt 终端中选择图像话题显示图像。
(八)人体骨架检测
运行代码:
bash
rosrun mediapipe_ros pose.py
可以识别标出人体 33 个关键点的 3D 坐标,在 rqt 终端中选择图像话题显示图像。
(九)综合检测
运行代码:
bash
rosrun mediapipe_ros holistic.py
同时实现骨架检测,脸部关键点和手部动作检测。这个 Demo 检测运算量较大,嵌入式板卡检测帧率会比较低。在 rqt 终端中选择图像话题显示图像。
四、可能遇到的问题及解决办法
(一)roslaunch mediapipe_ros rgb_camera.launch device:=video0 报错:
plaintext
RLException: [rgb_camera.launch] is neither a launch file in package [mediapipe_ros] nor is [mediapipe_ros] a launch file name
The traceback for the exception was written to the log file
原因:可能是 mediapipe_ros 包未正确安装或编译,或者 ROS_PACKAGE_PATH 环境变量没有正确设置,导致 ROS 找不到 mediapipe_ros 包中的 rgb_camera.launch 文件。
解决办法:
- 确认
mediapipe_ros包已正确克隆到工作空间~/mediapipe_ws/src目录下,并且已经在工作空间根目录执行了catkin_make命令进行编译。 - 检查
ROS_PACKAGE_PATH环境变量,在终端中输入echo $ROS_PACKAGE_PATH,确保~/mediapipe_ws/src已经包含在该路径中。如果没有,打开~/.bashrc文件(使用nano ~/.bashrc命令),在文件末尾添加以下两行:
bash
source ~/mediapipe_ws/devel/setup.bash
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/mediapipe_ws/src
保存并退出 nano 编辑器(按 Ctrl + X,然后按 Y,最后按 Enter),再执行 source ~/.bashrc 使设置生效。
(二)rosrun mediapipe_ros hands_gesture.py 报错:
plaintext
Traceback (most recent call last):
File "/home/orangepi/mediapipe_ws/src/mediapipe_ros/script/hands_gesture.py", line 17, in <module>
import mediapipe as mp
File "/home/orangepi/.local/lib/python3.8/site-packages/mediapipe/__init__.py", line 16, in <module>
import mediapipe.python.solutions as solutions
File "/home/orangepi/.local/lib/python3.8/site-packages/mediapipe/python/solutions/__init__.py", line 17, in <module>
import mediapipe.python.solutions.drawing_styles
File "/home/orangepi/.local/lib/python3.8/site-packages/mediapipe/python/solutions/drawing_styles.py", line 20, in <module>
from mediapipe.python.solutions.drawing_utils import DrawingSpec
File "/home/orangepi/.local/lib/python3.8/site-packages/mediapipe/python/solutions/drawing_utils.py", line 21, in <module>
import matplotlib.pyplot as plt
File "/usr/lib/python3/dist-packages/matplotlib/pyplot.py", line 2349, in <module>
switch_backend(rcParams["backend"])
File "/usr/lib/python3/dist-packages/matplotlib/pyplot.py", line 221, in switch_backend
backend_mod = importlib.import_module(backend_name)
File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_tkagg.py", line 1, in <module>
from . import _backend_tk
File "/usr/lib/python3/dist-packages/matplotlib/backends/_backend_tk.py", line 6, in <module>
import tkinter as tk
ModuleNotFoundError: No module named 'tkinter'
原因:缺少 tkinter 模块,tkinter 是 Python 的标准图形用户界面(GUI)库,matplotlib 依赖它来显示图形。
解决办法:在基于 Debian 或 Ubuntu 的系统上,可以通过以下命令安装 tkinter:
bash
sudo apt-get update
sudo apt-get install python3-tk
安装完成后,再次运行 rosrun mediapipe_ros hands_gesture.py 即可。
更多推荐

所有评论(0)