大家好,这是一个树莓派和OpenCV的连载专题。
使用树莓派与OpenCV实现姿态估计和面部特征点追踪
使用树莓派与OpenCV实现面部和运动追踪的云台系统
使用树莓派和OpenCV实现手部识别与手势控制
使用树莓派和OpenCV实时扫描并存储二维码
使用树莓派和OpenCV实现物体与动物识别
使用树莓派、摄像头和OpenCV进行速度检测
用树莓派 + OpenCV 打造人脸识别技术!
今天的内容是:使用树莓派和OpenCV实现手部识别与手势控制
如果大家对这个专题感兴趣,记得关注树莓派开发者,这样你将会第一时间收到我们的内容更新通知。
考验你英语听力的时候到了,你可以选择观看视频演示。
[更新——在OPEN-CV与新版树莓派“Bullseye”操作系统完全兼容之前,我强烈建议现阶段将先前的树莓派“Buster”操作系统刷写到Micro-SD卡上,以配合本指南使用——官方“Buster”镜像下载链接在下方]
如何将旧的“Buster”树莓派系统刷写到Micro-SD卡上:
https://core-electronics.com.au/guides/raspberry-pi/flash-buster-os-pi/
官方“Buster”镜像:
https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2021-05-28/
是时候使用人工智能和计算机视觉技术,实现实时多手部识别、手指分割和手势识别了。你是否曾希望自己的树莓派4B能够实时识别你双手手指的每个关节?或者用手势发送指令?又或者进行手部关键点检测或手部姿态检测?那么,本页正是你需要的。
按照本指南操作,你将确切知道如何实现这些功能,从而在创客世界中搭建一个适合自己项目的类似系统(即使你是虚拟主播也没问题)。本指南内容如下:
所需材料
初始设置与安装流程
手部跟踪功能脚本
手指计数与手指上下识别脚本
后续方向(GPIO控制及其他应用)
在树莓派“Buster”操作系统上安装Open-CV
脚本下载
机器学习和深度学习从未如此触手可及,本指南将对此进行演示。本系统将使用Open-CV,特别是CVzone。这是一个强大的资源库,有助于解决实时计算机视觉和图像处理问题。下图展示了在树莓派“Buster”操作系统上运行手部跟踪软件的情况,使用的是树莓派4B、高质量摄像头模块和镜头。
在本页底部,你可以找到将Open-CV安装到树莓派上的流程。本系统将使用MediaPipe进行实时手部识别,该工具在运行时会使用TensorFlow Lite委托进行硬件加速(本指南一应俱全!)。还有其他类型的手势识别技术也可用于树莓派4B。例如,你还可以使用Pytorch、Haar级联或YOLO/YOLOv2软件包进行手部识别或手势识别,但本指南中使用的MediaPipe数据集和系统要优越得多。本指南中探索的所有脚本都将使用Python编程语言。
所需材料
以下是让本系统快速运行起来所需的组件列表。
树莓派4B(树莓派提供的额外计算能力对这项任务非常有帮助,但此设置也适用于树莓派3B,只是速度会稍慢一些)
树莓派高质量摄像头和摄像头镜头(你也可以使用树莓派官方摄像头模块V2)
Micro SD卡
显示器
HDMI线
鼠标和键盘
初始设置与安装流程
将树莓派作为台式电脑连接,接上显示器、鼠标和键盘。确保树莓派摄像头已正确安装在插槽中,且排线方向正确,然后开始下面的Open-CV安装流程。完成后,你将在全新版本的树莓派“Buster”操作系统上安装好Open-CV。然后打开树莓派配置菜单(通过左上角的菜单找到,然后滚动到偏好设置),在接口选项卡下启用摄像头。启用后,重启树莓派以使更改生效。设置位置见下图。
完成上述步骤后,下一步是使用屏幕左上角的黑色按钮打开一个新的终端。下面展示了在树莓派“Buster”桌面上打开终端的样子,图中有一个大箭头指向点击鼠标打开终端的图标。
现在,我们将在终端窗口中逐行输入以下命令,以安装必要的软件包。当需要你继续安装这些软件包时,请按键盘上的 | Y | 键。我们将在此安装的最重要的软件包是MediaPipe。它有专门适用于树莓派4和树莓派3的软件包,你可以将两者都安装到系统中。这些命令将为我们提供MediaPipe软件包。关于MediaPipe为手部识别提供的功能,请参见下文图片,该软件包能够识别、定位双手上的每个关节,并为每个关节提供一个唯一的编号。
sudopip3 install mediapipe-rpi3sudo pip3 install mediapipe-rpi4sudo pip3 install gttssudo apt install mpg321
故障排除补充:如果你遇到此兼容性问题 | RuntimeError: module compiled against API version 0xe but this version of numpy is 0xd |,请在终端中输入以下命令进行修复
sudo pip install numpy--upgrade--ignore-installedsudo pip3 install numpy--upgrade--ignore-installed
手部跟踪功能脚本
完成上述步骤后,我们开始进入正题。下面是我们将用于启动手部跟踪系统的脚本。运行该脚本时,它将通过计算机视觉识别面前的任何手部,然后使用机器学习在识别出的手部上方绘制手部框架。脚本有完整的注释,因此你可以理解每个部分的作用和目的。在下面的下载部分中找到名为 | Simple-Hand-Tracker.py | 的脚本。复制、粘贴、保存并运行下面的脚本,或在Thonny IDE中运行下载的脚本。Thonny IDE只是我偏好的Python解释器软件,它默认安装在树莓派操作系统中,你可以使用任何你喜欢的软件。
#Import the necessary Packages for this software to runimportmediapipeimportcv2#Use MediaPipe to draw the hand framework over the top of hands it identifies in Real-TimedrawingModule = mediapipe.solutions.drawing_utilshandsModule = mediapipe.solutions.hands#Use CV2 Functionality to create a Video stream and add some valuescap = cv2.VideoCapture(0)fourcc = cv2.VideoWriter_fourcc('m','p','4','v')#Add confidence values and extra settings to MediaPipe hand tracking. As we are using a live video stream this is not a static#image mode, confidence values in regards to overall detection and tracking and we will only let two hands be tracked at the same time#More hands can be tracked at the same time if desired but will slow down the systemwithhandsModule.Hands(static_image_mode=False, min_detection_confidence=0.7, min_tracking_confidence=0.7, max_num_hands=2)ashands:#Create an infinite loop which will produce the live feed to our desktop and that will search for hands whileTrue: ret, frame = cap.read() #Unedit the below line if your live feed is produced upsidedown #flipped = cv2.flip(frame, flipCode = -1)
#Determines the frame size, 640 x 480 offers a nice balance between speed and accurate identification frame1 = cv2.resize(frame, (640,480))
#Produces the hand framework overlay ontop of the hand, you can choose the colour here too) results = hands.process(cv2.cvtColor(frame1, cv2.COLOR_BGR2RGB))
#In case the system sees multiple hands this if statment deals with that and produces another hand overlay ifresults.multi_hand_landmarks !=None: forhandLandmarksinresults.multi_hand_landmarks: drawingModule.draw_landmarks(frame1, handLandmarks, handsModule.HAND_CONNECTIONS)
#Below is Added Code to find and print to the shell the Location X-Y coordinates of Index Finger, Uncomment if desired #for point in handsModule.HandLandmark:
#normalizedLandmark = handLandmarks.landmark[point] #pixelCoordinatesLandmark= drawingModule._normalized_to_pixel_coordinates(normalizedLandmark.x, normalizedLandmark.y, 640, 480)
#Using the Finger Joint Identification Image we know that point 8 represents the tip of the Index Finger #if point == 8: #print(point) #print(pixelCoordinatesLandmark) #print(normalizedLandmark)
#Below shows the current frame to the desktop cv2.imshow("Frame", frame1); key = cv2.waitKey(1) &0xFF
#Below states that if the |q| is press on the keyboard it will stop the system ifkey ==ord("q"): break
因此,只要你运行该脚本(在Thonny IDE中按大的绿色运行按钮),它就会打开一个新窗口并启动手部识别。此脚本可容纳两只手,但如果你愿意,可以修改脚本以容纳更多手部。请参见下图。
手指计数与手指上下识别脚本
接下来的自然步骤是在上述脚本中添加代码,使其能够知道我们何时有手指抬起/放下,并统计抬起/放下的手指总数。在本页底部下载此脚本。解压下载的脚本到桌面后,你将看到有完整注释的脚本 | Are Fingers Up or Down.py | 和 | module.py |。运行第一个主脚本时,请确保 | module.py | 在同一目录中。此 | Are Fingers Up or Down.py | 脚本与上面的脚本非常相似,但还将提供手指总数(抬起和放下)以及每个手指是抬起还是放下的具体细节。此信息将打印到外壳中。请参见下图,右键单击并将其在新窗口中打开以查看全尺寸图像(如果需要)。注意,已识别出食指和小指是抬起的。另外,有2根手指是抬起的,3根手指是放下的。
这非常有用,因为我们可以据此扩展功能,使用抬起/放下的手指或手势(如摇滚手势)来控制GPIO引脚。就目前而言,此计数适用于单只手,但可以修改代码以适用于多只手。
另外,作为一个彩蛋,我添加了一个小型文本转语音功能。每当你在脚本运行时按键盘上的 | q | 键,一个悦耳的机器人女士声音就会告诉你抬起和放下的手指数量。所有代码都有完整注释,以帮助理解。
后续方向(GPIO控制及其他应用)
自然,接下来的步骤是使用此代码控制GPIO引脚。我之前曾使用有趣的输入(如面部识别、速度识别或NFC标签)进行过伺服控制、LED灯控制和LED矩阵控制,但这次让我们从控制一组伺服开始。本节中讨论的所有脚本均可在本文底部下载。
包含的代码 | Are Fingers Up Servo Control.py | 中,我特别标注了修改之前脚本以添加此功能的位置。只需添加几行代码,你的树莓派单板计算机就可以变成一个手势激活系统。这非常令人兴奋!在我的案例中,我将其连接到了一个机械手上,该机械手由5个伺服为每个指尖提供动力。这些伺服都连接到一个直接安装在树莓派顶部的Adafruit 16通道伺服HAT上。这个HAT(硬件附加在顶部)是控制树莓派多个伺服的最简单方法。当我在树莓派摄像头前抬起手指并运行代码时,它会抬起机械手的手指。请参见下图。此外,Garry创建了一个出色的仿生乐高手,他扩展了此代码并使用了树莓派Build HAT。
在可下载的脚本中,你还可以找到 | Glowbit-Gesture-Control.py |。如果你然后像此指南一样将一个Glowbit Matrix 4x4连接到树莓派上,你将创建一个手势控制灯光系统。请参见下面的操作。根据你向摄像头展示的手指数量,矩阵将显示不同的颜色。只需在上一个脚本中添加很少的额外代码即可实现此功能,并且已添加完整注释。
这种手势控制不仅可以用于控制硬件,还可以用于控制软件。举个简单的例子,打开 | Computer-Gesture-Control.py |,我在其中编写了通过手势命令启动和暂停视频、控制声音以及关闭设备的功能。如果你放下1根手指,它将播放媒体。如果你放下2根手指,它将暂停媒体。然后,放下3根手指将打开声音,放下4根手指将静音。请参见下图,VLC开始播放是通过相邻的手势启动的。
如果你继续朝这个方向编码,你可以轻松地根据提供的手势控制YouTube视频的播放、暂停、快进和点赞。限制只取决于你的想象力!
在树莓派“Buster”操作系统上安装Open-CV
以下是让树莓派安装Open-CV以实现上述手部识别的详细流程。很快,我将创建一个脚本/单独的教程来简化此流程。打开一台运行在Micro-SD卡上的全新树莓派“Buster”操作系统的树莓派4B,并将系统连接到互联网。
通过按下左上角的终端按钮打开终端。将每个命令复制并粘贴到树莓派的终端中,按Enter键,并等待其完成后再执行下一个命令。如果提示“你想继续吗?(y/n)”,请按Y键,然后按Enter键继续。
sudo apt-getupdate&&sudo apt-getupgrade
在运行下一组命令之前,我们必须先扩展交换文件。为此,在终端中输入以下行。
sudo nano /etc/dphys-swapfile
将 CONF_SWAPSIZE = 100 更改为 CONF_SWAPSIZE=2048。完成此操作后,按Ctrl-X、Y,然后按Enter键保存这些更改。此更改只是暂时的,完成此操作后你应该将其改回。为了使这些更改生效,我们必须通过向终端输入以下命令来重启交换文件。然后,我们将像往常一样继续输入终端命令。
sudo apt-get install build-essential cmake pkg-configsudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-devsudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-devsudo apt-get install libxvidcore-dev libx264-devsudo apt-get install libgtk2.0-dev libgtk-3-devsudo apt-get install libatlas-base-dev gfortransudo pip3 install numpywget -O opencv.zip https://github.com/opencv/opencv/archive/4.4.0.zipwget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.4.0.zipunzip opencv.zipunzip opencv_contrib.zipcd~/opencv-4.4.0/mkdirbuildcdbuildcmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-4.4.0/modules \ -D BUILD_EXAMPLES=ON ..make -j $(nproc)
此 | make | 命令将需要超过一个小时来安装,并且不会有任何关于还需多长时间的指示。它也可能会冻结显示器。请耐心等待,它会正常工作的。一旦完成,你就完成了大部分工作。如果它在任何时候失败,你会收到类似 | make: *** [Makefile all] Error 2 | 的消息,只需重新输入并执行上面的 | make -j $(nproc) | 行。不要害怕,它会记住已经完成的所有工作,并从停止的地方继续。一旦完成,我们将继续输入终端命令。
sudomake install && sudo ldconfigsudo reboot
脚本下载
以下是运行上述示例所需的所有代码。这些代码都有完整注释,因此你可以轻松理解并修改它们,以满足你的需求。
https://core-electronics.com.au/media/kbase/527/Code-For-Hand-Identification-Media-Pipe-new.zip
原文地址:
https://core-electronics.com.au/guides/raspberry-pi/hand-identification-raspberry-pi/
-
遥控器
+关注
关注
18文章
860浏览量
68575 -
OpenCV
+关注
关注
32文章
648浏览量
43275 -
树莓派
+关注
关注
122文章
2059浏览量
107868
发布评论请先 登录


树莓派B+影音娱乐之烧写OpenELEC与红外遥控器适配
树莓派遥控视频小车的方法
如何使用MPU6050进行手势遥控器的设计
树莓派遥控视频小车(附代码)

评论