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