Grundsätzlich möchte ich ein Objekt erkennen und es dann in einem Video (Bild für Bild) verfolgen.
Ich kann es auf dem ersten Frame mit zum Beispiel ORB oder SIFT erkennen. Aber für die nächsten Frames (oder die nächsten XX Frames) möchte ich vermeiden, alle Keypoints (ORB oder SIFT) erneut zu berechnen, um sie wieder zu erkennen.
Wenn ich es in Echtzeit in Echtzeit verfolgen möchte, was kann ich tun?
Eine häufige Option ist die Verwendung eines Patchtrackers . Das bedeutet, dass Sie in einem Bereich von beispielsweise 8 Pixel um den vorherigen Frame-Schlüsselpunkt herum nach Schlüsselpunkten suchen. Sie können cv::matchTemplate()
eines Bereichs ausführen, der den Schlüsselpunkt umgibt, anstatt SIFT zu verwenden.
Durch die Durchführung einer Pyramidensuche wird die Bildrate verbessert. Sie suchen zuerst auf einer niedrigeren Skala, wenn Sie den Schlüsselpunkt nicht finden, verdoppeln Sie die Skala.
Wenn der Patchtracker fehlschlägt, weil sich das Bild zu schnell bewegt, müssen Sie das System lediglich neu initialisieren, indem Sie SIFT erneut anwenden. Ich würde FAST anstelle von SIFT verwenden. Sie können SIFT für die Markierung verwenden und dann FAST, um Schlüsselpunkte in Echtzeit zu erkennen und SIFT-Deskriptoren zu erzeugen.
Das Erkennen und Verfolgen eines Objekts in einem Video ist ein sehr großes Thema, und die Art und Weise, wie Sie vorgehen, hängt stark von Ihrer Anwendung ab. Es gibt kein Wundermittel! Wenn Sie den Erkennungsteil erreichen, können Sie versuchen, mit der Wahrscheinlichkeit der Farbwahrnehmung (möglicherweise HSV-Farbraum) zu tracken, wenn das Objekt, das Sie verfolgen möchten, farbig ist, oder versuchen Sie den Vorlagenabgleich, oder .. Sie müssen genauer auf Ihre sein braucht.
Sie können OpticalFlow für einfaches Tracking verwenden, hier sind die Schritte dazu ...
Finden Sie die Ecken eines sich bewegenden Objekts mit dem Harris Corner Detector oder dem SIFT Feature Detector.
Geben Sie diese Ecken und das vorherige Bild (in dem Sie die Ecken des zu verfolgenden Objekts gefunden haben) und das nächste Bild mit der Funktion opticalflow an, berechnet die Ecken des gleichen Objekts in den nächsten Bildern.
Hier sind die Links:
HINWEIS: Wenn Sie Probleme wie die Handhabung von Okklusionen, die Verfolgung mehrerer Personen und dann OpticalFlow alleine lösen, können Sie Probleme nicht lösen. Dafür müssen Kalman-Filter oder Partikelfilter eingesetzt werden ...
Tags und Links c++ opencv object-detection tracking