как найти координаты прямоугольников из изображения в python с opencv?

#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 верхнего левого угла ограничивающей рамки, а также ее ширину и высоту. По ссылке выше вы можете найти действительно хороший учебник по этой теме. Я думаю, что эта функция лучше подходит для вашей проблемы.

Удачи!