Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
17 / 13 / 5
Регистрация: 10.03.2016
Сообщений: 144

Как выделить контур здания и подсчитать количество этажей на фото?

12.05.2021, 15:29. Показов 2971. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый день) Недавно мне дали задание по фотографии определить этажность любого многоэтажного дома на фото, используя технологии Python. Но я в этом языке, да и в направлении распознавания объектов по изображению полный новичок.
По изучал немного OpenCV и попытался с помощью метода cv2.Canny выделить контуры здания, получить их с помощью cv2.findContours cv2.drawContours отрисовать. Чтобы с чего-то начать так скажем) По игрался с замыливанием например cv2.GaussianBlur, но толком не получается получить контуры здания. Понимаю, что подход примитивен) Но с чего то надо было начать.
Подскажите пожалуйста в каком направлении копать? Какие алгоритмы по изучать для этого? А также если есть готовые методы для решения этой задачи, напишите пожалуйста о них.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.05.2021, 15:29
Ответы с готовыми решениями:

Как можно выделить контур человека на фото?
Добрый день. Подскажите , пжл, нужно в андроид приложение сделать возможность вырезать фото человека по контуру и подставлять это фото...

Посчитать количество цифр во всех номерах этажей многоэтажного здания
Помогите написать программу на с++....

Сеть предприятия: 2 здания по 5 этажей
Нужна помощь в расчете этой сети. Кому интересно - делаю в качестве учебного проекта. Итак, предприятие состоит из 2 зданий по 5 этажей,...

11
102 / 85 / 25
Регистрация: 21.05.2019
Сообщений: 481
12.05.2021, 15:32
Направление правильное, функции и класс тоже верный, покажи фото на котором надо найти, сделаю
И желательно в пеите нарисуй что должно быть
1
17 / 13 / 5
Регистрация: 10.03.2016
Сообщений: 144
12.05.2021, 15:40  [ТС]
RSAX, фото зданий по сути любые. Вот привел пару примеров обычных домов. Конечная задача определять этажность зданий. Что в итоге по интерфейсу должно получиться это уже на мое усмотрение. Там четких задач нет.
Миниатюры
Как выделить контур здания и подсчитать количество этажей на фото?   Как выделить контур здания и подсчитать количество этажей на фото?  
0
102 / 85 / 25
Регистрация: 21.05.2019
Сообщений: 481
12.05.2021, 16:54
Kolyan1997, Не, не сделаю, чисто на opencv автоматизированно не сделать, надо будет для каждой фотки вручную hsv подбирать
Как вариант взять нейросеть по поиску окон на домах
Дальше получаешь координаты всех окон, находишь список координат которые находятся на одном уровне по оси y и считаешь количество элементов в этом массиве

Вот статья в помощь, но там особо полезного нету, но и альтернативы тоже нет
habr.com/ru/post/422867

Добавлено через 55 секунд
Могу ещё код дать чтобы быстро находить нужные тебе параметры для hsv
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import cv2 as cv
import cv2 as cv
import numpy as np
from functools import partial
 
MIN_SUFFIX = " min"
MAX_SUFFIX = " max"
 
 
class _ColorspaceFilter:
    """Base class for colorspace filter display & trackbar window.
    Not meant to be instantiated directly, but subclassed."""
 
    def __init__(self, img, name="Filter Window"):
        self.name = name
        self.img = img.copy()
        self.converted = self.converter(img)
        self.lowerb = np.array(self.channel_mins)
        self.upperb = np.array(self.channel_maxes)
 
    def _update_lowerb(self, channel, pos):
        self.lowerb[channel] = pos
        self._update()
 
    def _update_upperb(self, channel, pos):
        self.upperb[channel] = pos
        self._update()
 
    def _update(self):
        """This method updates the image inside the window.
        The window does not need to be redrawn with waitKey()."""
        self.mask = cv.inRange(self.converted, self.lowerb, self.upperb)
        self.masked = cv.bitwise_and(self.img, self.img, mask=self.mask)
        cv.imshow(self.name, self.masked)
 
    def _initialize_window(self):
        """Creates the window."""
        cv.namedWindow(self.name, cv.WINDOW_NORMAL)
        for i, (chname, min_, max_) in enumerate(
            zip(self.channel_names, self.channel_mins, self.channel_maxes)
        ):
            cv.createTrackbar(
                chname + MIN_SUFFIX,
                self.name,
                min_,
                max_,
                partial(self._update_lowerb, i),
            )
            cv.setTrackbarMin(chname + MIN_SUFFIX, self.name, min_)
            cv.createTrackbar(
                chname + MAX_SUFFIX,
                self.name,
                max_,
                max_,
                partial(self._update_upperb, i),
            )
        self._update()
 
    def show(self):
        """Only calls waitKey() to draw the window.
        Image updates are drawn via imshow() in _update()."""
        self._initialize_window()
        while True:
            print("Press [q] or [esc] to close the window.")
            k = cv.waitKey() & 0xFF
            if k in (ord("q"), ord("\x1b")):
                cv.destroyWindow(self.name)
                break
 
 
class BGRFilter(_ColorspaceFilter):
    converter = staticmethod(lambda img: img)
    channel_names = ["B", "G", "R"]
    channel_mins = [0, 0, 0]
    channel_maxes = [255, 255, 255]
 
 
class HSVFilter(_ColorspaceFilter):
    converter = staticmethod(partial(cv.cvtColor, code=cv.COLOR_BGR2HSV))
    channel_names = ["H", "S", "V"]
    channel_mins = [0, 0, 0]
    channel_maxes = [180, 255, 255]
 
 
