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.
OpenCV wird mit `` `pip install opencv-opencv``` installiert. Damit können Sie auch numpy installieren, was beim Ausführen von OpenCV unerlässlich ist.
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.
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 und zur Kantenerkennung unabhängig von der Sättigung binärisieren. Verwenden Sie insbesondere die folgende Funktion.
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
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
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))
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)
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)
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()
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.
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.
[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