Próbuję użyć OpenCV, aby zidentyfikować i wyodrębnić dość oczywisty region z obrazu. Do tej pory, stosując próg i serię rozszerzeń i erozji, mogę z powodzeniem znaleźć kontur dla wymaganego obszaru.Znajdowanie obróconego prostokąta od konturu
Jednak moje próby użycia minAreaRect
jako prekursora obrotu i przycinania nie generują prostokąta zawierającego kontur wejściowy.
contours, hierarchy = cv2.findContours(morph.copy() ,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contour = contours[0]
draw = cv2.cvtColor(morph, cv2.COLOR_GRAY2BGR)
cv2.drawContours(draw, [contour], 0, (0,255,0), 2)
rotrect = cv2.minAreaRect(contour)
box = cv2.cv.BoxPoints(rotrect)
box = numpy.int0(box)
cv2.drawContours(draw, [box], 0, (0,0,255), 2)
cv2.imshow('image', draw); cv2.waitKey(0)
Oto i przykład wyjścia:
Gdzie czerwony skok jest rect
a zielona jest contour
. Spodziewałbym się, że czerwony obrys będzie obejmował zielony obrys.
Niestety, nie mogę podać obrazu wejściowego.
W końcu napisałem własną implementację metody obracających się suwaków do znajdowania minimalnego prostokąta ograniczającego. Nadal chciałbym wiedzieć, jak znaleźć wynik za pomocą 'minAreaRect()' jednak. – thomasfedb
Nie mogę powiedzieć wiele o Pythonie, ale w C++ działa zgodnie z oczekiwaniami. Tylko kilka czeków, jeśli już tego nie zrobiłeś. 1) Nie sądzę, że problem dotyczy 'minAreaRect'. Możesz to sprawdzić, rysując okrąg w lewym górnym rogu 'rotrect' i sprawdź, czy jest to uzasadnione. 2) Spróbuj także użyć 'box = cv2.boxPoints (rect)', a nie 'cv2.cv.BoxPoints (...)'. Przepraszam, ale to wszystko, co mam. – Miki
'cv2.boxPoints (rect)' nie jest dostępne w wersji OpenCV, do której mam dostęp. Rysując punkt środkowy z 'rotrect' ustaliłem, że' minAreaRect() 'w rzeczywistości daje zły wynik. – thomasfedb