gada888 发表于 2021-12-18 17:14:38

Python+Mediapipe项目--通过手势控制音频播放

本帖最后由 gada888 于 2021-12-20 22:05 编辑

大家有没有想给朋友秀一下你的‘超能力’,你是怎么通过手势隔空控制一段音频的播放和关闭。不需要使用到手势传感,只要通过电脑或linux系统的USB摄像头就可以做到。
下面分享一下制作过程。
五指张开,打开音频

五指并拢,关闭音频

首先准备好以下硬件。

序号 产品名称 数量
1Romeo 3in1(https://www.dfrobot.com.cn/goods-54.html) 1
2 ISD1820(https://www.dfrobot.com.cn/goods-1310.html) 1
3 电脑摄像头,任何牌子都可以,要USB接口的 1






下面简单介绍一下硬件:
ISD1820录放音模块集成录放音功能为一体。板载按键和麦克风,可直接通过按键录音和放音,一按录音,一按放音。可实现10秒音频录放功能。


下面简单介绍一下软件。
编程用的ide用的是visual studio code


需要安装以下三个库文件:
opencv-python库
mediapipe库
pinpong库


介绍一下连线方式:
特别的简单,ISD1820接的是UNO上的D7.

ISD1820前置设置:
在ISD1820的REC按钮上按下,录一下自己10秒的录音。然后按下play按钮测试一下是不是OK。


项目展示效果视频:https://www.bilibili.com/video/BV1cb4y1v7a9/视频中可以看到,mediapipe识别到5根手指就会播放音频,小于5根手指就会停止播放。

下面是完整代码:
# code written by gada888 from LUOYANG,in 18-12-2021

import cv2
import mediapipe as mp
import time
from pinpong.board import Board,Pin,Tone

Board("uno","COM6").begin()

tone = Tone(Pin(Pin.D7))
tone.freq(200)

mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(max_num_hands = 1,min_detection_confidence=0.8, min_tracking_confidence=0.8)
drawing_spec = mp_drawing.DrawingSpec(color=(255, 255, 255),thickness=8, circle_radius=8)

tipIds =
cap = cv2.VideoCapture(1)
while cap.isOpened():
    prev_time = time.time()
    success, frame = cap.read()
    if not success:
      print("Ignoring empty camera frame.")
      continue
    image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    results = hands.process(image)
    lmList = []
    if results.multi_hand_landmarks:
      for hand_landmarks in results.multi_hand_landmarks:
            mp_drawing.draw_landmarks(frame, hand_landmarks,mp_hands.HAND_CONNECTIONS,drawing_spec,drawing_spec)

            for id, lm in enumerate(hand_landmarks.landmark):
                h, w, c = frame.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                lmList.append()
                # print(lmList)
                cv2.circle(frame, (cx, cy), 8, (38, 107, 170), cv2.FILLED)
                if id == 3 or id == 4:
                  cv2.circle(frame, (cx, cy), 5, (0, 0, 255), cv2.FILLED)
                  cv2.putText(frame,str(id),(cx+8, cy),cv2.FONT_HERSHEY_COMPLEX,.6,(0,0,255),1)
            if len(lmList) != 0:
                fingers = []
                # Thumb
                if lmList] > lmList - 1]:
                  print(lmList], lmList - 1])
                  fingers.append(1)
                  tone.off()
                  time.sleep(1)
                else:
                  fingers.append(0)
                  tone.on()
                  time.sleep(1)
                # 4 Fingers
                for id in range(1, 5):
                  if lmList] < lmList - 2]:
                        fingers.append(1)
                  else:
                         fingers.append(0)

                totalFingers = fingers.count(1)
                print(totalFingers)
    else:
      totalFingers = 0

    cv2.rectangle(frame, (6, 121), (114, 229), (255, 255, 255), cv2.FILLED)
    cv2.rectangle(frame, (10, 125), (110, 225), (0, 0, 0), cv2.FILLED)
    cv2.putText(frame, str(totalFingers), (30, 210), cv2.FONT_HERSHEY_PLAIN, 6, (0, 0, 255), 8)
    cv2.putText(frame, 'fps:'+str(int(1 / (time.time() - prev_time))), (3, 40), cv2.FONT_HERSHEY_PLAIN, 3, (0, 0, 255), 3)
    print(1 / (time.time() - prev_time))
    cv2.imshow('finger counter', frame)
    if cv2.waitKey(1) & 0xFF == 27:
      break
cap.release()
cv2.destroyAllWindows()




hnyzcj 发表于 2021-12-19 08:41:24

哎呀,这个不错

gada888 发表于 2021-12-20 08:36:33

本帖最后由 gada888 于 2021-12-20 08:37 编辑

{:6_202:}谢楼上,还望多指教

QQQQQQQ 发表于 2022-3-14 19:15:52

厉害厉害
页: [1]
查看完整版本: Python+Mediapipe项目--通过手势控制音频播放