4344浏览
查看: 4344|回复: 0

[项目] 【智控万物】睁眼请开灯

[复制链接]
本帖最后由 云天 于 2021-6-25 07:23 编辑

谷歌出了一个开源的、跨平台的、可定制化的机器学习解决方案工具包,给在线流媒体(当然也可以用于普通的视频、图像等)提供了机器学习解决方案。感兴趣的同学可以打开这个网址了解详情:mediapipe.dev/
它提供了手势、人体姿势、人脸、物品等识别和追踪功能,并提供了C++、Python、JavaScript等编程语言的工具包以及iOS、Android平台的解决方案,今天我们就来看一下如何使用MediaPipe提供的MediaPipe 面网格来写一个Python代码识别眨眼、张闭嘴来控制Arduino板上RGB灯带。【MediaPipe 面网格】

MediaPipe Face Mesh 是一种面部几何解决方案,即使在移动设备上也能实时估计 468 个 3D 面部标志。它采用机器学习 (ML) 来推断 3D 表面几何形状,只需要一个摄像头输入,无需专用深度传感器。该解决方案在整个管道中利用轻量级模型架构和 GPU 加速,提供对实时体验至关重要的实时性能。

【Mind+MediaPipe 面网格】
在Mind+的Python模式中,通过“库管理”中PIP模式安装”mediapipe
【智控万物】睁眼请开灯图1


【标识468个面部标志】

  1. import cv2
  2. import time
  3. import mediapipe as mp
  4. mp_drawing = mp.solutions.drawing_utils
  5. mp_face_mesh = mp.solutions.face_mesh
  6. from pinpong.board import Board,Pin,NeoPixel
  7. NEOPIXEL_PIN = Pin.D7
  8. PIXELS_NUM = 7 #灯数
  9. Board("uno").begin()  #初始化,选择板型和端口号,不输入端口号则进行自动识别
  10. np = NeoPixel(Pin(NEOPIXEL_PIN), PIXELS_NUM)
  11. # For webcam input:
  12. drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1)
  13. cap = cv2.VideoCapture(0)
  14. Width=cap.get(3)
  15. Height=cap.get(4)
  16. i=1
  17. with mp_face_mesh.FaceMesh(
  18.     min_detection_confidence=0.5,
  19.     min_tracking_confidence=0.5) as face_mesh:
  20.   while cap.isOpened():
  21.     success, image = cap.read()
  22.     if not success:
  23.       print("Ignoring empty camera frame.")
  24.       # If loading a video, use 'break' instead of 'continue'.
  25.       continue
  26.     # Flip the image horizontally for a later selfie-view display, and convert
  27.     # the BGR image to RGB.
  28.     image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
  29.     # To improve performance, optionally mark the image as not writeable to
  30.     # pass by reference.
  31.     image.flags.writeable = False
  32.     results = face_mesh.process(image)
  33.     # Draw the face mesh annotations on the image.
  34.     image.flags.writeable = True
  35.     image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
  36.     if results.multi_face_landmarks:
  37.       for face_landmarks in results.multi_face_landmarks:
  38.         mp_drawing.draw_landmarks(
  39.             image=image,
  40.             landmark_list=face_landmarks,
  41.             connections=mp_face_mesh.FACE_CONNECTIONS,
  42.             landmark_drawing_spec=drawing_spec,
  43.             connection_drawing_spec=drawing_spec)
  44.      
  45.       up=results.multi_face_landmarks[0].landmark[13]
  46.       down=results.multi_face_landmarks[0].landmark[14]
  47.       cv2.circle(image,(int(up.x*Width),int(up.y*Height)),4,(255,0,0),-1)
  48.       cv2.circle(image,(int(down.x*Width),int(down.y*Height)),4,(255,0,0),-1)
  49.       for i in range(0,468):#标记468个3D 面部标志。
  50.        text=results.multi_face_landmarks[0].landmark[i]
  51.        cv2.putText(image, str(i), (int(text.x*Width),int(text.y*Height)),cv2.FONT_HERSHEY_SIMPLEX, 0.3, (255, 0, 0), 1)
  52.       print(abs(down.y-up.y)*Height)
  53.       if(abs(down.y-up.y)*Height)>20:
  54.           for num in range(0,7):
  55.                 np[num]=(255,0,0)
  56.       else:
  57.           for num in range(0,7):
  58.                 np[num]=(0,0,0)         
  59.     cv2.imshow('MediaPipe FaceMesh', image)
  60.     if cv2.waitKey(5) & 0xFF == 27:
  61.       break
  62. cap.release()
