Manuelles Überwachungssystem mit OpenCV

Inhalt

Dieser Artikel wurde im Rahmen der Data Science Blogathon

OpenCV ist eine Bibliothek für Computer Vision-Anwendungen. Mit Hilfe von OpenCV, Wir können eine große Anzahl von Anwendungen erstellen, die in Echtzeit besser funktionieren. Es wird hauptsächlich für die Bild- und Videoverarbeitung verwendet.

Weitere Informationen zu OpenCV erhalten Sie hier (https://opencv.org/)

Zusammen mit OpenCV, Wir werden die MediaPipe-Bibliothek verwenden.

MedienRohr

MedienRohr ist ein Framework, das hauptsächlich zum Erstellen von Audio verwendet wird, Video oder beliebige Zeitreihendaten. Mit Hilfe des MediaPipe-Frameworks, Wir können sehr beeindruckende Pipelines für verschiedene Medienverarbeitungsfunktionen bauen.

Einige der Hauptanwendungen von MediaPipe.

  • Mehrhand-Tracking
  • Gesichtserkennung
  • Objekterkennung und -verfolgung
  • Objektron: Erkennung und Verfolgung von 3D-Objekten
  • AutoFlip: automatische Video-Trimm-Pipeline, etc.

Modelo de hito de mano

Grundsätzlich, MediaPipe verwendet ein Single-Shot-Handflächenerkennungsmodell und, einmal getan, führt eine genaue Ortung des Schlüsselpunktes von . durch 21 3D-Koordinaten der Handfläche im erkannten Handbereich.

MediaPipe-Pipeline verwendet mehrere Modelle, als Handflächenerkennungsmodell, das einen handorientierten Begrenzungsrahmen aus dem Vollbild zurückgibt. Der zugeschnittene Bildbereich wird einem Handheld-Referenzmodell zugeführt, das vom Handflächendetektor definiert wird, und liefert High-Fidelity-3D-Handheld-Schlüsselpunkte.

Jetzt implementieren wir das Hand-Tracking-Modell.

Installieren Sie die erforderlichen Module

-> pip instalar opencv-python

-> pip installiere mediapipe

Zuerst, Lassen Sie uns die Funktion der Webcam überprüfen.

CV2 importieren
Importzeit
cap = cv2.VideoCapture(0)
pZeit = 0
während wahr:
    Erfolg, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    cTime = time.time()
    fps = 1 / (cZeit - pTime)
    pZeit = cZeit
    cv2.putText(img, f'FPS:{int(fps)}', (20, 70), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    cv2.imshow("Prüfen", img)
    cv2.waitKey(1))
1424745-5875185

Der obige Code zeigt ein Popup an, wenn eine Webcam an Ihren PC angeschlossen ist, und zeigt auch die Bilder pro Sekunde an (fps) in der oberen linken Ecke des Ausgabefensters.

Beginnen wir nun mit der Umsetzung. Importieren Sie die erforderlichen Module und initialisieren Sie die erforderlichen Variablen.

CV2 importieren
import mediapipe als mp
Importzeit
cap = cv2.VideoCapture(0)

mpHands = mp.solutions.hands
Hände = mpHands.Hands(static_image_mode=Falsch,
                      max_num_hände=2,
                      min_detection_confidence=0.5,
                      min_tracking_confidence=0.5)
mpDraw = mp.solutions.drawing_utils

pZeit = 0
cZeit = 0

Im obigen Code-Schnipsel, wir deklarieren ein Objekt namens “Hände” von mp.solutions.hand Hände erkennen, Ursprünglich, wenn du in die klasse schaust “Hände()“, Die Anzahl der zu erkennenden Hände ist auf eingestellt 2, die minimale Erkennungssicherheit ist auf eingestellt 0.5 und die minimale Tracking-Konfidenz ist auf eingestellt 0.5. Und wir werden verwenden mpDraw um die wichtigsten Punkte zu zeichnen.

Jetzt schreiben wir eine while-Schleife, um unseren Code auszuführen.

während wahr:
    Erfolg, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    Ergebnisse = Hände.Prozess(imgRGB)
    #drucken(results.multi_hand_landmarks)
    if results.multi_hand_landmarks:
        für handLms in results.multi_hand_landmarks:
            für id, lm aufzählen(handLms.landmark):
                #drucken(Ich würde,lm)
                h, w, c = Bildform
                cx, cy = int(lm.x *w), int(lm.y*h)
                #wenn id ==0:
                cv2.circle(img, (cx,cy), 3, (255,0,255), cv2.FILLED)

            mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)

    cTime = time.time()
    fps = 1/(cTime-pTime)
    pZeit = cZeit

    cv2.putText(img,str(int(fps)), (10,70), cv2.FONT_HERSHEY_PLAIN, 3, (255,0,255), 3)

    cv2.imshow("Bild", img)
    cv2.waitKey(1)

Hier, im obigen Code, Wir lesen die Webcam-Frames und konvertieren das Bild in RGB. Dann erkennen wir die Hände im Rahmen mit Hilfe von “hände.prozess () ” Funktion. Sobald die Hände erkannt werden, Wir werden die Schlüsselpunkte lokalisieren und dann die Punkte an den Schlüsselpunkten mit hervorheben cv2.circle, und verbinden Sie die wichtigsten Punkte mit mpDraw.draw_landmarks.

