2012-04-15 19 views
21

Ich fand eine similar question im Forum. Aber die Antwort dort beantwortet meine Frage nicht.Feature-Tracking mit optischen Fluss

  • Wenn I Merkmalserfassungs tun (goodFeaturesToTrack) nur einmal auf dem ersten Bild und dann verwenden optischen Fluss (calcOpticalFlowPyrLK), um diese Funktionen zu verfolgen, das Problem ist: Nur die auf dem ersten Bild erkannt Merkmale können verfolgt werden. Wenn diese Funktionen über das Bild hinausgehen, gibt es keine zu verfolgenden Funktionen.

  • Wenn ich Feature-Erkennung für jedes neue Bild bin, ist die Feature-Tracking nicht stabil, da das zuletzt erkannte Feature dieses Mal möglicherweise nicht erkannt wird.

Ich verwende optischen Fluss für 3D-Rekonstruktion. Ich bin also nicht daran interessiert, welche Funktionen zu verfolgen, sondern es interessiert mich nur, ob Features im Sichtfeld stabil verfolgt werden können. Zusammenfassend, meine Frage ist: Wie kann ich den optischen Fluss verwenden, um alte Funktionen zu verfolgen, und in der Zwischenzeit neue Bildfunktionen hinzufügen, die in das Sichtfeld kommen und alte Features entfernen, die über das Sichtfeld gehen?

+0

Da es in dieser alten Frage nicht erwähnt wurde, tut die Python-Version von lkdemo etwas mehr als sein Gegenstück C++, überprüfen Sie es, lösen Sie dies für einige: https://github.com/npinto/opencv/blob /master/samples/python/lkdemo.py –

Antwort

17

Mehrere Ansätze sind möglich. Eine gute Methode geht wie folgt:

  1. in Frame 1 N Merkmale erfassen, ist dies der Keyframe m = 1
  2. in Rahmen k durch optischen Fluss
  3. in Rahmen k die Eigenschaften verfolgen, wenn die Zahl erfolgreich verfolgt Merkmale fällt unter N/2:
    • Dieser Rahmen ist der Keyframe m + 1
    • berechnen die Homographie oder die fundamentale Matrix beschreibt, die Bewegung zwischen die Keyframes m und m + 1
    • N Merkmale erkennen und die alten
    • k verwerfen: = k + 1 Gehe zu 2

Bei diesem Verfahren grundsätzlich die Kamera Bewegung schätzen zwischen den letzten zwei Keyframes.

Da Sie nicht erwähnt haben, was Ansatz für die 3D-Rekonstruktion verwendet wird, habe ich angenommen, entweder H oder F ersten geschätzte Bewegung berechnet werden. Um sie genau zu schätzen, sollte die Grundlinie zwischen den Keyframes so breit wie möglich sein. Im Allgemeinen ist die beste Strategie das grobe Bewegungsmodell der Kamera zu berücksichtigen. Wenn die Kamera von Hand gehalten wird, sollte eine andere Strategie verwendet werden, als wenn die Kamera auf der Oberseite eines Autos oder Roboters befestigt ist. Ich kann ein minimales funktionierendes Beispiel in Python zur Verfügung stellen, wenn das hilft, lassen Sie mich wissen.

+0

Vielen Dank. Es scheint eine gute Lösung zu sein. Ich arbeite mit C++. Also vielen Dank für das großzügige Angebot. – Shiyu

+0

@fireant Danke für die Antwort. Ich würde mich freuen, wenn du mir ein Python-Beispiel liefern könntest? – Clive

+0

@Clive, das ist fast 2 Jahre zu spät, aber ich hoffe, das hilft jemandem! [Code] (http://pastebin.com/X1dpwT9q) Die Magie passiert in den Zeilen post die Kommentarzeile auf Update-Funktionen. Der Großteil des Quellcodes entspricht der OpenCV-Dokumentation, die [hier] (http://docs.opencv.org/trunk/d7/d8b/tutorial_py_lucas_kanade.html) gelesen werden kann. –

3

Nur für Dokumentationszwecke gibt es mehrere gute GPU/C++ - Implementierungen der optischen Ablaufverfolgung. Ihr Code ist möglicherweise besser für Ihre Zwecke, aber wenn Sie nur die Ausgabedaten der Tracks benötigen, sollten Sie eine der folgenden Quellen überprüfen: here, here oder here.

0

Es gibt eine weitere gute Möglichkeit, den vorhandenen neue Funktionen hinzuzufügen. Sie können eine Maske in cv::goodFeaturesToTrack() übergeben. Sie würden also eine neue Matte (gleiche Größe wie das Originalbild, type: CV_8UC1) erstellen, alle Pixel auf 255 setzen und jeden Feature-Punkt als schwarzen Kreis in diese Matte zeichnen. Wenn Sie diese Maske an goodFeaturesToTrack() übergeben, werden diese schwarzen Kreise von der Funktion übersprungen.

Ich würde auch empfehlen, die Anzahl der Funktionen zu begrenzen. Nehmen wir an, Sie beschränken es auf MAX_FEATURES = 300. Sie überprüfen dann jeden Zyklus, ob Sie weniger Spuren als haben. Falls du dies tust, suche nach bis zu z neuen Features wie oben beschrieben und füge sie deinem Feature-Container hinzu.

Beachten Sie auch, dass Sie Funktionen bei fehlgeschlagenem Tracking aktiv löschen müssen. Sie müssen daher die Statusausgabe von calcOpticalFlowPyrLK betrachten.

+0

Dies ist ein sehr netter Ansatz, aber ich habe festgestellt, dass die Verwendung einer Maske langsamer ist als die Verwendung des gesamten Bildes. Ich kann es nicht glauben, aber das passiert zumindest in Version 3.2. – Pablo