Поскольку метка синего прямоугольника на исходном изображении, карта разделена на две стороны. Но с чистым изображением проблем не будет.
В настоящее время я работаю над дополненной реальностью. Контроллер, который использует игра (я говорю здесь о физическом устройстве ввода), представляет собой одноцветную прямоугольную бумажку. Я должен определить положение, вращение и размер этого прямоугольника в потоке захвата камеры. Обнаружение должно быть инвариантным по шкале и инвариантным по вращению по осям X и Y.
Масштабная инвариантность необходима в случае, если пользователь перемещает бумагу в сторону или в сторону камеры. Мне не нужно знать расстояние прямоугольника, поэтому масштабная инвариантность переводится в размерную инвариантность.
Инвариантность вращения необходима, если пользователь наклоняет прямоугольник вдоль своей локальной оси X и / или Y. Такое вращение изменяет форму бумаги с прямоугольника на трапецию. В этом случае объектно-ориентированная ограничительная рамка может использоваться для измерения размера бумаги.
Что я сделалВ начале есть шаг калибровки. Окно показывает канал камеры, и пользователь должен нажать на прямоугольник. При щелчке цвет пикселя, на который указывает мышь, принимается как эталонный цвет. Кадры преобразуются в цветовое пространство HSV для улучшения цветопередачи. У меня есть 6 ползунков, которые регулируют верхний и нижний пороги для каждого канала. Эти пороговые значения используются для преобразования изображения в двоичную форму (с использованием OpenCVinRange
функция).
После этого я стираю и расширяю двоичное изображение, чтобы удалить шум и объединить нерби-куски (используя opencverode
а такжеdilate
функции).
Следующим шагом является поиск контуров (используя opencvfindContours
функция) в двоичном изображении. Эти контуры используются для обнаружения наименьших ориентированных прямоугольников (используя opencvminAreaRect
функция). В итоге я использую прямоугольник с наибольшей площадью.
Краткое заключение процедуры:
Возьмите рамкуПреобразовать этот кадр в HSVБинаризируйте его (используя цвет, который выбрал пользователь, и пороги от ползунков)Применить морфинг ops (разрушать и расширять)Найти контурыПолучите самую маленькую ориентированную коробочку для каждого контураВозьмите самый большой из этих ограничивающих прямоугольников в результатеКак вы могли заметить, я не пользуюсь знаниями о фактической форме бумаги, просто потому, что не знаю, как правильно использовать эту информацию.
Я также думал об использовании алгоритмов отслеживания opencv. Но было три причины, которые мешали мне их использовать:
Неизменность масштабов: насколько я читал о некоторых алгоритмах, некоторые не поддерживают разные масштабы объекта.Прогнозирование движения: некоторые алгоритмы используют прогнозирование движения для повышения производительности, но отслеживаемый объект перемещается совершенно случайно и, следовательно, непредсказуемо.Простота: я просто ищу одноцветный прямоугольник на изображении, ничего такого необычного, как отслеживание автомобиля или человека.Вот - относительно - хороший улов (двоичное изображение после размытия и расширения)
ВопросКак я могу улучшить обнаружение в целом и особенно, чтобы быть более устойчивым к изменениям освещения?
ОбновитьВот некоторые необработанные изображения для тестирования.
Разве вы не можете просто использовать более толстый материал?
Да, я могу, и я уже делаю (к сожалению, я не могу получить доступ к этим частям в настоящее время). Тем не менее, проблема все еще остается. Даже если я использую материал, как картон. Это не так легко, как бумага, но все же можно согнуть его.
Как вы получаете размер, вращение и положение прямоугольника?minAreaRect
функция opencv возвращаетRotatedRect
объект. Этот объект содержит все данные, которые мне нужны.
Заметка
Поскольку прямоугольник одноцветный, нет возможности различать верх и низ или левый и правый. Это означает, что вращение всегда в диапазоне[0, 180]
что идеально подходит для моих целей. Соотношение двух сторон прямоугольника всегдаw:h > 2:1
, Если бы прямоугольник был квадратом, диапазон вращения изменился бы на[0, 90]
, но это можно считать неактуальным здесь.
Как предлагается в комментариях, я постараюсь выровнять гистограмму, чтобы уменьшить проблемы с яркостью и взглянуть на ORB, SURF и SIFT.
Я буду в курсе прогресса.