[PYTHON] Bewegungsvorlagenanalyse mit OpenCV (Erkennen von Objekten und deren Bewegungsrichtungen in Echtzeit)

Einführung

"Bewegungsvorlage" ist eine effiziente Methode zur Bewegungsextraktion, die vom MIT Media Lab (Link 1, [Link] entwickelt wurde. 2](http://alumni.media.mit.edu/~jdavis/Publications/motiontemplategradient.pdf)). Es eignet sich für Echtzeitberechnungen mit geringem Rechenaufwand. Es hat eine breite Palette von Anwendungen und kann Spielerbewegungen, Ball-, Schläger-, Schläger- und Schlägerbahnen durch Gestenerkennung und Sportübertragungen visuell anzeigen. Dieses Mal werde ich versuchen, Bewegungsvorlagen mit OpenCV 3 zu analysieren.

OpenCV 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 ★ Installieren Sie core + opencv_contrib, um die Bewegungsvorlage auszuführen.

■ 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 Zeichnen Sie den optischen Fluss in Echtzeit mit OpenCV (Shi-Tomasi-Methode, Lucas-Kanade-Methode) Objektverfolgung mit OpenCV (Verfolgen von Funktionspunkten, die von der Maus mit der Lucas-Kanade-Methode festgelegt wurden

einfache Erklärung

"Motion Template" kann auch einfach mit OpenCV realisiert werden. Hier finden Sie eine kurze Zusammenfassung der diesmal verwendeten OpenCV-Methoden.

ID Methode Überblick
(a) cv2.motempl.updateMotionHistory() Film aktualisieren
(b) cv2.motempl.calcMotionGradient() Berechnen Sie die Richtung für jede Koordinate aus dem Film
(c) cv2.motempl.calcGlobalOrientation() Berechnen Sie die Gesamtausrichtung des Films

Dieses Mal erstellen wir ein Programm, das alle (a), (b) und (c) verwendet, aber es ist auch möglich, nur die erforderlichen auszuwählen. Wenn Sie beispielsweise nur bewegte Bilder möchten, benötigen Sie (b) (c) nicht.

Die Hauptfunktionen dieses Programms sind wie folgt. --Motion wird erkannt und in Graustufen angezeigt.

Programm

motion.py


import time
import math
import cv2
import numpy as np

#Videodaten
VIDEO_DATA = "768x576.avi"
#Esc-Taste
ESC_KEY = 0x1b
#Verbleibende Bewegungsdauer(sec)
DURATION = 1.0
#Die Länge der Linie, die die Gesamtrichtung anzeigt
LINE_LENGTH_ALL = 60
#Die Länge der Linie, die die Richtung für jede Koordinate anzeigt
LINE_LENGTH_GRID = 20
#Intervall zur Berechnung der Richtung für jede Koordinate
GRID_WIDTH = 40
#Der Radius des Kreises der Linie, der die Richtung angibt
CIRCLE_RADIUS = 2

#Initialisierung des Anzeigefensters
cv2.namedWindow("motion")
#Videodaten laden
video = cv2.VideoCapture(VIDEO_DATA)

#Laden des ersten Frames
end_flag, frame_next = video.read()
height, width, channels = frame_next.shape
motion_history = np.zeros((height, width), np.float32)
frame_pre = frame_next.copy()

while(end_flag):
    #Differenzberechnung zwischen Frames
    color_diff = cv2.absdiff(frame_next, frame_pre)

    #Graustufenumwandlung
    gray_diff = cv2.cvtColor(color_diff, cv2.COLOR_BGR2GRAY)

    #Binarisierung
    retval, black_diff = cv2.threshold(gray_diff, 30, 1, cv2.THRESH_BINARY)

    #Prozessorverarbeitungszeit(sec)Erhalten
    proc_time = time.clock()

    #Bewegungsverlauf aktualisieren
    cv2.motempl.updateMotionHistory(black_diff, motion_history, proc_time, DURATION)

    #Dimmen der Anzeige alter Bewegungen im Laufe der Zeit
    hist_color = np.array(np.clip((motion_history - (proc_time - DURATION)) / DURATION, 0, 1) * 255, np.uint8)

    #Graustufenumwandlung
    hist_gray = cv2.cvtColor(hist_color, cv2.COLOR_GRAY2BGR)

    #Berechnung der Änderungsrichtung des Bewegungsverlaufsbildes
    #* Die Ausrichtung speichert den Wert (Grad) in Änderungsrichtung für jede Koordinate.
    mask, orientation = cv2.motempl.calcMotionGradient(motion_history, 0.25, 0.05, apertureSize = 5)

    #Zeichnen Sie die Bewegung jeder Koordinate mit einer grünen Linie
    width_i = GRID_WIDTH
    while width_i < width:
        height_i = GRID_WIDTH
        while height_i < height:
            cv2.circle(hist_gray, \
                       (width_i, height_i), \
                       CIRCLE_RADIUS, \
                       (0, 255, 0), \
                       2, \
                       16, \
                       0)
            angle_deg = orientation[height_i - 1][width_i - 1]
            if angle_deg > 0:
                angle_rad = math.radians(angle_deg)
                cv2.line(hist_gray, \
                         (width_i, height_i), \
                         (int(width_i + math.cos(angle_rad) * LINE_LENGTH_GRID), int(height_i + math.sin(angle_rad) * LINE_LENGTH_GRID)), \
                         (0, 255, 0), \
                         2, \
                         16, \
                         0)
            
            height_i += GRID_WIDTH
        
        width_i += GRID_WIDTH


    #Berechnen Sie die Gesamtbewegungsrichtung
    angle_deg = cv2.motempl.calcGlobalOrientation(orientation, mask, motion_history, proc_time, DURATION)

    #Zeichnen Sie die gesamte Bewegung mit einer gelben Linie
    cv2.circle(hist_gray, \
               (int(width / 2), int(height / 2)), \
               CIRCLE_RADIUS, \
               (0, 215, 255), \
               2, \
               16, \
               0)
    angle_rad = math.radians(angle_deg)
    cv2.line(hist_gray, \
             (int(width / 2), int(height / 2)), \
             (int(width / 2 + math.cos(angle_rad) * LINE_LENGTH_ALL), int(height / 2 + math.sin(angle_rad) * LINE_LENGTH_ALL)), \
             (0, 215, 255), \
             2, \
             16, \
             0)

    #Bewegtbild anzeigen
    cv2.imshow("motion", hist_gray)

    #Drücken Sie die Esc-Taste, um den Vorgang abzuschließen
    if cv2.waitKey(20) == ESC_KEY:
        break

    #Laden Sie den nächsten Frame
    frame_pre = frame_next.copy()
    end_flag, frame_next = video.read()

#Verarbeitung beenden
cv2.destroyAllWindows()
video.release()

Ausführungsergebnis

Es ist etwas schwierig, die Gesamtrichtung zu verstehen, aber wenn es sich um einen festen Rahmen handelt, wird angezeigt, in welche Richtung sich die Objekte auf dem Bildschirm insgesamt bewegen. In Fällen, in denen sich der gesamte Rahmen bewegt, gibt er die Richtung an, in die sich der Rahmen bewegt.

m1.png

Bewegungsanalyse unter Verwendung von Richtungsinformationen

Lassen Sie uns als Beispiel für die Analyse von Bewegungen mithilfe einer Bewegungsvorlage den Moment einer Aufnahme von Kei Nishikiori analysieren. Führen Sie die Analyse anhand der Richtungsinformationen durch, die aus den Bewegungsvorlageninformationen berechnet wurden. Lassen Sie uns das Bewegungsvorlagenprogramm für das Originalbild ausführen. Im Film sehen Sie die Flugbahn des Balls für jedes Bild (Film 1, Film 2). Wenn Sie die Anzahl der Kugeln zählen, ist das Motion 2-Bild 3 Frames vor dem Motion 1-Bild.

Wenn Sie die Richtung jedes Gitters für Film 1 und Film 2 analysieren, können Sie die folgenden Bewegungen lesen.

Wenn Sie es im Fernsehen sehen, sieht es so aus, als würden Sie mit Ihrem ganzen Körper springen und den Ball schlagen. Verwenden Sie jedoch in diesem Video die Feder der rechten Körperhälfte, nachdem Sie mit der linken Körperhälfte eine durchgezogene Achse erstellt haben Sie können sehen, dass Sie schlagen.

n1.png ** Original Bild **

n2.png ** Film 1 Bild **

n3.png ** Film 2 Bild **

Für diejenigen, die Sport treiben, wäre es interessant, die Bewegungen von Profis und den Unterschied zwischen den Bewegungen zu analysieren, wenn sie erfolgreich sind und wenn sie versagen.

Recommended Posts

Bewegungsvorlagenanalyse mit OpenCV (Erkennen von Objekten und deren Bewegungsrichtungen in Echtzeit)
Erstellen und testen Sie mit Docker in wenigen Minuten eine OpenCV- und Python-Umgebung
Fehler, der in OpenCV3 und seiner Lösung aufgetreten ist. Vorsichtsmaßnahmen bei Verwendung von OpenCV3 auf dem Mac
Ich habe versucht, Objekte mit Python und OpenCV zu erkennen
Versuchen Sie, Videos mit OpenCV in Echtzeit zu konvertieren