Ein guter Ansatz zum Erkennen von Linien in einem Bild?
Ich geschrieben habe einige code, verwendet die OpenCV-Bibliotheken, zu erkennen, weiße Linien gemalt, auf gras. Ich brauche die Meinung von jemand anderem auf dem Ansatz, den ich benutzt (wie ich bin sicher, es gibt einen viel besseren Weg, als von mir). Auch die Ergebnisse, die ich bekommen hab sind nicht so gut wie ich erwartet, weil leichte Abweichungen vom Bild erfordern Feintuning der Parameter (und ich müssen für den Betrieb auf festen Parameter).
Mein Ansatz bisher:
- Greifen Bild von der webcam (und wiederum in Graustufen offensichtlich)
- Führen Sie es durch einen threshold-filter (mit THRESH_TO_ZERO-Modus, wo es null heraus alle Pixel, die UNTERHALB des Schwellenwerts).
- verwischen das Bild
- führen Sie es durch eine erosion-filter
- führen Sie es durch einen Canny-edge-Detektor
- schließlich, nehmen Sie das Bild und suchen Sie die Zeilen mit Probabilistic Hough-Transformation HoughLinesP
Sollte ich ändern, um die Reihenfolge der Filter?
P. S. ich bin nicht allzu besorgt über die Verarbeitung macht; ich bin mit den HoughLinesP auf der GPU B-)
Auch, hier ist ein Beispiel Bild:
Den Ergebnissen, die ich bekommen hab:
mit canny
OHNE canny (etwas tweaked Parameter)
Jede Hilfe oder Anleitung wäre sehr hilfreich! Ich habe nur keine Ahnung, was zu tun ist, um es zu verbessern!
UPDATE
Nach einer wirklich schnellen skeleton-Implementierung (mit TONNEN von Weichzeichner) wie pro die gewählte Antwort bekam ich dies:
InformationsquelleAutor der Frage Cashew | 2013-05-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde versuchen, eine Skelett-Darstellung des Bildes. Das problem mit dem canny, hier, ist, dass es im Grunde die Ergebnisse in zwei Zeilen, weil der Breite der Linie.
Dann würde ich gelten die Hough-Transformation.
InformationsquelleAutor der Antwort JonesV
Eine mögliche Lösung ist, nehmen Sie alle edge-Punkte, die Sie erhalten von der canny edge detection und passen eine Linie mit linear least sqaures (eventuell iterativ) auf diese Punkte. Auf diese Weise erhalten Sie eine einzige Zeile, die "am besten passt" das Kante zeigt. Es gibt praktisch keine Parametrierung an dieser Methode.
InformationsquelleAutor der Antwort Zaphod
War ich mit Canny für den innen-Bilder, aber outdoor finde ich eher geeignet, die Laplace-und Sobel-filter filtern, gelten als Probabilistische Hough-line-Transformation (PHT).
Wenn u wollen, um dicker deine Zeilen, Sie sollten versuchen, die Sobel-operator nach Laplace und schließlich der PHT. Wenn Ihr Bild ist zu neugierig, es könnte noch schlimmer werden.
InformationsquelleAutor der Antwort Elod
RANSAC
Algorithmus kann eine gute Methode. Diese Methode ist ähnlichregression
oderinterpolation
Ansätze. Sollten Sie extrahieren Sie Punkte nach der Verwendung eineredge detection
(beste Methode istcanny
für dieses Ziel, wie ich finde). Dann sollten Sie am besten Zeile. Für die Suche nach der Linie, die durch verschiedene Punkte gibt es verschiedene Methoden wie lineare regression oder RANSAC. Finden Sie die Umsetzung und Notizen überRANSAC
Algorithmus in dieser link.Beachten Sie, dass RANSAC und andere nützliche algorithmen für dieses Ziel sind
already implemented
imOpenCV
(ich weiß in der version 3.2) und inAccord NET
(eine freie Bibliothek für die Bildverarbeitung).InformationsquelleAutor der Antwort Babak.Abad
Nach Ihrem letzten Ergebnis (nach Skelett-filter), erhalten Sie viele kleine Segmente. Ich glaube, du bist wirklich in einer guten position an diesem Punkt, um das umzusetzen, was getan worden ist, in diesem Artikel:
http://www.cs.ubc.ca/~lowe/papers/aij87.pdf
Im Grunde, Sie bieten Werkzeuge, um sich neu zu formieren verschiedene Funktionen in einem Bild auf, wie wahrscheinlich Sie gehören zu einem und demselben Objekt. Also alles, was Sie würde tun müssen, ist, füttern Sie Ihre Ergebnisse auf Ihrem Algorithmus, und Sie würde wahrscheinlich eine einzige Zeile als Ergebnis.
InformationsquelleAutor der Antwort Exeko