Bootstrap

小车AI视觉识别--11.手势识别

一、介绍

        MediaPipe是⼀款由Google开发并开源的数据流处理机器学习应⽤开发框架。它是⼀个基于图的数据处理管线,⽤于构建使⽤了多种形式的数据源,如视频、⾳频、传感器数据以及任何时间序列数据。

        MediaPipe是跨平台的,可以运⾏在嵌⼊式平台(树莓派等),移动设备(iOS和Android),⼯作站和服务器上,并⽀持移动端GPU加速。 MediaPipe为实时和流媒体提供跨平台、可定制的ML解决⽅案。

        MediaPipe 的核⼼框架由 C++ 实现,并提供 Java 以及 Objective C 等语⾔的⽀持。MediaPipe 的主要概念包括数据包(Packet)、数据流(Stream)、计算单元(Calculator)、图(Graph)以及⼦图(Subgraph)。

MediaPipe的特点:

  • 端到端加速:内置的快速ML推理和处理即使在普通硬件上也能加速。
  • ⼀次构建,随时随地部署:统⼀解决⽅案适⽤于Android、iOS、桌⾯/云、web和物联⽹。
  • 即⽤解决⽅案:展⽰框架全部功能的尖端ML解决⽅案。
  • 免费开源:Apache2.0下的框架和解决⽅案,完全可扩展和定制。

二、手势识别

        以右⼿为准设计的⼿势识别,满⾜特定条件时,均可以准确识别。可识别的⼿势有:【Zero、One、Two、Three、Four、Five、Six、Seven、Eight、Ok、Rock、Thumb_up(点赞)、Thumb_down(拇指向下)、Heart_single(单⼿⽐⼼)】,⼀共14类。识别的手势结果同时也会在oled显示。

三、实验源码

#导入相关的模块   Import related modules
import threading
import cv2 
import time
import math
from time import sleep
import ipywidgets.widgets as widgets
# 导入oled屏幕库 Import oled screen library
import sys
sys.path.append('/home/pi/software/oled_yahboom/')
from yahboom_oled import *
# 创建oled对象 Create an oled object
oled = Yahboom_OLED(debug=False)
​
from gesture_action import handDetector
g_camera = cv2.VideoCapture(0)
g_camera.set(3, 320)
g_camera.set(4, 240)
g_camera.set(5, 30)  #设置帧率 Setting the frame rate
# g_camera.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter.fourcc('M', 'J', 'P', 'G'))
# g_camera.set(cv2.CAP_PROP_BRIGHTNESS, 40) #设置亮度 -64 - 64  0.0 Set Brightness -64 - 64 0.0
# g_camera.set(cv2.CAP_PROP_CONTRAST, 50) #设置对比度 -64 - 64  2.0 Set Contrast -64 - 64 2.0
# g_camera.set(cv2.CAP_PROP_EXPOSURE, 156) #设置曝光值 1.0 - 5000  156.0 Set the exposure value 1.0 - 5000 156.0
​
hand_detector = handDetector(detectorCon=0.75)
image_original = widgets.Image(format='jpeg', width=640, height=480)
image_result = widgets.Image(format='jpeg', width=640, height=480)
image_widget = widgets.HBox([image_original, image_result])
#bgr8转jpeg格式 bgr8 to jpeg format
def bgr8_to_jpeg(value, quality=75):
    return bytes(cv2.imencode('.jpg', value)[1])
display(image_widget)   
try:
    oled.init_oled_process() #初始化oled进程 Initialize oled process
    while True:
        ret, frame = g_camera.read()
        frame, img = hand_detector.findHands(frame, draw=False)
        if len(hand_detector.lmList) != 0:
            finger_number = hand_detector.get_gesture()
            cv2.rectangle(frame, (0, 430), (230, 480), (0, 255, 0), cv2.FILLED)
            cv2.putText(frame, str(finger_number), (10, 470), cv2.FONT_HERSHEY_PLAIN, 2, (255, 0, 0), 2)
            finger_str=f"Number:{finger_number}"
            print(finger_str)
            oled.clear()
            oled.add_line("Gesture_Reco",1)
            oled.add_line(finger_str, 3)
            oled.refresh()
        else:
            oled.clear()
            oled.add_line("Gesture_Reco",1)
            oled.add_line("Number:None",3)
            oled.refresh()
        image_original.value = bgr8_to_jpeg(frame)
        image_result.value = bgr8_to_jpeg(img)
except:
    print(" Program closed! ")
    # 恢复屏幕基础数据显示 Restore basic data display on screen
    os.system("python3 /home/pi/software/oled_yahboom/yahboom_oled.py &")
    pass

四、实验现象

;