2010-11-30 6 views
6

Kennt jemand den bestimmten Algorithmus für probabilistische Hough-Transformation in der OpenCV-Implementierung? Ich meine, gibt es ein Referenzpapier oder eine Dokumentation über den Algorithmus?Was ist die spezielle Implementierung der probabilistischen Hough-Transformation in OpenCV?

Um die Idee zu bekommen, kann ich sicherlich in den Quellcode schauen, aber ich frage mich, ob es irgendwelche Dokumentation darüber gibt. - Es ist nicht in den Kommentaren des Quellcodes (OpenCV 1.0).

Vielen Dank!

-Jin

Antwort

0

Hier ist ein Artikel über die Randomized Hough-Transformation, die ich glaube, die gleiche wie die „Wahrscheinlichkeits Hough-Transformation“ in OpenCV http://en.wikipedia.org/wiki/Randomized_Hough_Transform

grundsätzlich verwendet werden, müssen Sie nicht den Speicher aufzufüllen für Alle Punkte, aber wählen Sie eine Reihe von Punkten mit bestimmten Kriterien, um die Hough-Transformation zu füllen.

Die Konsequenz ist, dass Sie manchmal die tatsächliche Linie verpassen könnten, wenn es nicht genug Punkte gibt, mit denen Sie beginnen. Ich nehme an, dass Sie das verwenden möchten, wenn Sie etwas lineare Strukturen haben, so dass die meisten Punkte überflüssig wären. Referenz Nr. 2: L. Xu, E. Oja und P. Kultanan, "Eine neue Methode zur Kurvenerkennung: Randomisierte Hough-Transformation (RHT)", Pattern Recogn. Lette. 11, 1990, 331-338.

Ich lese auch über einige ziemlich unterschiedliche Ansätze, bei denen die Algorithmen zwei Punkte benötigen und den Punkt in der Mitte dieser beiden Punkte berechnen. Wenn der Punkt ein Kantenpunkt ist, würden wir den Behälter für diese Linie ansammeln. Dies ist scheinbar extrem schnell, aber Sie würden eine etwas nicht-spärliche Matrix annehmen, da Sie Zeilen leicht verpassen könnten, wenn nicht genügend Randpunkte vorhanden sind.

+0

sehr nützliche Kommentare! Vielen Dank! Ich habe mich nicht mit randomisierten Ansätzen beschäftigt, sondern eher mit "probabilistischer Hough-Transformation". – galactica

+3

Die randomisierte Hough-Transformation unterscheidet sich von der progressiven probabilistischen Hough-Transformation. Ersteres nimmt Tupel von zufälligen Punkten, die in einzelne Zellen im Hough-Raum abgebildet werden. Dies geschieht iterativ, und Linien/Ebenen werden erkannt, sobald eine Akkumulatorzelle einen Schwellenwert überschreitet. Letzteres hat einen Filtermechanismus, um Rauschen zu eliminieren, indem der Prozentsatz der Stimmen der Gesamtzahl der Stimmen, die für eine Zelle stimmen, berücksichtigt wird. Siehe: "Die 3D-Hough-Transformation zur Ebenenerkennung in Punktwolken: Ein Überblick und ein neuer Akkumulatorentwurf" von Borrmann et al. (2011) –

+1

Verstehe nicht, warum dies die akzeptierte Antwort ist? Es hat wenig, wenn überhaupt, etwas mit der OpenCV-Implementierung zu tun, die, wie oben erwähnt, die progressive probabilistische Hough-Transformation und nicht die randomisierte Hough-Transformation implementiert. –

6

Die OpenCV-Dokumentation besagt, dass der Algorithmus auf "Robuste Erkennung von Linien mit der progressiven probabilistischen Hough-Transformation" von J Matas et al basiert. Dies unterscheidet sich deutlich von dem in Wikipedia beschriebenen RHT.

Das Papier scheint nicht frei im Internet verfügbar zu sein, aber man kann es von Elsevier purcahse

2

Der Quellcode für HoughLinesProbabilistic in OpenCV 2.4.4 enthält Inline-Kommentare, die die verschiedenen beteiligten Schritte erklären.

https://github.com/Itseez/opencv/blob/master/modules/imgproc/src/hough.cpp

+0

Bitte verwenden Sie Permalinks, wenn Sie mit GitHub verlinken. Diese Datei hat sich seit der Veröffentlichung dieses Links geändert und die Zeilennummer ist nun irrelevant. GitHub macht es nicht einfach; Sie können "y" in einer Dateiansicht drücken, um den Permalink zu erhalten. – bfontaine

1

Hier ist ein ziemlich präzise Papier von Matas et.al. dass der Ansatz beschreibt, und wie andere schon erwähnt, ist es in der Tat ganz anders Randomized Hough-Transformation.

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.40.2186&rep=rep1&type=pdf

(nicht sicher, wie lange diese Verbindung wird jedoch gültig sein Es ist auf/von citeseer, Ich würde nicht erwarten, dass es morgen einfach verschwindet, aber wer weiß ...)

Ich hatte einen kurzen Blick auf die Implementierung icvHoughLinesProbabilistic() in hough.cpp, weil ich es verwenden werde :-) Es scheint ziemlich einfach Wie auch immer, mein Hauptinteresse war, ob es am Ende eine Kleinste-Quadrate-Anpassung durchführt - das ist nicht in Ordnung. Es bedeutet nur, dass, wenn es wünschenswert ist, genaue Liniensegmente zu erhalten, man die Start-/Endpunkt- und impliziten Linienparameter, die von OpenCV zurückgegeben werden, verwenden soll, um verwandte Punkte aus dem Gesamtpunktsatz auszuwählen.Ich würde zuerst eine ziemlich konservative Distanzschwelle verwenden und RANSAC/MSAC an diesen Punkten mit einer kleineren Schwelle laufen lassen. Abschließend passen Sie wie üblich eine Linie an den Inlier-Satz an, z. Verwenden von OpenCVs cvFitLine().

Verwandte Themen