Как сканировать данные контура комнаты с плана этажа, используя OpenCV или глубокое обучение?

Я хочу найти точные контурные данные каждой комнаты, такие как спальни и гостиные, используя OpenCV и Python, но не могу сделать это хорошо. Может быть, использовать CNN?

Я пытался использовать cv2.erode, cv2.dilate и cv2.findContours.

Вот пример плана этажа для сканирования: введите описание изображения здесь Я действительно ожидаю, что результат содержит все пространство специальной комнаты, включая мебель, но не может содержать пространство в других комнатах, таких как спальня не может вмещать в себя пространство гостиной, а контур не может содержать изгибов. Я исключаю вот так: введите здесь описание изображения

Вот мой код на питоне:

import cv2
import random
img = cv2.imread('./lj_hx/zz.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

cv2.imshow("thresh", thresh)

mor_img = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, (5, 5), iterations=3)

_, contours, _ = cv2.findContours(mor_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

sorted_contours = sorted(contours, key=cv2.contourArea, reverse=True)

for c in sorted_contours[1:]:
    area = cv2.contourArea(c)
    if area > 6000:
        cv2.drawContours(img, [c], -1, (random.randrange(0, 255), random.randrange(0, 256), random.randrange(0, 255)), 3)

cv2.imshow("mor_img", mor_img)
cv2.imshow("img", img)

cv2.waitKey(0)

person lj w    schedule 29.12.2018    source источник
comment
Прикрепите изображение прямо к сообщению, его будет легче читать, а также это предотвратит проблемы с неработающими ссылками в будущем.   -  person Victor Anuebunwa    schedule 29.12.2018
comment
Опубликуйте свой код, чтобы показать нам, что вы уже сделали/пробовали.   -  person Niels Henkens    schedule 29.12.2018
comment
Вам понадобится порог размера, чтобы в вашем векторе сохранялись только более крупные контуры, превышающие определенный размер.   -  person Suleiman    schedule 29.12.2018
comment
Отредактируйте свой код в своем вопросе и убедитесь, что он имеет правильный отступ   -  person barny    schedule 29.12.2018
comment
@VictorAnuebunwa извините, я новее и у меня недостаточно репутации   -  person lj w    schedule 29.12.2018
comment
@Niels Henkens желает вам помощи, спасибо   -  person lj w    schedule 29.12.2018
comment
Порога размера @Suleiman недостаточно, я не могу получить нормативный контур   -  person lj w    schedule 29.12.2018
comment
@NielsHenkens, спасибо, что ответили на мой вопрос, я редактирую его снова, я действительно не могу его решить, прошу вас помочь   -  person lj w    schedule 30.12.2018
comment
@NielsHenkens except for 1 bedroom, where the bed is not included Я просто хочу решить такие проблемы, мне очень нужны данные контура, на комнату должна быть включена внутренняя мебель   -  person lj w    schedule 30.12.2018


Ответы (1)


Какую именно часть вы «не можете [...] сделать хорошо»? Я попробовал ваш код, начертил области в центре комнат, и это выглядит довольно хорошо (за исключением 1 спальни, где кровать не включена). Вы это имели в виду, или вы не зашли так далеко?

import cv2
import random
img = cv2.imread('./lj_hx/zz.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

cv2.imshow("thresh", thresh)

mor_img = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, (3, 3), iterations=3)

contours, hierarchy = cv2.findContours(mor_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # I addapted this part of the code. This is how my version works (2.4.16), but it could be different for OpenCV 3 

sorted_contours = sorted(contours, key=cv2.contourArea, reverse=True)

for c in sorted_contours[1:]:
    area = cv2.contourArea(c)
    if area > 6000:
        print area
        cv2.drawContours(img, [c], -1, (random.randrange(0, 255), random.randrange(0, 255), random.randrange(0, 255)), 3)
        x, y, w, h = cv2.boundingRect(c) # the lines below are for getting the approximate center of the rooms
        cx = x + w / 2
        cy = y + h / 2
        cv2.putText(img,str(area),(cx,cy), cv2.FONT_HERSHEY_SIMPLEX, .5,(255,0,0),1,cv2.CV_AA)

cv2.imshow("mor_img", mor_img)
cv2.imshow("img", img)
cv2.waitKey(0)
person Niels Henkens    schedule 29.12.2018