Определение контура планировки квартиры OpenCV python
5 000 руб. за проект
Есть задача: определить внешний контур планировки квартиры и получить площадь этого контура
Я покопался на просторах интернета и нашел кое-что, что дает какие-то вменяемые результаты, но не идеальные
Я подаю на вход скрипту картинку (во вложении 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)
Я покопался на просторах интернета и нашел кое-что, что дает какие-то вменяемые результаты, но не идеальные
Я подаю на вход скрипту картинку (во вложении 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. Отдельное спасибо за разъяснения того, как и что работает, и попытку меня научить самостоятельно делать какие-то схожие вещи)