class HLSFilter(_ColorspaceFilter):
    converter = staticmethod(partial(cv.cvtColor, code=cv.COLOR_BGR2HLS))
    channel_names = ["H", "L", "S"]
    channel_mins = [0, 0, 0]
    channel_maxes = [180, 255, 255]
 
 
class LabFilter(_ColorspaceFilter):
    converter = staticmethod(partial(cv.cvtColor, code=cv.COLOR_BGR2Lab))
    channel_names = ["L", "a", "b"]
    channel_mins = [0, 1, 1]
    channel_maxes = [255, 255, 255]
 
 
class LuvFilter(_ColorspaceFilter):
    converter = staticmethod(partial(cv.cvtColor, code=cv.COLOR_BGR2Luv))
    channel_names = ["L", "u", "v"]
    channel_mins = [0, 1, 1]
    channel_maxes = [255, 255, 255]
 
 
class YCrCbFilter(_ColorspaceFilter):
    converter = staticmethod(partial(cv.cvtColor, code=cv.COLOR_BGR2YCrCb))
    channel_names = ["Y", "Cr", "Cb"]
    channel_mins = [0, 0, 0]
    channel_maxes = [255, 255, 255]
 
 
class XYZFilter(_ColorspaceFilter):
    converter = staticmethod(partial(cv.cvtColor, code=cv.COLOR_BGR2XYZ))
    channel_names = ["X", "Y", "Z"]
    channel_mins = [0, 0, 0]
    channel_maxes = [255, 255, 255]
 
 
class GrayscaleFilter(_ColorspaceFilter):
    converter = staticmethod(partial(cv.cvtColor, code=cv.COLOR_BGR2GRAY))
    channel_names = ["L"]
    channel_mins = [0]
    channel_maxes = [255]
 
choices = {
    "bgr": BGRFilter,
    "hsv": HSVFilter,
    "hls": HLSFilter,
    "lab": LabFilter,
    "luv": LuvFilter,
    "ycc": YCrCbFilter,
    "xyz": XYZFilter,
    "gray": GrayscaleFilter,
}
 
if __name__ == "__main__":
 
    img = cv.imread('home1.jpg')
    window = choices["hsv"](img)
    window.show()
    cv.destroyAllWindows()
1
17 / 13 / 5
Регистрация: 10.03.2016
Сообщений: 144
12.05.2021, 21:12  [ТС]
RSAX, спасибо за совет и за код) По поводу нейросети по поиску окон... Не могли бы вы подсказать в каком направлении по изучать(какие-нибудь алгоритмы и технологии для этого), чтобы сузить мой поиск? Если знаете конечно

Добавлено через 1 час 31 минуту
RSAX, или можете пожалуйста для одной картинки сделать(чисто распознать контур самого здания), чтобы я использовал как образец для остальных?
0
5517 / 2870 / 571
Регистрация: 07.11.2019
Сообщений: 4,761
12.05.2021, 22:34
Лучший ответ Сообщение было отмечено Kolyan1997 как решение

Решение

Kolyan1997, попробуйте обычное Фурье преобразование для вертикальных столбцов. Возможно так получится выделить периодические структуры - этажи и определить их число. Может быть подойдут вейвлеты для этих целей.
1
17 / 13 / 5
Регистрация: 10.03.2016
Сообщений: 144
12.05.2021, 23:09  [ТС]
u235, не подскажите, в общих чертах, как получить данные из изображения для работы с преобразованием Фурье?
0
5517 / 2870 / 571
Регистрация: 07.11.2019
Сообщений: 4,761
12.05.2021, 23:42
Изображение переводите в оттенки серого, берете столбец (или столбцы), делаете np.fft.fft, берете модуль, ищите более менее выраженые пики.

Добавлено через 15 минут
Кстати, можно также автокорреляцию попробовать..
1
26 / 24 / 1
Регистрация: 29.06.2018
Сообщений: 199
13.05.2021, 16:21
u235, самое просто я бы попробовал сделать каскады окон, или обучить нейросеть на их поиск...
1
17 / 13 / 5
Регистрация: 10.03.2016
Сообщений: 144
13.05.2021, 16:23  [ТС]
tityanos, спасибо за совет. А можете в общих чертах сказать, что мне для этого по изучать, чтобы сузить радиус поиска? Что значит каскады окон?
1
5517 / 2870 / 571
Регистрация: 07.11.2019
Сообщений: 4,761
13.05.2021, 20:45
Kolyan1997, каскады Хаара. https://docs.opencv.org/3.4/db... ifier.html
2
26 / 24 / 1
Регистрация: 29.06.2018
Сообщений: 199
14.05.2021, 00:17
Kolyan1997, если получиться верно детектить окна, то логично, что получиться определить этажность... по каскадам Хаара, как выше заметили информации полно, задачу в целом можно решить по разному
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.05.2021, 00:17
Помогаю со студенческими работами здесь

Canvas. Выделение этажей здания
Нужно научится выделять неровные объекты, например этаж здания. Что бы можно было повесить события на выделенную область. Наткните на...

Как по фото определить высоту или длину здания?
Что нужно: например, с 4 этажа я сфотографировал землю - словом есть фото. Как мне по этому фото узнать высоту сфотографированной части...

Как выделить цветом значения, абсолютная величина которых больше 10, и подсчитать количество таких значений
Помогите срочно пожалуйста сделать! Напишите в среде Excel макрос, который в выделенном диапазоне ячеек должен выполнять заданные...

Выделить контур изображения
Выделить контур изображения путем замены каждого пикселя на разность его значения и значения соседнего пикселя, смещённого на 5 в право....

Выделить из строки слова и подсчитать их количество
Помогите с решением пожалуйста Строку на слова: Дана строка символов. Определить, сколько в ней слов и напечатать их в столбик. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru