[PYTHON] Verfolgen Sie Objekte in Ihrem Video mit OpenCV Tracker

Wenn Sie etwas basierend auf den Markierungen und anderen Objekten tun möchten, die im Video angezeigt werden, befolgen Sie häufig das Verfahren zum Erkennen und Lokalisieren der Objekte im Rahmen mithilfe der Objekterkennungs- / Markierungserkennungsmethode. Wenn Sie jedoch auch die Objektverfolgung verwenden, können Sie möglicherweise die Erkennung von Markern und Objekten in Frames interpolieren, in denen die Objekterkennung und die Markierungserkennung fehlgeschlagen sind.

Verwenden Sie den OpenCV-Tracker, um Objekte in Ihrem Video zu verfolgen.

Da keine Umgebung erstellt werden muss, werden wir mit Google Colaboratory experimentieren.

Google Drive-Mount

Ich möchte das zu analysierende Video von Google Drive laden, also mounten Sie Google Drive.

from google.colab import drive
drive.mount("/content/gdrive")

FPS-Bezeichnung

fps = 5

Wenn Sie die FPS hoch einstellen, erhöht sich die Tracking-Genauigkeit grundsätzlich, aber auch die Verarbeitungszeit. Analysieren Sie also zuerst mit 5 FPS. Machen Sie es zu einer Variablen, damit Sie es später ändern können.

Bilder aus Videos extrahieren (in Standbilder konvertieren)

!ffmpeg -i "/content/gdrive/My Drive/TrackerExp/src.mp4" -vf fps=$fps "/content/gdrive/My Drive/TrackerExp/src/%06d.jpg "

Verwenden Sie ffmpeg, um Standbilder aus Videos zu extrahieren. Das Extraktionsziel muss nicht in Google Drive sein, aber ich versuche, es in Google Drive zu speichern, da dies praktisch ist, wenn Sie den Vorgang später überprüfen. Wenn Sie nicht darauf verweisen müssen, ist es besser, ein temporäres Verzeichnis anstelle des Verzeichnisses in Google Drive zu verwenden, da die Synchronisierungswarteschlange von Google Drive nicht verstopft ist.

Holen Sie sich eine Liste der extrahierten Bilder

import glob
import os
files = glob.glob("/content/gdrive/My Drive/TrackerExp/src/*.jpg ")
files.sort() #Sortieren Sie die gefundenen Dateien
print(len(files))

Rufen Sie eine Liste der Bilder aus dem Zielordner ab. Es gibt keine Garantie dafür, dass die abgerufenen Bilder nach Bildnummer sortiert werden. Sortieren Sie sie daher.

Erstellen Sie ein Verzeichnis, um die Analyseergebnisse zu speichern

dst_dir = "/content/gdrive/My Drive/TrackerExp/dst"
if os.path.exists(dst_dir) == False:
  os.makedirs(dst_dir)

Dieses Mal werde ich das Analyseergebnis (Tracking-Ergebnis) auf das Originalbild zeichnen und es als Bild speichern. Erstellen Sie ein Sicherungszielverzeichnis.

Geben Sie den Bereich (die Zeit) an, den Sie verfolgen möchten

start_sec = 5.0 #Die Verfolgung beginnt bei 5 Sekunden
end_sec = 15.0 #Die Verfolgung endet nach 15 Sekunden

start_frame = fps * start_sec
end_frame = fps * end_sec

Geben Sie den Bereich (die Zeit) des Videos an, das Sie verfolgen möchten. Die tatsächliche Bildnummer (von welchem Bild zu welchem Bild) ändert sich je nach FPS. Daher wird die Bildnummer berechnet, indem die Sekunden mit FPS multipliziert werden.

Tracker-Generation

tracker = cv2.TrackerMedianFlow_create()

Generieren Sie einen Tracker. Da OpenCV über mehrere andere Tracking-Algorithmen als MedianFrow verfügt, können Sie entsprechend den Eigenschaften des zu verfolgenden Videos wechseln. Beispiel: cv2.TrackerKCF_create ()

Hier posten usw. ist über den ersten und zweiten jedes Tracking-Algorithmus leicht zu verstehen.

Verfolgung der anfänglichen Positionseinstellung

start_rect = (100, 200, 30, 30) # x: 100, y: 200, width: 30, height: 30
start_img = cv2.imread(files[start_frame])
tracker.init(start_img, start_rect)

Laden Sie das Bild in den ersten Frame und geben Sie den Bereich der Objekte an, die Sie in diesem Frame verfolgen möchten.

Tracking durchführen

for i in range(start_frame, end_frame):
  frame = cv2.imread(files[i])
  located, bounds = tracker.update(frame)
  if located:
    x = bounds[0]
    y = bounds[1]
    w = bounds[2]
    h = bounds[3]
    cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)
  cv2.imwrite(os.path.join(dst_dir, os.path.basename(files[i])), frame)

Nach dem Einstellen der Ausgangsposition wird die Verfolgung Frame für Frame durchgeführt. Lesen Sie das Frame-Image mit "cv2.imread" und führen Sie das [Update] des Trackers (https://docs.opencv.org/3.4/d0/d0a/classcv_1_1Tracker.html#a549159bd0553e6a8de356f3866df1f18) für das gelesene Image aus. Gehen.

located, bounds = tracker.update(frame)

Der erste Rückgabewert der Aktualisierungsmethode lautet "Haben Sie das Ziel gefunden?". Ausgedrückt in Richtig / Falsch. Wenn gefunden, wird die Zielposition (Bereichsrechteck) im zweiten Rückgabewert in der Form "(x, y, Breite, Höhe)" festgelegt.

x = bounds[0]
y = bounds[1]
w = bounds[2]
h = bounds[3]
cv2.rectangle(frame, (int(x), int(y)), (int(x + w), int(y + h)), (255, 255, 0), 2)

Wenn das Ziel gefunden wurde, zeichnen Sie mit "cv2.rectangle" einen gelben Rahmen auf das Originalbild. Das letzte Argument "2" ist die Linienstärke.

cv2.imwrite(os.path.join(dst_dir, os.path.basename(files[i])), frame)

Speichern Sie das Ergebnis abschließend im oben erstellten Ausgabeverzeichnis.

Recommended Posts

Verfolgen Sie Objekte in Ihrem Video mit OpenCV Tracker
Loop-Video-Laden mit opencv
Versuchen Sie, Ihre eigenen Objekte mit Prioritätswarteschlangen in Python zu sortieren
Erkennen Sie Videoobjekte mit der Video Intelligence-API
Verwenden Sie OpenCV mit Python 3 in Window
Verfolgen Sie Baseballbälle mit Python + OpenCV
Ich möchte Objekte mit OpenCV erkennen
Erstellen Sie einen Videoplayer mit PySimpleGUI + OpenCV
Speichern Sie Videos Frame für Frame mit Python OpenCV
Setzen Sie OpenCV in OS X mit Homebrew ein und geben Sie Video mit Python ein / aus
Lassen Sie uns "T" in Ihrer Arbeit mit uns finden! !! !!
Verfolgen Sie grüne Objekte mit Python + Numpy (Partikelfilter)
Versuchen Sie, Videos mit OpenCV in Echtzeit zu konvertieren
So führen Sie mit OpenCV ein Null-Padding in einer Zeile durch
Schreiben Sie mit OpenCV-Python Zeichen in die Kartenillustration
So schleifen und spielen Sie ein GIF-Video mit openCV ab
Visualisieren Sie Zahlenschwankungen auf Websites mit Datadog
Zeigen Sie das Bild der USB-Kamera mit OpenCV von Python mit Raspeye an