2016-10-29 2 views
3

Ich verwende SIFT für die Merkmalserkennung und calcOpticalFlowPyrLK für die Merkmalverfolgung in Bildern. Ich arbeite an Bildern mit niedriger Auflösung (590x375 nach dem Zuschneiden), die von Microsoft kinect stammen.Feature-Tracking funktioniert bei Bildern mit niedriger Auflösung nicht richtig

// feature detection 
cv::Ptr<Feature2D> detector = cv::xfeatures2d::SIFT::create(); 
detector->detect(img_1,keypoints_1); 
KeyPoint::convert(keypoints_1, points1, vector<int>()); 

// feature tracking 
vector<float> err; 
Size winSize=Size(21,21); 
TermCriteria termcrit=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01); 
calcOpticalFlowPyrLK(img_1, img_2, points1, points2, status, err, winSize, 1, termcrit, 0, 0.001); 

Ich laufe dies auf consective Bildern von stationärer Szene (nur Idee zu bekommen) aus derselben Kameraposition mit einer Geschwindigkeit von 30 Bildern pro Sekunde aufgenommen. Für die Augen sehen Bilder gleich aus, aber irgendwie kann calcOpticalFlowPyrLK die gleichen Funktionen nicht von einem Bild zum anderen verfolgen. Die Position (x, y-Koordinaten) sollte in der erkannten Funktion und der verfolgten Funktion identisch sein. Irgendwie ist es nicht.

Gemäß AldurDisciple Vorschlag, ich denke, ich erkenne Rauschen als Funktionen. Die schwarzen Bilder unten sind Unterschiede zwischen den konsuktiven Elementen, zeigt Rauschen. Die nächsten sind Originalbilder und dann Bilder mit erkannten Merkmalen.

Mein Ziel ist es, Informationen zu verwenden, um Veränderungen der Roboterposition über die Zeit zu finden.

benutzte ich

GaussianBlur(currImageDepth, currImageDepth, Size(9,9), 0, 0); 

für Lärm, aber es hat nicht geholfen.

Find complete code in here enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

+1

Drucken Sie die Abstände (L2-Norm) zwischen den Eingabe- und Ausgabepunkten und prüfen Sie, ob sie sinnvoll sind. Wenn die Bewegungen klein sind, können Sie die Größe des Suchfensters reduzieren und überprüfen. Zeichnen Sie auch die FAST-Schlüsselpunkte in Ihrem Bild und sehen Sie, ob sie für das Tracking gut genug sind. – dhanushka

+0

Ich zeichnete Linien zwischen erkannten und verfolgten Koordinaten. Es macht Sinn, wenn ich die Kamera bewege, aber wenn ich das nicht kann, sehe ich immer noch ein paar Zeilen, die mir ein falsches Ergebnis liefern. Ich habe versucht, einen Kreis um die erkannten Punkte zu ziehen, sie ergaben für mich keinen Sinn. – Ruturaj

+1

Wenn es keine Bewegung gibt, welcher Anteil der Punkte zeigt eine Bewegung und was ist mit ihrer Größe? Möglicherweise können Sie diese Informationen verwenden, um diese Bewegungen zu verwerfen. Auf jeden Fall ist es vielleicht nicht möglich, Fehlalarme loszuwerden. FAST wurde entwickelt, um in Echtzeit ausgeführt zu werden, und ist möglicherweise nicht sehr genau. Verwenden Sie einen Detektor wie SIFT oder SURF und vergleichen Sie die Qualität der Schlüsselpunkte. Möglicherweise können Sie die FAST-Parameter basierend auf diesem Vergleich anpassen, wenn Sie FAST verwenden müssen. – dhanushka

Antwort

3

Ich denke, es gibt zwei Faktoren, die Sie berücksichtigen sollen:

  1. Ihre Szene besteht im Wesentlichen aus drei homogenen Regionen, damit die FAST Punkte in diesen Regionen werden durch Rauschen wahrscheinlich in dem Bild erzeugt werden. Da das Rauschmuster in zwei aufeinanderfolgenden Bildern vollständig unterschiedlich sein kann, kann die beste Übereinstimmung für einige der Punkte an einer vollständig anderen Position in dem Bild sein.

  2. Ihr Bild hat bereits eine recht niedrige Auflösung und die 3 in der Parameterliste der calcOpticalFlowPyrLK Funktion bedeutet, dass Sie die Funktion benötigen, um die Punkte mit einer Pyramide von 4 Ebenen zu verfolgen. Dies bedeutet, dass die Punkte zuerst in dem Bild verfolgt werden, das um einen Faktor 2^3 = 16 (dh ~ 36x23 Bild) skaliert ist, dann in dem Bild um einen Faktor 2^2 = 8 (dh ~ 73x46 Bild) und so weiter . Eine anfängliche Auflösung von 36x23 ist viel zu niedrig für ein Bild mit fast keiner Textur.

Ihr Problem zu lösen, können Sie nur zwei Pyramidenstufen (d passieren 1 statt 3) oder auch nur eine einzige Ebene (das heißt passieren 0 statt 3) zu verwenden versuchen. Bedenken Sie jedoch, dass das Geräuschproblem impliziert, dass Sie im Allgemeinen immer ein paar falsche Übereinstimmungen haben.

Auf der anderen Seite, Tracking-Punkte in einer statischen Szene ohne Kamera Bewegung scheint sehr viel wie ein künstliches Problem.In realen Szenarien werden Sie wahrscheinlich mehr daran interessiert sein, Bewegung in der Szene oder eine statische Szene mit einer beweglichen Kamera zu verfolgen. In diesem Fall ist es sinnvoll, mehrere Pyramidenebenen zu verwenden.

+0

Ich versuche jetzt Bilder zu glätten, der Roboter bewegt sich an vielen Stellen und das Bild war eines der Beispiele. Mein Hauptziel ist es, Bewegung zu verfolgen, aber ich erhielt Werte ungleich Null für stabile Bilder, was mich denken ließ, dass mein Ergebnis mit Bewegung auch Fehler haben wird. Der Roboter bewegt sich sehr langsam und erfasst Bilder mit 30 FPS. Ich verarbeite Bilder und komme dann zum nächsten, ich verarbeite nicht alles wenn nicht möglich. Wie viele Pyramidenebenen sollte ich verwenden? Außerdem habe ich FAST durch SIFT ersetzt und SURF jetzt ausprobiert. Ich habe auch Zugang zu Tiefenbildern, wird es funktionieren, wenn ich Tiefenbild anstelle von aktuellem RGB wählen möchte? – Ruturaj

+0

Ich zeichnete Kreise um erkannte Merkmale, sie sind meistens in Ecken, oder wo sich 2 Ebenen treffen, sehr wenige (2-4) waren in homogenen Regionen. Ich subtrahierte aufeinanderfolgende Bilder und ich bekam etwas Rauschen (keine Nullwerte), wo sich Ebenen treffen oder dunklere Bereiche. Ich werde morgen früh Bilder hinzufügen. – Ruturaj

Verwandte Themen