2016-04-03 23 views
0

Ich lerne gerade OpenCV und habe eine Frage zur Linienerkennung. Ich habe eine Situation, wo ich eine horizontale schwarze Linie auf einem weißen Hintergrund erkennen muss. Ich bin mir sicher, dass die Linie immer horizontal (innerhalb weniger Grad) angezeigt wird und muss erkennen, wo sich die Linie in den Bildern von der Kamera befindet.Was ist die einfachste Linienerkennungsmethode in OpenCV?

Mein Gedanke ist, da es immer horizontal ist, kann ich nur vertikal nach der "Kante" durch ein paar Spalten auf dem Bild suchen, und es gut nennen. Vielleicht schränke ich sogar die Anzahl der Pixel ein, die ich von der Kamera als zusätzlichen Geschwindigkeitsschub aufnehme.

Gibt es eine eingebaute Funktion für diese Art der Linienerkennung?

Ich brauche nicht die zusätzliche Macht, und kann mir die Bearbeitungszeit von Canny oder Hough nicht leisten, ich möchte nur eine garantierte horizontale Linie so schnell wie möglich finden.

Die Bilder (mit meiner Lösung läuft) wie folgt aussehen:

Left is thresholded image, right is solution running. Green bars are horizontal edges, red mark the tape strips I'm interested in tracking.

+0

Wenn ich verstehe, dass Sie sich ich in etwas ähnliches implementiert haben http://stackoverflow.com/questions/21675509/finding-the -fitline-of-contours-in-opencv/21677214 # 21677214 – Micka

+0

Können Sie bitte ein paar Bilder zeigen? – Miki

Antwort

0

Die Methode, mit der ich endete, ist eine for-Schleife. Nach der Schwellenwertbildung des Bildes suche ich zwei Spalten, um alle "Kanten" oder Wertänderungen zu finden. Dann verarbeite ich diese Liste, um nur horizontale Kantenpaare zu finden.

Ich finde dann alle Linien, die nahe genug zusammen sind, und haben eine gewünschte Füllung (booleschen Vergleich gegen Schwellenwertbild), die effektiv nur die Streifen des Bandes finde, die ich verfolgen möchte.

Dies dauert etwa 1/50 der Zeit von JUST the Canny Anruf, nicht einschließlich der findContours, usw., die auch notwendig sind. Ich habe zwar nicht gegen Hough getestet, aber ich glaube, das wird immer noch deutlich schneller sein.

Da das größte Problem die Verarbeitungsgeschwindigkeit war, habe ich auch einige andere Optimierungen vorgenommen.

-Code finden Sie hier (Es ist sehr gut kommentiert, das verspreche ich): Code as a gist

+0

vielleicht sollten Sie sich mit der Hough-Transformation vertraut machen. Dann musst du nicht darüber nachdenken, es überhaupt zu überdenken :) – Piglet

+0

Ferkel, ich kenne es jetzt, aber wieder, da die Verarbeitungsgeschwindigkeit ein Problem ist, brauche ich eine einfachere Lösung. Ich möchte nicht "Kantenerkennung -> Hough-Transformation -> Enthousung" machen, wenn ich im Grunde einen benutzerdefinierten Kanten-Detektor hacken kann, der mir sagt, wo horizontale Linien sind. Ich bin mir sicher, dass Hough wieder arbeitet, aber für diese Anwendung ist es überlastet und zu langsam. – DweebsUnited

+0

deshalb habe ich dir gesagt, dass du es nicht berücksichtigen musst ... – Piglet

0

Wenn Sie die Art des Bildes liefern reden Sie dann Lösung darauf hindeutet, besser sein wird.

Auch ich frage mich, warum Sie nicht Canny Detector verwenden können, die nicht so rechenintensiv ist. Außerdem können Sie Ihr Bild verkleinern, die Kanten berechnen und horizontale Kanten filtern.

Wenn Sie andererseits wissen, dass Ihre horizontalen Kanten auf der Bildebene immer horizontal sind, können Sie die Vorlage passend verwenden.