一、介绍
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