2012-11-22 10 views
6

Jestem nowym użytkownikiem opencv (w języku C++) i próbuję zaimplementować wykrywanie linii.Wykrywanie linii OpenCV ogólnie

Mam zdjęcie z kilkoma liniami i próbuję określić odległość między liniami. Wiem, że jest Hough, Canny i tak dalej, ale jak mogę uzyskać współrzędne różnych linii, aby obliczyć odległość między liniami? Czy powinienem używać funkcji konturowych opencv, czy istnieją lepsze sposoby? Nie potrzebuję pełnych próbek kodu, ale czy ktoś może mi powiedzieć, jak najlepiej wykonać tę pracę?

+0

Nie musisz dodawać podpisu do swojego posta - Twoja karta użytkownika zostanie dodana automatycznie. – Artemix

Odpowiedz

13

Detekcja linii prowadzi często do korzystania z transformacji Hough, detektor krawędzi Canny i wykrywanie obrysu działają w miarę potrzeby jako wygodne procesory wstępne.

Jeśli masz równoległe linie, użyj

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

dla linii wykrywających gdzie drugi parametr będzie zawierać wykrywania:

linii - wyjście wektor linii. Każda linia jest reprezentowana przez dwuelementowy wektor (ρ, θ). ρ jest odległością od współrzędnych początku (0, 0) (lewy górny róg obrazu). θ to kąt obrotu kąt w radianach (0 ~ linia pionowa, linia pozioma π/2 ~).
[opencv2refman.pdf]

Oznacza to, że odległość między dwie linie powinny być abs(rho1-rho2), że odległości są bezwzględnych różnic między wartościami pikseli z pierwszej kolumny lines. (Uwaga: metoda powinna być CV_HOUGH_STANDARD tutaj!)

Dla nierównoległych liniach trzeba określić, co myślisz, jak daleka, ale potem OpenCV nadal może dostarczyć ze współrzędnymi punktów końcowych każdego wykrytego linii.
Po prostu trzeba użyć method = CV_HOUGH_PROBABILISTIC.

CV_HOUGH_PROBABILISTIC probabilistyczny Hough transformacji (bardziej wydajny w przypadku, gdy obraz zawiera kilka długich segmentów liniowych). To zwraca segmenty linii zamiast całej linii. Każdy segment to reprezentowany przez punkty początkowe i końcowe, a macierz musi być (utworzona sekwencja utworzona) o typie CV_32SC4.
[opencv2refman.pdf]

Można również znaleźć tutorial w opencv_tutorials.pdf w dokumentacji zainstalowanego OpenCV.

+0

dziękuję za odpowiedź! W następnym kroku chcę uzyskać oszacowanie jakości linii na moim obrazku. linie są krawędziami rowkowania i powinny być równoległe. W kilku miejscach rowkowanie ulega zniszczeniu, a krawędzie nie są już równoległe. Czy istnieje prosty sposób na uzyskanie odchylenia rzeczywistej krawędzi od linii prostej? – marc

+0

Huh, nie jestem pewien. Myślę, że warto zamieścić go jako osobne pytanie. –

+0

Czy możesz głosować w górę/zaakceptować, jeśli moja odpowiedź pomogła? –