OpenCV (Open Source Computer Vision Library) ist eine Sammlung von BSD-lizenzierten Video- / Bildverarbeitungsbibliotheken. Es gibt viele Algorithmen wie Bildfilterung, Vorlagenabgleich, Objekterkennung, Videoanalyse und maschinelles Lernen.
Beispiel für Bewegungsverfolgung mit OpenCV (OpenCV Google Summer of Code 2015) https://www.youtube.com/watch?v=OUbUFn71S4s
Klicken Sie hier für die Installation und einfache Verwendung Installieren Sie OpenCV 3 (Core + Contrib) in der Python 3-Umgebung und unterscheiden Sie zwischen OpenCV 2 und OpenCV 3 und überprüfen Sie die einfache Bedienung
Klicken Sie hier, um Standbilder zu filtern Versuchen Sie die Kantenerkennung mit OpenCV Führen Sie verschiedene Filter mit OpenCV durch (Gradient, Highpass, Laplacian, Gaussian) Extrahieren Sie Feature-Punkte mit OpenCV (AgastFeature, FAST, GFTT, MSER, AKAZE, BRISK, KAZE, ORB, SimpleBlob)
Klicken Sie hier, um Videodateien zu verarbeiten Versuchen Sie, Videos in Echtzeit mit OpenCV zu konvertieren Versuchen Sie, Webkamera- / Videokamera-Videos in Echtzeit mit OpenCV zu konvertieren
Dieses Mal werde ich versuchen, den optischen Fluss mit OpenCV in Echtzeit zu zeichnen.
Der optische Fluss ist eine Methode zum Ausdrücken des Rahmens eines Merkmalspunkts und der Differenz (des Vektors) zwischen Rahmen in einem bewegten Bild. Da die Bildrate normalerweise konstant ist, kann gesagt werden, dass sie die Geschwindigkeit von Merkmalspunkten ausdrückt. Es gibt zwei Berechnungsmethoden: eine, die den Vorlagenabgleich verwendet, und eine, die Feature-Punkte / Features verwendet. Dieses Mal werde ich einen optischen Fluss unter Verwendung von Merkmalspunkten zeichnen. Der Fluss ist wie folgt.
Betriebsumgebung
Videodaten Ich habe das mit OpenCV gelieferte Beispielvideo verwendet. OpenCV\opencv\sources\samples\data\768x576.avi
LucasKande.py
import numpy as np
import cv2
cap = cv2.VideoCapture('768x576.avi')
# Shi-Tomasi-Eckenerkennungsparameter
feature_params = dict( maxCorners = 100,
qualityLevel = 0.3,
minDistance = 7,
blockSize = 7 )
# Lucas-Parameter der Kanade-Methode
lk_params = dict( winSize = (15,15),
maxLevel = 2,
criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
#Generieren Sie 100 Farben nach dem Zufallsprinzip (generieren Sie ein zufälliges ndarray mit 100 Zeilen und 3 Spalten im Bereich von 0 bis 255).
color = np.random.randint(0, 255, (100, 3))
#Verarbeitung des ersten Frames
end_flag, frame = cap.read()
gray_prev = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
feature_prev = cv2.goodFeaturesToTrack(gray_prev, mask = None, **feature_params)
mask = np.zeros_like(frame)
while(end_flag):
#In Graustufen konvertieren
gray_next = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#Optische Durchflusserkennung
feature_next, status, err = cv2.calcOpticalFlowPyrLK(gray_prev, gray_next, feature_prev, None, **lk_params)
#Wählen Sie Merkmalspunkte aus, für die ein optischer Fluss erkannt wurde (0: nicht erkannt, 1: erkannt).
good_prev = feature_prev[status == 1]
good_next = feature_next[status == 1]
#Optischen Fluss zeichnen
for i, (next_point, prev_point) in enumerate(zip(good_next, good_prev)):
prev_x, prev_y = prev_point.ravel()
next_x, next_y = next_point.ravel()
mask = cv2.line(mask, (next_x, next_y), (prev_x, prev_y), color[i].tolist(), 2)
frame = cv2.circle(frame, (next_x, next_y), 5, color[i].tolist(), -1)
img = cv2.add(frame, mask)
#Im Fenster anzeigen
cv2.imshow('window', img)
#Drücken Sie die ESC-Taste, um den Vorgang abzuschließen
if cv2.waitKey(30) & 0xff == 27:
break
#Vorbereitung des nächsten Rahmens und Punktes
gray_prev = gray_next.copy()
feature_prev = good_next.reshape(-1, 1, 2)
end_flag, frame = cap.read()
#Verarbeitung beenden
cv2.destroyAllWindows()
cap.release()
Mit OpenCV müssen Sie nur eine Methode für die Merkmalspunktextraktion und die Berechnung des optischen Flusses aufrufen. Was für eine bequeme Welt (^^;)
Bei der Ausführung wird der optische Fluss in Echtzeit gezeichnet.
Recommended Posts