Коррекция изображения для проецирования на поверхность с помощью OpenCV - PullRequest
5 голосов
/ 18 января 2012

Как лучше всего применять OpenCV для коррекции изображения, проецируемого на 3D-поверхность, как в моих примерах или показано в Проекция на 3D-поверхность ?

Мои первые тесты с обнаружением угла шахматной доски OpenCV выглядели не очень многообещающе. Если угол камеры был слишком крутым, изображение было слишком искажено или слишком мало (слишком далеко), то угол не был обнаружен. Также, если на шахматной доске было слишком много полей.

Моя идея заключалась в том, чтобы использовать алгоритм, подобный тому, который используется в 3D-сканерах для обнаружения поверхностей (объектов), но я не знаю, возможно ли это с OpenCV. Даже если это было бы невозможно с OpenCV, какие алгоритмы используются для такого сканирования объектов?

Эти изображения показывают, как это выглядит без каких-либо исправлений. Uncorrected projection on surface

Зеленые прямоугольники являются исправленными проекциями. Corrected projection (green)

1 Ответ

2 голосов
/ 18 января 2012

Маркеры, которые я использовал для ProCamCalib , должны обнаруживаться более надежно, чем шаблон шахматной доски.Вы можете использовать ARToolkitPlus как с ProCamCalib, но есть и другие альтернативы, или вы можете сделать свой собственный маленький детектор.:) Затем, с обнаруженными угловыми координатами маркеров, мы можем калибровать таким же образом, используя остальные функции калибровки OpenCV.

И я тоже могу делать с ним классные вещи, как показано настраница ProCamTracker .

РЕДАКТИРОВАТЬ: Теперь, когда я лучше понимаю вопрос, мы можем сделать это для статичных сцен довольно легко, хотя OpenCV нам не сильно поможет.Сначала мы помещаем камеру в положение, из которого мы бы хотели, чтобы зритель увидел исправленную проекцию.Затем мы проецируем двоичные шаблоны (которые выглядят как локально мигающие точки) и собираем изображения этих шаблонов точек.(Мы можем сделать их более плотными, пока они не превратятся в столбики, метод, известный как структурированный свет.) После обнаружения изображений с камеры и декодирования этих точек в двоичные коды мы получаем пиксельные соответствия проектора камеры <->, а также некоторое количество вершин.во всяком случае, и оттуда это 100% графика.Вот статья, в которой эти шаги рассматриваются более подробно:

Zollmann, S., Langlotz, T. and Bimber, O.
Пассивно-активная геометрическая калибровка для зависимых от вида проекций на произвольные поверхности
http://140.78.90.140/medien/ar/Pub/PAGC_final.pdf
Демонстрационное видео: http://140.78.90.140/medien/ar/Pub/PAGC.avi

РЕДАКТИРОВАТЬ 2: проецируя какой-то шаблон, мы можем определить координаты пикселей в изображении проектора, которые соответствуют данному пикселю в изображении с камеры,Мы часто используем временные точечные шаблоны, потому что их легко обнаружить и декодировать ... И на самом деле, OpenCV может пригодиться для этого.То, как я думаю, я бы попытался сделать это, пойдет примерно так.Давайте возьмем только 2 бита для простоты.Таким образом, у нас есть четыре изображения: 00, 01, 10 и 11. Так как мы контролируем изображение проектора, мы знаем их, но мы должны найти их и в изображении с камеры.Сначала я возьму последнее (камера) изображение 11 и вычту его из первого (камеры) изображения 00, используя cvAbsDiff (), затем оцифрую результат с помощью cvThreshold () и найду контуры (или пятна) в двоичном файле.изображение с помощью cvFindContours ().Мы должны убедиться, что каждый контур имеет соответствующую область с помощью cvContourArea (), в то время как мы можем найти его центроид с помощью cvMoments ().Тогда мы можем начать делать вещи с другими изображениями.Для каждого контура я бы попытался использовать cvBoundingRect () для cvCountNonZero () пикселей в других (также бинаризованных с помощью cvThreshold () camera) изображениях внутри этих ограничивающих прямоугольников, которые мы можем установить с помощью cvSetImageROI ().Если ненулевое число велико, это должно быть зарегистрировано как 1, если нет, то 0.

Как только у вас есть все биты, у вас есть код, и все готово.

...