[PYTHON] Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen

Unter den Artikeln, die ich geschrieben habe, wurden die Artikel über OpenCV und Raspberry Pi, die ich vor langer Zeit geschrieben habe, kürzlich wieder von allen gelesen. Ich denke, dass Sie sich darauf beziehen können, weil es sich um ein Schlüsselwort handelt, das sich auf "Deep Learning" und "Edge Computing" bezieht, die die jüngsten Trends sind. Wenn ich an die Situation denke, in der Edge-Computing verwendet wird, sehe ich häufig Fälle von Bewegungserkennung mit einer Kamera. Es wird als Funktion von automatischem Fahren, Robotern und Festkommakameras verwendet. Dieses Mal werde ich versuchen, eine einfache Bewegungserkennung zu implementieren, indem ich die OpenCV-Funktionen vollständig nutze.

Betriebsumgebung

OpenCV wird mit `` `pip install opencv-opencv``` installiert. Damit können Sie auch numpy installieren, was beim Ausführen von OpenCV unerlässlich ist.

Programm zum Abspielen von Videos

Erstellen Sie zunächst ein Programm zum Abspielen des Videos. Dieses Mal werde ich das Video von hier verwenden, das im offiziellen Paket von OpenCV verteilt ist. Laden Sie es im Voraus herunter und speichern Sie es im selben Ordner wie der Quellcode.

import cv2

filepath = "vtest.avi"
cap = cv2.VideoCapture(filepath)
#Klicken Sie hier, wenn Sie eine Webkamera verwenden
# cap = cv2.VideoCapture(0)

while True:
    #Holen Sie sich Frame für Frame.
    ret, frame = cap.read()
    if not ret:
        break

    #Ausgabeergebnis
    cv2.imshow("Frame", frame)
    key = cv2.waitKey(30)
    if key == 27:
        break

cap.release()
cv2.destroyAllWindows()

Hier gibt `cv2.waitKey (30)` ursprünglich die Zeit an, die auf die Tasteneingabe aus dem von OpenCV ausgegebenen Fenster gewartet werden soll. Verlangsamen Sie jedoch beim Abspielen eines Videos den Frame-Fortschritt. Es spielt auch eine Rolle dabei, zu verhindern, dass das Video schnell fließt.

Wie man Bewegung erkennt

Fügen wir nun den Bewegungserkennungscode zu dem Code hinzu, der das Video abspielt. Schauen wir uns den Algorithmus Schritt für Schritt an.

In Graustufen konvertieren

In Graustufen konvertieren und zur Kantenerkennung unabhängig von der Sättigung binärisieren. Verwenden Sie insbesondere die folgende Funktion.

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

Schneiden Sie zum Vergleich einen Rahmen aus

