[PYTHON] Zeichnen Sie den optischen Fluss in Echtzeit mit OpenCV (Shi-Tomasi-Methode, Lucas-Kanade-Methode)

Einführung

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.

Optischer Fluss

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.

  1. Erkennen Sie Feature-Punkte für das vorherige Bild. Dieses Mal werden die Merkmalspunkte mit der Shi-Tomashi-Methode erkannt. Verwenden Sie cv2.goodFeaturesToTrack ().
  2. Der optische Fluss der Merkmalspunkte im vorherigen Bild wird nach der Lucas-Kanade-Methode vom Typ Bildpyramide unter Verwendung der Informationen des vorherigen und des nächsten Bilds berechnet. Verwenden Sie cv2.calcOpticalFlowPyrLK ().
  3. Zeichnen Sie einen optischen Fluss auf den Rahmen.
  4. Wiederholen Sie die Schritte 2 und 3.

Programm

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 (^^;)

Ausführungsergebnis

Bei der Ausführung wird der optische Fluss in Echtzeit gezeichnet.

result1.png

result2.png

result3.png

result4.png

Recommended Posts

Zeichnen Sie den optischen Fluss in Echtzeit mit OpenCV (Shi-Tomasi-Methode, Lucas-Kanade-Methode)
Versuchen Sie, Videos mit OpenCV in Echtzeit zu konvertieren
Versuchen Sie, Webkamera- / Videokamera-Videos in Echtzeit mit OpenCV zu konvertieren
Holen Sie sich die Standardausgabe in Echtzeit mit dem Python-Unterprozess
Holen Sie sich YouTube Live-Chat-Felder in Echtzeit mit API
Schreiben Sie Diagramme in Echtzeit mit Matplotlib auf dem Jupyter-Notizbuch
Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu beschreiben
Zeichnen Sie eine Aquarellillusion mit Kantenerkennung in Python3 und openCV3
Verwenden Sie OpenCV mit Python 3 in Window
Zeichnen Sie eine Illustration mit Python + OpenCV
Zeichnen Sie Figuren mit OpenCV und PIL
Implementierte Inter-Frame-Differenzmethode mit OpenCV
Zeichnen Sie einen Pfeil (Vektor) mit opencv / python
So generieren Sie QR-Code und Barcode in Python und lesen ihn normal oder in Echtzeit mit OpenCV