2014-06-06 10 views
7

Z moich eksperymentów kąt zwracany przez zmienną kątową RotateRect wynosi od -90 do 0 stopni, co nie jest wystarczające do określenia, czy obiekt jest pochylony w lewo czy w prawo.Kąt obrotu RotatedRect OpenCV nie zapewnia wystarczających informacji

Na przykład, jeśli kąt wynosi -45 stopni, nie możemy powiedzieć, czy musimy obrócić o 45 lub 45 stopni, aby go usunąć.

Fragment kodu używam:

RotatedRect rotated_rect = minAreaRect(contour); 
float blob_angle_deg = rotated_rect.angle; 
Mat mapMatrix = getRotationMatrix2D(center, blob_angle_deg, 1.0); 

Krzywa obiekt w jednym kierunku dostaję kątów od 0 do -90 stopni, podczas gdy opierając się obiekt w innym kierunku dostaję kątów od - 90 do 0 stopni.

Jak znaleźć kąt, o który należy obrócić obraz, aby go wyprostować?

Odpowiedz

12

Po zapoznaniu się z Sebastian Schmitz i Michaela Burdinov odpowiada na to jak ja rozwiązałem:

RotatedRect rotated_rect = minAreaRect(contour); 
float blob_angle_deg = rotated_rect.angle; 
if (rotated_rect.size.width < rotated_rect.size.height) { 
    blob_angle_deg = 90 + blob_angle_deg; 
} 
Mat mapMatrix = getRotationMatrix2D(center, blob_angle_deg, 1.0); 

Więc w rzeczywistości, kąt RotatedRect za nie dostarcza wystarczającej ilości informacji dla poznania kątem obiektu, należy również użyć RotatedRect użytkownika size.width i size.height.

3

Przełączanie wartości szerokości i wysokości prostokąta jest takie samo jak obracanie o 90 stopni. Więc jeśli zakres kątów byłby 180 stopni zamiast 90 niż ten sam prostokąt, miałby 2 reprezentacje (szerokość, wysokość, kąt) i (wysokość, szerokość, kąt + 90). Mając zakres 90 stopni, możesz reprezentować każdy prostokąt i możesz to zrobić tylko w jeden sposób.

3

Wyjaśniłem, jak można zamienić kąt prostokąta na [0-180] w this thread.

Kąt jest zawsze obliczany wzdłuż dłuższego boku.