#python #opencv
#python #opencv
Вопрос:
У меня есть несколько несовершенных прямоугольников на изображении, мне нужен набор координат для каждого прямоугольника в python с использованием opencv
Я пробовал хитроумное обнаружение краев и использовал findContours, но это дает больше координат, чем требуется, потому что прямоугольники не имеют прямых линий
Я читал похожие вопросы, но я не получаю правильных результатов. Не могли бы вы, пожалуйста, предоставить решение с кодом?
исходное изображение после точного определения края
Как получить только внутренние границы прямоугольников из хитрых краев? Поскольку для каждого прямоугольника есть двойная граница, это дает большее количество прямоугольников, чем требуется.
image = cv2.imread(OUTPUT_FILE)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.blur(gray, (5,5))
kernel = np.ones((5, 5), np.uint8)
closing = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)
edged = cv2.Canny(closing, 30, 200)
cv2.imshow("Canny", edged)
contours, hierarchy = cv2.findContours(edged, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
print(len(contours))
for c in contours:
rect = cv2.minAreaRect(c)
box = cv2.boxPoints(rect)
for p in box:
pt = (p[0],p[1])
plt.scatter(p[0],p[1])
plt.show()
Комментарии:
1. Набор из 12 координат — это 10 маленьких прямоугольников и два больших внешних?
2. да, правильно… и с помощью этого кода я получаю несколько координат для одного прямоугольника, как вы можете видеть на изображении
Ответ №1:
Я думаю, что эту проблему можно было бы решить с помощью findContours(), в зависимости от вашей версии OpenCV, она возвращает несколько значений, но одно из них всегда — это контуры, то есть список всех точек контура. Один из советов, который я часто использую, заключается в том, что я вычисляю центр тяжести всех точек контура. Это означает, что я суммирую все точки по координате x, суммирую их и делю на длину списка контуров для этого конкретного контура, и делаю то же самое для координаты y.
Вы также можете использовать функцию boundingRect(), которая выдаст вам координаты x, y верхнего левого угла ограничивающей рамки, а также ее ширину и высоту. По ссылке выше вы можете найти действительно хороший учебник по этой теме. Я думаю, что эта функция лучше подходит для вашей проблемы.
Удачи!