Der vollständige Code ist unten angegeben

CV2 importieren
import mediapipe als mp
Importzeit
cap = cv2.VideoCapture(0)

mpHands = mp.solutions.hands
Hände = mpHands.Hands(static_image_mode=Falsch,
                      max_num_hände=2,
                      min_detection_confidence=0.5,
                      min_tracking_confidence=0.5)
mpDraw = mp.solutions.drawing_utils

pZeit = 0
cZeit = 0

während wahr:
    Erfolg, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    Ergebnisse = Hände.Prozess(imgRGB)
    #drucken(results.multi_hand_landmarks)

    if results.multi_hand_landmarks:
        für handLms in results.multi_hand_landmarks:
            für id, lm aufzählen(handLms.landmark):
                #drucken(Ich würde,lm)
                h, w, c = Bildform
                cx, cy = int(lm.x *w), int(lm.y*h)
                #wenn id ==0:
                cv2.circle(img, (cx,cy), 3, (255,0,255), cv2.FILLED)

            mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)


    cTime = time.time()
    fps = 1/(cTime-pTime)
    pZeit = cZeit

    cv2.putText(img,str(int(fps)), (10,70), cv2.FONT_HERSHEY_PLAIN, 3, (255,0,255), 3)

    cv2.imshow("Bild", img)
    cv2.waitKey(1)

Die Ausgabe ist:

6647846-4774798
Manuelle Ausgabe des Tracking-Modells

Jetzt erstellen wir ein Hand-Tracking-Modul, damit wir es in anderen Projekten verwenden können.

Erstellen Sie eine neue Python-Datei. Zuerst, erstellen wir eine Klasse namens Handdetektor mit zwei Memberfunktionen darauf, Anrufe findHände Ja findPosition.

Die Funktion findHände akzeptiert ein RGB-Bild und erkennt die Hand im Rahmen, lokalisiert die Schlüsselpunkte und zeichnet die Referenzpunkte, die Funktion findPosition gibt Ihnen die Position der Hand zusammen mit der Identifizierung.

Später, die Hauptfunktion, in der wir unser Modul initialisieren und auch eine while-Schleife schreiben, um das Modell auszuführen. Hier können Sie diese Konfiguration oder das Modul in jedes andere verwandte Projekt importieren.

Der vollständige Code ist unten angegeben

CV2 importieren
import mediapipe als mp
Importzeit
Klasse HandDetektor():
    def __init__(selbst, Modus = Falsch, maxHände = 2, ErkennungCon = 0.5, trackCon = 0.5):
        self.mode = mode
        self.maxHands = maxHands
        self.detectionCon = detectionCon
        self.trackCon = trackCon

        self.mpHands = mp.solutions.hands
        self.hands = self.mpHands.Hands(Selbstmodus, self.maxHands, self.detectionCon, self.trackCon)
        self.mpDraw = mp.solutions.drawing_utils
        
    def findHände(selbst,img, Unentschieden = Wahr):
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        self.results = self.hands.process(imgRGB)
        # drucken(results.multi_hand_landmarks)

        wenn self.results.multi_hand_landmarks:
            für handLms in self.results.multi_hand_landmarks:
                wenn zeichnen:
                    self.mpDraw.draw_landmarks(img, handLms, self.mpHands.HAND_CONNECTIONS)
        zurück img

    def findPosition(selbst, img, handNr = 0, Unentschieden = Wahr):

        lmliste = []
        wenn self.results.multi_hand_landmarks:
            myHand = self.results.multi_hand_landmarks[handNein]
            für id, lm aufzählen(myHand.landmark):
                h, w, c = Bildform
                cx, cy = int(lm.x * w), int(lm.y * h)
                lmlist.append([Ich würde, cx, cy])
                wenn zeichnen:
                    cv2.circle(img, (cx, cy), 3, (255, 0, 255), cv2.FILLED)
        lmlist zurückgeben

def main():
    pZeit = 0
    cZeit = 0
    cap = cv2.VideoCapture(0)
    Detektor = HandDetektor()

    während wahr:
        Erfolg, img = cap.read()
        img = detektor.findHands(img)
        lmlist = Detector.findPosition(img)
        wenn len(lmliste) != 0:
            drucken(lmliste[4])

        cTime = time.time()
        fps = 1 / (cZeit - pTime)
        pZeit = cZeit

        cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)

        cv2.imshow("Bild", img)
        cv2.waitKey(1)


wenn __name__ == "__hauptsächlich__":
    hauptsächlich()

Die Ausgabe ist die gleiche wie oben gezeigt, zusammen mit den verfolgten Handpositionen.

8826047-9873258

Der vollständige Code ist auch verfügbar hier.

Referenz:

https://www.youtube.com/watch?v=NZde8Xt78Iw

https://google.github.io/mediapipe/

Mich LinkedIn

Vielen Dank.

Die in diesem Artikel gezeigten Medien sind nicht Eigentum von DataPeaker und werden nach Ermessen des Autors verwendet.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.