Definieren Sie `avg = None``` am Anfang des Quellcodes und lassen Sie ein Array von Frames zum Vergleich in avg```. Fügen Sie also den folgenden Code in die Schleife ein, die das Video ausgibt. Selbstverständlich werden die hier verbleibenden Frames in Graustufen konvertiert.

if avg is None:
   avg = gray.copy().astype("float")
   continue

Finden Sie den Unterschied zwischen dem aktuellen Bild und dem gleitenden Durchschnitt

Fügen Sie dem Bildakkumulator hinzu und ermitteln Sie den Unterschied zwischen den aktuellen Bildern. Insbesondere lautet der Code wie folgt.

cv2.accumulateWeighted(gray, avg, 0.6)
frameDelta = cv2.absdiff(gray, cv2.convertScaleAbs(avg))

Legen Sie einen Schwellenwert fest und binarisieren Sie

Stellen Sie nun den Schwellenwert ein und binärisieren Sie den Frame. Dadurch wird der Umriss des Teils, der sich gegenüber dem vorherigen Frame geändert hat, deutlich. Mit der Funktion `` `findContours``` lautet der Code wie folgt.

contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

Zeichnen Sie aus dem berechneten Schwellenwert auf den Originalrahmen

Bis zu diesem Punkt ist der Bewegungserkennungsprozess abgeschlossen. Aber wir müssen die Ergebnisse visualisieren. Verwenden Sie die Funktion `` `drawContours```, um den resultierenden Umriss auf den Rahmen zu zeichnen.

frame = cv2.drawContours(frame, contours, -1, (0, 255, 0), 3)

Vollständiges Formular

Basierend auf den oben genannten Inhalten ist das endgültig ausgefüllte Formular der folgende Quellcode.

import cv2

filepath = "vtest.avi"
cap = cv2.VideoCapture(filepath)
#Klicken Sie hier, wenn Sie eine Webkamera verwenden
# cap = cv2.VideoCapture(0)

avg = None

while True:
    #Holen Sie sich Frame für Frame.
    ret, frame = cap.read()
    if not ret:
        break

    #In Graustufen konvertieren
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    #Holen Sie sich einen Rahmen zum Vergleich
    if avg is None:
        avg = gray.copy().astype("float")
        continue

    #Berechnen Sie die Differenz zwischen dem aktuellen Frame und dem gleitenden Durchschnitt
    cv2.accumulateWeighted(gray, avg, 0.6)
    frameDelta = cv2.absdiff(gray, cv2.convertScaleAbs(avg))

    #Führen Sie eine Schwellenwertverarbeitung für Delta-Bilder durch
    thresh = cv2.threshold(frameDelta, 3, 255, cv2.THRESH_BINARY)[1]
    #Fügen Sie der Bildschwelle eine Kontur hinzu
    contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    frame = cv2.drawContours(frame, contours, -1, (0, 255, 0), 3)

    #Ausgabeergebnis
    cv2.imshow("Frame", frame)
    key = cv2.waitKey(30)
    if key == 27:
        break

cap.release()
cv2.destroyAllWindows()

Ergebnis

result.gif

Da neben der visuell sichtbaren Bewegung der Person auch der Umriss des geänderten Teils im Bild eingezeichnet ist, wird ein leichtes Verwackeln des Hintergrunds als Veränderung erkannt.

Zusammenfassung

Dieses Mal haben wir den Bewegungserkennungsprozess nur mit der OpenCV-Funktion implementiert. Ich verwende keine neuen Algorithmen, konnte aber "bewegte Dinge" leicht erkennen. Da es sich um ein einfaches System handelt, erkennt es auch sogenannte Geräusche wie Änderungen im Hintergrund. Wenn Sie also in diesem Fall nur die Bewegung von Personen oder bestimmten Objekten erfassen möchten, können Sie den Algorithmus oder das Deep Learning weiter verbessern. Muss benutzt werden.

Referenz

[Gliederung: Erster Schritt - Dokumentation zu OpenCV-Python-Tutorials 1 -](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_contours/py_contours_begin/ py_contours_begin.html) So erkennen Sie Bewegungen von einem Video (Kamera) mit OpenCV Ich habe die Bewegungserkennung mit OpenCV versucht

Recommended Posts

Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich möchte Objekte mit OpenCV erkennen
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
Ich habe versucht, Faster R-CNN mit Pytorch auszuführen
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, mit Hy anzufangen
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe versucht, CVAE mit PyTorch zu implementieren
Ich habe versucht, TSP mit QAOA zu lösen
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Ich habe versucht, Gesichtsmarkierungen mit Python und Dlib leicht zu erkennen
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, mit OpenCV eine Bewegungserkennungsüberwachungskamera mit einer WEB-Kamera mit Raspberry Pi herzustellen
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Ich habe versucht, mit TF Learn die logische Operation zu lernen
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Katze zurück mit OpenCV erkennen
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, Keras in TFv1.1 zu integrieren
Ich habe versucht, VAE Bewegungsgrafiken lernen zu lassen
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ich habe versucht zu debuggen.
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, das Überleben der Titanic mit PyCaret vorherzusagen
Ich habe versucht, Linux mit Discord Bot zu betreiben
Ich habe versucht, DP mit Fibonacci-Sequenz zu studieren
Ich habe versucht, Jupyter mit allen Amazon-Lichtern zu starten
Ich habe versucht, Tundele mit Naive Bays zu beurteilen
Versuchen Sie, Fische mit Python + OpenCV2.4 (unvollendet) zu erkennen.
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben
Ich habe versucht, mit VOICEROID2 2 automatisch zu lesen und zu speichern
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
Ich habe versucht, DCGAN mit PyTorch zu implementieren und zu lernen
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, mit VOICEROID2 automatisch zu lesen und zu speichern
Ich habe versucht, mit Blenders Python script_Part 02 zu beginnen
Ich habe versucht, ObjectId (Primärschlüssel) mit Pymongo zu generieren
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, eine ML-Pipeline mit Cloud Composer zu erstellen
Ich habe versucht, mit OpenCV Ann Man zu werden
Ich habe versucht, unsere Dunkelheit mit der Chatwork-API aufzudecken
[Einführung in Pytorch] Ich habe versucht, Cifar10 mit VGG16 ♬ zu kategorisieren