Пусть дана фотография с изображением стула и дверного проема. Требования к фотографиям:
Стул и дверной проем должны помещаться на фотографию полностью, включая все края и углы
Дверной проем:
- дверь, находящаяся в дверном проеме закрыта
- проем располагается на изобращении вертикально, с допустимой погрешностью 0.2 радиан
- проем имеет параллельныые вертикальные грани
- освещение за дверным проемом слабее, чем в помещении съемки
- цвет двери не черный
Стул:
- обладает 4 параллельными ножками, сиденьем и спинкой
- закругление спинки допустимо максимально на 0.2 радиан
- выполнен из твердого материала и не меняет своей формы
- предполагается, что стул не может быть выше двери
- стул стоит на одной плоскости с дверью, не может висеть в воздухе или стоять на других предметах
- стул должен сохранять устойчивое положение без помощи других предметов или лиц
Помимо стула и дверного проема на изображении не должно быть других предметов, которые можно переместить; стена и пол вокруг проема должны быть максимально однородны и не иметь ярко-выраженных внутренних контуров (таких как рисунки на обоях и т.д.) Освещенность сцены должна быть однородна и гарантировать отсутствие темных или засвеченных областей, то есть таких, в которых невозможно распознать детали
Требуется установить, пролезает ли данный стул через дверной проем, если его нести так как сфотографировано на изображении. На выход алгорити выдает ответ 'да' или 'нет', а так же дополнительные вычисленные сведения о ширине дверного проема и стула.
- Склонировать/скачать репозиторий на локальную машину.
- Открыть репозиторий с помощью VSCode
Необходиммые модули:
- cv2
- numpy
- skimage
- matplotlib
- os
Задача состоит из трех частей:
- Определение дверного проема на изображении и вычисление его ширины
- Определение стула на изображении и вычисление его ширины
- Определение ответа на вопрос задачи
Определение дверного проема на изображении
Для определения дверного проема подходит алгоритм преобразования Хафа, находящий прямые линии на изображении. Среди всех линий, найденных алгоритмом выберем только вертикальные путем фильтрации угла наклона с допустимой погрешностью. На изображении, не подвергшемся предобработке могут присутствовать вертикальные линии, не относящиеся к дверному проему, например вызванные очертаниями стула или фонового рисунка и их нужно не учитывать. Закрытая дверь в дверном и слабое освещение за ним создают точную темную границу, получить которую можно с помощью бинаризации изображения цветом, а именно, оставив только темные участки. Таким образом можно получить четко-выраженную границу дверного проема и несколько других небольших темных областей, которые не влияют на нахождение вертикальных линий с помощью преобразований Хафа. В ситуации, когда алгоритм получает больше чем две вертикальные линии, возможно накладывающиеся друг на друга, для нахождения ширины двери используется расстояние между самыми удаленными друг от друга линиями.
Определение стула на изображении
Итерация 1: поиск контура шаблона на изображении - способ помогает определить местоположение стула, но находит только его часть, для дальнейшего использования нужно определять всю область, в которую включен стул
Итерация 2: поиск особых точек и сравнение с шаблоном - не работает, так как особые точки стула на имеющихся данных плохо определятся
Идея: отказаться от использования шаблонов
Плюсы:
- пользователю нужно предоставлять меньше данных, нет необходимости получать доступ к стулу для формирования шаблонов
- нет привязки к "стулу" как к конкретному объекту, можно определять проходимость любых объектов через дверной проем, так как в постановке задачи сказано, что на изображении не должо быть лишних объектов
Минусы:
- если неоходимо ответить на вопрос, является ли найденный объект стулом, то можно детектировать только "классические стулья"
Реализация идеи:
- Применение оператора Кенни:
Как видно на иллюстрации, оператор Кенни позволяет точно выделить основные контуры, которые можно разделить на контуры двери, плинтуса, угла стены, стула, выключателей, фурнитуры и шума.
Необходимо определить и убрать все контуры, кроме контура стула.
- Применение преобразования Хафа. Данный алгоритм позводит выделить большие прямые линии, к которым относятся контуры двери, плинтуса, угла стены, а значит белые пиксели, которые принадлежат этим прямым можно удалить.
- Осталось отделить контуры выключателей, фурнитуры и шума от контуров стула Можно заметить, что замкнутые области этих контуров гораздо меньше области стула, а значит, если от пикселя в радиусе R не находится других пикселей, то этот пиксель также можно удалить. Каким образом определить R? Единственной информацией, которой мы владеем про размеры предметов на изображении является ширина двери. Поэтому R будет зависеть от ширины двери. Примем R равной 1/4 от ширины двери, так как на практике стул редко может быть меньше половины дверного проема, значит все, что меньше половины дверного проема не является стулом и значит эти контуры можно удалить.
Таким образом на изображении останется только контур стула. Определив прямоугольник, в который он помещается, можно рассчитать ширину и дать ответ на вопрос задачи. Так же изначально можно выделить характерные особенности стула и проверять, является ли данный объект стулом.