2012-01-18 5 views
5

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

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

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

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

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

+0

Какие данные вы ищите? –

+0

Первое спасибо за ваш ответ. Можете ли вы объяснить некоторые основы того, как обнаружить искажение (алгоритм). Затем, если данные коррекции каким-то образом найдены, какие методы OpenCV лучше всего использовать для коррекции? К сожалению, документация OpenCV очень плохая. – bkausbk

+0

Хорошо, я бы сначала что-то прояснил. Зеленые прямоугольники, которые вы показываете как «исправленные», как они точно корректируются? Кажется, что они не соответствуют всем, что я вижу на скриншоте ... Кстати, на этом сайте есть много подробностей о таких вещах: http://www.vision.caltech.edu/bouguetj/calib_doc/ и в эта книга «Многомерная геометрия в компьютерном зрении» http://www.robots.ox.ac.uk/~vgg/hzbook/, это хорошие ссылки. В любом случае, дайте мне знать, как вы квалифицируете эти зеленые прямоугольники как «исправленные», спасибо –

ответ

2

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

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

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

Zollmann С., Langlotz, Т. и Bimber, О.
Passive-Active Геометрическая Калибровка зависит от вида проекции на произвольных поверхностях
http://140.78.90.140/medien/ar/Pub/PAGC_final.pdf
Демо-видео: http://140.78.90.140/medien/ar/Pub/PAGC.avi

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

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

+0

Спасибо, это именно то, что я искал. Я не понимаю, зачем использовать шаблоны точек и как построить карту смещения, но это должно быть понятно после изучения документа. – bkausbk

+0

Похоже, что вам нужно, отлично! Я добавлю немного больше деталей для полноты ... –

 Смежные вопросы

  • Нет связанных вопросов^_^