Поскольку метка синего прямоугольника на исходном изображении, карта разделена на две стороны. Но с чистым изображением проблем не будет.

не нужно

В настоящее время я работаю над дополненной реальностью. Контроллер, который использует игра (я говорю здесь о физическом устройстве ввода), представляет собой одноцветную прямоугольную бумажку. Я должен определить положение, вращение и размер этого прямоугольника в потоке захвата камеры. Обнаружение должно быть инвариантным по шкале и инвариантным по вращению по осям 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.

Я буду в курсе прогресса.

Ответы на вопрос(2)

Ваш ответ на вопрос