Lautstärkeregelung mit Gesten in Python / Sudo Null IT News

In diesem Artikel möchte ich über ein Projekt aus dem OpenCV-Python-Kurs sprechen. Den vollständigen Code finden Sie unter GitHub.

Die Idee ist, die Lautstärke am Computer per Gesten zu verändern. Die Lautstärke wird durch den Abstand zwischen Zeige- und Daumen eingestellt, und der gebeugte kleine Finger ist das Bestätigungssignal.

Installieren Sie zunächst alle notwendigen Bibliotheken:

pip install mediapipe pip install opencv-python pip install numpy pip install pycaw

Lassen Sie uns eine Datei erstellen und sie „HandTrackingModule.py“ nennen.

import cv2 import mediapipe as mp import time import math class handDetector(): def __init__(self, mode=False, maxHands=2, modelComplexity=1, detectionCon=0.5, trackCon=0.5): self.mode = mode self.maxHands = maxHands self.modelComplexity = modelComplexity self.detectionCon = detectionCon self.trackCon = trackCon self.mpHands = mp.solutions.hands self.hands = self.mpHands.Hands(self.mode, self.maxHands, self.modelComplexity, self.detectionCon , self.trackCon) self.mpDraw = mp.solutions.drawing_utils self.tipIds = [4, 8, 12, 16, 20]

def findHands(self, img, draw: True): imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) self.results = self.hands.process(imgRGB) if self.results.multi_hand_landmarks: für handLms in self.results. multi_hand_landmarks: if draw: self.mpDraw.draw_landmarks(img, handLms, self.mpHands.HAND_CONNECTIONS) return img def findPosition(self, img, handNo=0, draw=True): xList = []
yListe = []
bbox= []
self.lmList = []
if self.results.multi_hand_landmarks: myHand = self.results.multi_hand_landmarks[handNo]
für id, lm in enumerate(myHand.landmark): #print(id, lm) h, w, c = img.shape cx, cy = int(lm.x*w), int(lm.y*h) xList .append(cx) yList.append(cy) self.lmList.append([id, cx, cy]) if draw: cv2.circle(img, (cx, cy), 5, (255,0,255), cv2.FILLED) xmin, xmax = min(xList), max(xList) ymin, ymax = min(yList), max(yList) bbox = xmin, ymin, xmax, ymax if draw: cv2.rectangle(img, (bbox[0]-20, bbox[1]-20), (bKasten[2]+20, bbox[3]+20), (0, 255, 0), 2) return self.lmList, bbox def findDistance(self, p1, p2, img, draw=True): x1, y1 = self.lmList[p1][1]self.lmList[p1][2]

x2, y2 = self.lmList[p2][1]self.lmList[p2][2]

cx, cy = (x1+x2)//2, (y1+y2)//2 if draw: cv2.circle(img, (x1,y1), 15, (255,0,255), cv2.FILLED) cv2. circle(img, (x2,y2), 15, (255,0,255), cv2.FILLED) cv2.line(img, (x1,y1), (x2,y2), (255,0,255), 3) cv2. circle(img, (cx,cy), 15, (255,0,255), cv2.FILLED) length = math.hypot(x2-x1, y2-y1) return length, img, [x1, y1, x2, y2, cx, cy]

def fingerUp(self): Finger = []

# Thumb if self.lmList[self.tipIds[0]][1] Wenn Sie die oben beschriebene Klasse sorgfältig studieren, ist dort nichts kompliziert. Diese Klasse kann in Ihren anderen Projekten als Vorlage verwendet werden.

Kommen wir nun zum Programmcode selbst.

Bibliotheken importieren:

import cv2 import time import numpy as np import HandTrackingModule as htm import math from ctypes import cast, POINTER from comtypes import CLSCTX_ALL from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume

Kamera einrichten:

wCam, hCam = 1280, 720 # Fenstergröße cap = cv2.VideoCapture(0) cap.set(3, wCam) cap.set(4, hCam) pTime = 0

Beim Anschließen einer Kamera können Fehler auftreten, ändern Sie 0 von `cap = cv2.VideoCapture(0)` auf 1 oder 2.

Lassen Sie uns globale Variablen definieren:

Detektor = htm.handDetector(detectionCon=0.7, maxHands=1) devices = AudioUtilities.GetSpeakers() interface = devices.Activate(IAudioEndpointVolume._iid_, CLSCTX_ALL, None) volume = cast(interface, POINTER(IAudioEndpointVolume)) volRange = volume. GetVolumeRange() volume.SetMasterVolumeLevel(0, None) minVol = volRange[0]
maxVol = Volumenbereich[1]
vol = 0 volBar = 400 volPer = 0 area = 0 colorVol = (255, 0, 0)

Wir starten eine Endlosschleife und versuchen, ein Bild von der Kamera zu bekommen.

_, img = cap.read()

Finden Sie unsere Hand im Rahmen und wählen Sie sie aus:

img = Detector.findHands(img) lmList, bbox = Detector.findPosition(img, draw=True)

Für diejenigen, die die Hand nicht auswählen müssen, ändern Sie draw=True in False.

Wenn die Liste lmList nicht leer ist, können wir den Abstand zwischen Index und Daumen berechnen. Dazu wird die Methode findDistance in der oben beschriebenen Klasse handDetector implementiert.

Länge, Bild, Zeileninfo = Detector.findDistance(4, 8, Bild)

Wenn wir es so belassen, funktioniert das Ändern der Lautstärke nicht richtig, daher müssen Sie die empfangenen Parameter konvertieren:

# Volumen umwandeln volBar = np.interp(length, [50,200], [400, 150]) volPer = np.interp(Länge, [50,200], [0, 100])

Der letzte Schritt besteht darin, festzustellen, ob der kleine Finger gebogen ist, um die Änderung der Lautstärke zu bestätigen.

Wir erhalten die Position aller Finger wie folgt:

finger = detektor.fingerUp()

Wenn der kleine Finger geknickt ist, ändern Sie die Lautstärke:

wenn nicht Finger[4]: volume.SetMasterVolumeLevelScalar(volPer/100, None)

Und das langersehnte Ergebnis:

Den vollständigen Code finden Sie auf meinem Github. Dies ist mein erster Artikel und eines der ersten OpenCV-Projekte, also urteile nicht zu hart =)

Similar Posts

Leave a Reply

Your email address will not be published.