Определение контура планировки квартиры OpenCV python

5 000 руб. за проект
14 октября 2022, 12:51 • 10 откликов • 75 просмотров
Есть задача: определить внешний контур планировки квартиры и получить площадь этого контура
Я покопался на просторах интернета и нашел кое-что, что дает какие-то вменяемые результаты, но не идеальные

Я подаю на вход скрипту картинку (во вложении 1_исходная картинка), на выходе получаю (во вложении картинка 1_как сейчас работает), а желаемый результат ( во вложении картинка 1_как надо)
Как я понял, проблема в том, что если на внешнем контуре есть разрывы (как правило в местах дверных проемов так бывает), то контур рисуется и внутри тоже, и получается месиво из контуров и получить адекватную площадь нереально. Также не хочется, чтобы контур обводил двери, важно, чтобы контур шел только вдоль стен, если такое возможно. Благодарен за любую помощь и консультацию
Прошу помощи с редактированием моего скрипта, чтобы результат отдавался всегда так (во вложении картинка 1_как надо)
Ниже скрипт (на python) того, что сейчас есть.

fn = './1.jpg' # путь к файлу с картинкой
image = cv2.imread(fn)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3, 3), 0)

edged = cv2.Canny(blurred, 10, 100)
# define a (3, 3) structuring element
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

# apply the dilation operation to the edged image
dilate = cv2.dilate(edged, kernel, iterations=1)

contours, _ = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
image_copy = image.copy()
# draw the contours on a copy of the original image
cv2.drawContours(image_copy, contours, -1, (0, 255, 0), 2)
len_contours = len(contours)
print(len_contours, "objects were found in this image.")
if len_contours == 1:
print(f'Площадь фигуры: {cv2.contourArea(contours[0])}')
else:
total_area = sum([cv2.contourArea(contours[n]) for n in range(len_contours)])
print(f'Площадь фигуры: {total_area}')
cv2.imshow("contours", image_copy)
cv2.waitKey(0)
Файлы
Отзывы
Спасибо, Емельян. Все четко, быстро.
ps. Отдельное спасибо за разъяснения того, как и что работает, и попытку меня научить самостоятельно делать какие-то схожие вещи)
5 месяцев назад
R50 46b04f175f94979468f2e1c5cf6f9c90
Фрилансер
 
5 месяцев назад