2012-11-22 16 views
6

Ich bin neu (in C++) OpenCV und ich versuche Linienerfassung zu implementieren.OpenCV Linienerkennung im Allgemeinen

Ich habe ein Bild mit ein paar Zeilen, und ich versuche, den Abstand zwischen den Zeilen zu bestimmen. Ich weiß, dass es Hough, Canny und so weiter gibt, aber wie kann ich die Koordinaten der verschiedenen Linien erhalten, um den Abstand zwischen den Linien zu berechnen? Soll ich opencv-Konturfunktionen verwenden oder gibt es bessere Möglichkeiten? Ich brauche keine vollständigen Codebeispiele, aber kann mir irgendjemand sagen, wie ich den Job am besten erledigen kann? wenn nötig

+0

Sie müssen Ihrem Post keine Signatur hinzufügen - Ihre Benutzerkarte wird automatisch hinzugefügt. – Artemix

Antwort

13

Linienerfassungen führen oft zu verwenden Hough, Canny-Algorithmus und Konturerkennung Transformation nur als bequeme Pre-Prozessoren handeln.

Wenn parallelen Linien haben, verwenden

void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0) 

zum Erfassen Linien, wo der zweite Parameter die Erfassung enthält:

Linien - Ausgangsvektor von Linien. Jede Linie wird durch einen Zwei-Element-Vektor (ρ, θ) dargestellt. ρ ist der Abstand von der Koordinate Ursprung (0, 0) (obere linke Ecke des Bildes). θ ist die Zeilenrotation Winkel im Bogenmaß (0 ~ vertikale Linie, & pgr;/2 ~ horizontale Linie).
[opencv2refman.pdf]

Dies bedeutet, dass der Abstand zwischen zwei Linien abs(rho1-rho2) sein soll, dass die Abstände absolute Differenzen zwischen den Pixelwerten in der ersten Spalte der lines sind. (Hinweis: Methode sollte CV_HOUGH_STANDARD hier sein!)

Für nicht parallele Linien Sie müssen definieren, was man sich vorstellen als eine Entfernung, aber dann kann OpenCV Sie noch bietet mit den Koordinaten von Endpunkten jeder detektierten Linie.
Sie müssen nur method = CV_HOUGH_PROBABILISTIC verwenden.

CV_HOUGH_PROBABILISTIC probabilistische Hough-Transformation (effizientere im Fall, wenn das Bild ein paar langen linearen Segmente enthält). Es gibt Zeilensegmente statt die gesamte Zeile zurück. Jedes Segment wird dargestellt durch Start- und Endpunkte, und die Matrix muss der CV_32SC4 Typ (Die Sequenz erstellt wird).
[opencv2refman.pdf]

Sie können auch ein Tutorial in opencv_tutorials.pdf in der Dokumentation Ihres installierten OpenCV finden.

+0

danke für deine antwort! Im nächsten Schritt möchte ich eine Einschätzung der Qualität der Linien in meinem Bild erhalten. Die Linien sind Kanten von Rillen und sollten parallel sein. An mehreren Stellen ist die Nutung beschädigt und die Kanten sind nicht mehr parallel. Gibt es einen einfachen Weg, um die Abweichung einer tatsächlichen Kante von einer geraden Linie zu erhalten? – marc

+0

Huh, ich bin mir nicht sicher. Ich denke, es lohnt sich, es als separate Frage zu veröffentlichen. –

+0

Können Sie bitte abstimmen/akzeptieren, wenn meine Antwort hilft? –

Verwandte Themen