Objektverfolgung mit OpenCV
Die Objektverfolgung ist eine der wichtigen Aufgaben in der Computer Vision, die viele reale Anwendungen hat. Bei der Objektverfolgung versuchen wir, verschiedene Objekte anhand bestimmter Parameter zu unterscheiden und ihre Bewegung zu verfolgen.
Denken Sie daran, dass sich die Objektverfolgung von der Objekterkennung unterscheidet. Dies liegt daran, dass die Objektverfolgung viel schneller ist, da wir das Objekt nicht in jedem Frame erkennen, was die Rechenlast erhöht.
Die häufigste reale Anwendung der Objektverfolgung ist die Verfolgung der Bewegung von Fahrzeugen auf den Straßen. Wir können verschiedene Fahrzeuge identifizieren und beobachten, ob sie die Straßenverkehrsregeln einhalten oder nicht, indem wir ihre Flugbahn verfolgen.
Wir können die Bibliothek opencv
verwenden, um mit Objektverfolgungsproblemen in Python zu arbeiten. In diesem Tutorial werden die verschiedenen Tracker besprochen, die in opencv
für die Objektverfolgung verfügbar sind.
Tracker für die Objektverfolgung in OpenCV
Der erste Tracker ist der cv2.TrackerBoosting_create
basierend auf dem AdaBoost-Algorithmus des maschinellen Lernens. Es lernt anhand der positiven und negativen Samples des zu verfolgenden Objekts zur Laufzeit, hat in letzter Zeit keine gute Erfolgsbilanz und gilt als sehr langsam.
Dann haben wir den Tracker cv2.TrackerMIL_create
, der auf dem MIL-Algorithmus basiert. Es wurde als Verbesserung des BOOSTRING-Trackers entwickelt und basiert auf ähnlichen Konzepten und Faktoren in der Nähe positiver Proben, um Objekte zu unterscheiden und die Gesamtgenauigkeit zu verbessern.
Der Tracker cv2.TrackerKCF_create
basiert auf der mathematischen Herangehensweise an die überlappenden Bereiche mehrerer positiver Übereinstimmungen in einer MIL. Die vollständige Form von KCF ist Kernelized Correlation Filters, und es gilt als anständiger Tracker und funktioniert sehr gut bei der Verfolgung einzelner Objekte.
Der Tracker cv2.TrackerCSRT_create
basiert auf dem Discriminative Correlation Filter mit Kanal- und Ortszuverlässigkeit. Es filtert Teile des Frames mithilfe der räumlichen Zuverlässigkeitskarte heraus, die bei der Auswahl des erforderlichen Objekts hilft, und bietet bei niedrigeren Frameraten eine durchschlagend hohe Genauigkeit.
Der Tracker cv2.TrackerMedianFlow_create
ist ein fortschrittlicher Tracker, der darauf abzielt, Tracking-Fehler zu minimieren und den zuverlässigsten Pfad zu wählen. Ein Objekt wird in Echtzeit erfasst, seine Verschiebung für die Vorwärts- und Rückwärtsbewegung wird berechnet, und die Messung des Fehlers und der Differenz zwischen den beiden Werten wird verglichen, um die Bahn des gegebenen Objekts zu verfolgen.
Wir haben auch den Tracker cv2.TrackerTLD_create
. TLD steht für Tracking, Learning und Detecting und verfolgt die Flugbahn eines Objekts Bild für Bild. Es verwendet die Position aus dem vorherigen Frame, um das Tracking zu korrigieren und zu verbessern.
Der Detektorteil wird verwendet, um den Tracker bei Bedarf unter Verwendung des vorherigen Rahmens zu korrigieren. Es handhabt Objektüberlappungen sehr effizient.
Der Tracker cv2.TrackerMOSSE_create
, wobei MOSSE
für Minimum Output Sum of Squared Error steht, verwendet adaptive Korrelationen im Fourier-Raum, um Objekte zu verfolgen. Es verwendet diese Korrelationswerte und versucht, die Summe der quadrierten Fehler zwischen tatsächlicher und vorhergesagter Korrelation zu minimieren.
Dieser Tracker hat eine sehr hohe Tracking-Geschwindigkeit und passt sich gut an Lichtveränderungen und die Umgebung des Objekts an.
Verwenden Sie OpenCV-Objekttracker in Python
Wir werden in unserem Beispiel den Tracker cv2.TrackerKCF_create
verwenden, um ein Objekt zu verfolgen. Wir beginnen mit dem Lesen des Beispielvideos mit der Funktion capture()
.
Dann initialisieren wir eine Variable, die das Objekt verfolgt. Anfänglich wird es als None
zugewiesen und führt eine Schleife aus, die dieses Video Bild für Bild liest.
Zunächst prüfen wir, ob im vorherigen Frame ein Tracking durchgeführt wurde, und fahren damit fort, wenn die initialisierte Variable nicht None
ist. Wenn nicht, wählen wir das Objekt, das wir verfolgen möchten, mit der Funktion selectROI
aus.
Danach verwenden wir das definierte Tracker-Objekt, um dieses Objekt in jedem Frame zu verfolgen und Tracking-Informationen anzuzeigen.
Codebeispiel:
import cv2
import imutils
vid = cv2.VideoCapture("sample1.mp4")
initial_box = None
tracker = cv2.TrackerKCF_create()
while True:
fr = vid.read()
if fr is None:
break
if initial_box is not None:
(success, box) = tracker.update(fr)
if success:
(x, y, w, h) = [int(v) for v in box]
cv2.rectangle(fr, (x, y), (x + w, y + h), (0, 255, 0), 2)
fps.update()
fps.stop()
information = [
("Success", "Yes" if success else "No"),
("FPS", "{:.3f}".format(fps.fps())),
]
for (i, (k, v)) in enumerate(information):
text = "{}: {}".format(k, v)
cv2.putText(
fr,
text,
(10, H - ((i * 20) + 20)),
cv2.FONT_HERSHEY_SIMPLEX,
0.6,
(0, 0, 255),
2,
)
cv2.imshow("Output Frame", fr)
key = cv2.waitKey(1) & 0xFF
initial_box = cv2.selectROI("fr", fr, fromCenter=False, showCrosshair=True)
tracker.init(fr, initial_box)
fps = FPS().start()
cv2.destroyAllWindows()
Fazit
Wir haben die verschiedenen Algorithmen besprochen, die für die Objektverfolgung verwendet werden und in der Bibliothek opencv
verfügbar sind. Zuerst haben wir die Objektverfolgung und ihre Verwendung im wirklichen Leben besprochen.
Dann haben wir die acht verfügbaren Tracker der opencv
-Bibliothek ausführlich besprochen und einen Beispielcode zum Umgang mit der Objektverfolgung mit diesen Trackern.
Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.
LinkedIn