复制代码

【智控万物】睁眼请开灯图2

【张嘴请开灯】
      up=results.multi_face_landmarks[0].landmark[13]
      down=results.multi_face_landmarks[0].landmark[14]

13和14在一个在上嘴唇,一个在下嘴唇,利用两个标识点的纵坐标的差值来判断是否张嘴。
【智控万物】睁眼请开灯图4

【智控万物】睁眼请开灯图6

【智控万物】睁眼请开灯图3

【演示视频】


【睁眼请开灯】
up=results.multi_face_landmarks[0].landmark[159]
down=results.multi_face_landmarks[0].landmark[145]
159与145标识点在右眼的上眼睑和下眼睑。
  1. import cv2
  2. import time
  3. import mediapipe as mp
  4. mp_drawing = mp.solutions.drawing_utils
  5. mp_face_mesh = mp.solutions.face_mesh
  6. from pinpong.board import Board,Pin,NeoPixel
  7. NEOPIXEL_PIN = Pin.D7
  8. PIXELS_NUM = 7 #灯数
  9. Board("uno").begin()  #初始化,选择板型和端口号,不输入端口号则进行自动识别
  10. np = NeoPixel(Pin(NEOPIXEL_PIN), PIXELS_NUM)
  11. # For webcam input:
  12. drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1)
  13. cap = cv2.VideoCapture(0)
  14. Width=cap.get(3)
  15. Height=cap.get(4)
  16. i=1
  17. with mp_face_mesh.FaceMesh(
  18.     min_detection_confidence=0.5,
  19.     min_tracking_confidence=0.5) as face_mesh:
  20.   while cap.isOpened():
  21.     success, image = cap.read()
  22.     if not success:
  23.       print("Ignoring empty camera frame.")
  24.       # If loading a video, use 'break' instead of 'continue'.
  25.       continue
  26.     # Flip the image horizontally for a later selfie-view display, and convert
  27.     # the BGR image to RGB.
  28.     image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
  29.     # To improve performance, optionally mark the image as not writeable to
  30.     # pass by reference.
  31.     image.flags.writeable = False
  32.     results = face_mesh.process(image)
  33.     # Draw the face mesh annotations on the image.
  34.     image.flags.writeable = True
  35.     image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
  36.     if results.multi_face_landmarks:
  37.       for face_landmarks in results.multi_face_landmarks:
  38.         mp_drawing.draw_landmarks(
  39.             image=image,
  40.             landmark_list=face_landmarks,
  41.             connections=mp_face_mesh.FACE_CONNECTIONS,
  42.             landmark_drawing_spec=drawing_spec,
  43.             connection_drawing_spec=drawing_spec)
  44.      
  45.       up=results.multi_face_landmarks[0].landmark[159]
  46.       down=results.multi_face_landmarks[0].landmark[145]
  47.       cv2.circle(image,(int(up.x*Width),int(up.y*Height)),4,(255,0,0),-1)
  48.       cv2.circle(image,(int(down.x*Width),int(down.y*Height)),4,(255,0,0),-1)
  49.       #for i in range(0,468):#标记468个3D 面部标志。
  50.        #text=results.multi_face_landmarks[0].landmark[i]
  51.        #cv2.putText(image, str(i), (int(text.x*Width),int(text.y*Height)),cv2.FONT_HERSHEY_SIMPLEX, 0.3, (255, 0, 0), 1)
  52.       print(abs(down.y-up.y)*Height)
  53.       if(abs(down.y-up.y)*Height)>8:
  54.           for num in range(0,7):
  55.                 np[num]=(255,0,0)
  56.       else:
  57.           for num in range(0,7):
  58.                 np[num]=(0,0,0)         
  59.     cv2.imshow('MediaPipe FaceMesh', image)
  60.     if cv2.waitKey(5) & 0xFF == 27:
  61.       break
  62. cap.release()
复制代码

【智控万物】睁眼请开灯图5


【演示视频】

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail