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.
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 = 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.
!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.
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.
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.
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 = 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.
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.
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