Как проверить правильность калибровки веб-камеры?

Я совершенно новичок в методах калибровки камеры... Я использую технику шахматной доски OpenCV... Я использую веб-камеру от Quantum...

Вот мои наблюдения и шаги..

  1. Я сохранил каждую сторону шахматного квадрата = 3,5 см. Это шахматная доска 7 x 5 с 6 x 4 внутренними углами. Я снимаю всего 10 изображений в разных видах / позах на расстоянии от 1 до 1,5 м от веб-камеры.
  2. Я следую за кодом C в Learning OpenCV Брадски для калибровки. мой код для калибровки

    cvCalibrateCamera2(object_points,image_points,point_counts,cvSize(640,480),intrinsic_matrix,distortion_coeffs,NULL,NULL,CV_CALIB_FIX_ASPECT_RATIO);
    
  3. Перед вызовом этой функции я делаю первый и второй элементы по диагонали внутренней матрицы как единое целое, чтобы сохранить соотношение фокусных расстояний постоянным, и использую CV_CALIB_FIX_ASPECT_RATIO

  4. С изменением расстояния шахматной доски fx а также fy меняются с fx:fy почти равен 1. Есть cx а также cy значения порядка от 200 до 400. fx а также fy порядка 300 - 700, когда я меняю расстояние.

  5. В настоящее время я положил все коэффициенты искажения на ноль, потому что я не получил хороший результат, включая коэффициенты искажения. Мой оригинальный образ выглядел красивее, чем неискаженный!!

Я правильно делаю калибровку? Должен ли я использовать любой другой вариант, кроме CV_CALIB_FIX_ASPECT_RATIO?. Если да, то какой?

2 ответа

Решение

Хм, вы ищете "красивый" или "точный"?

Калибровка камеры является одним из немногих объектов в компьютерном зрении, где точность может быть прямо измерена физически и подтверждена физическим экспериментом. И обычный урок состоит в том, что (а) ваши цифры так же хороши, как усилия (и деньги), которые вы вкладываете в них, и (б) реальная точность (в отличие от воображаемой) стоит дорого, поэтому вы должны заранее выяснить, что Ваше приложение действительно требует точности.

Если вы посмотрите геометрические характеристики даже очень дешевых комбинаций объектив / сенсор (в мегапиксельном диапазоне и выше), становится очевидным, что точность калибровки менее 1 мм теоретически достижима в пределах объема стола. Просто определите (из листа спецификации датчика вашей камеры) телесный угол, охватывающий один пиксель - вы будете поражены пространственным разрешением, которое у вас есть в пределах досягаемости вашего кошелька. Тем не менее, на самом деле достижение REPEATABLY чего-то близкого к теоретической точности требует работы.

Вот некоторые рекомендации (из личного опыта) для получения хорошего опыта калибровки с отечественным оборудованием.

  1. Если в вашем методе используется плоская цель ("шахматная доска" или аналогичная), изготовьте хорошую. Выберите очень плоскую подложку (для размера, который вы упомянули, оконное стекло толщиной 5 мм или более отлично, хотя, очевидно, хрупкое). Проверьте его плоскостность к другому краю (или, лучше, лазерному лучу). Напечатайте рисунок на толстой бумаге, которая не будет слишком легко растягиваться. Положите его после печати на подложку перед приклеиванием и убедитесь, что квадратные стороны действительно почти ортогональны. Дешевые струйные или лазерные принтеры не предназначены для строгой геометрической точности, не доверяйте им вслепую. Лучше всего использовать профессиональную типографию (даже у Kinko лучше, чем у большинства домашних принтеров). Затем очень аккуратно прикрепите рисунок к подложке, используя распыляемый клей и медленно протирая мягкой тканью, чтобы избежать образования пузырей и растяжек. Подождите один день или дольше, пока клей не затвердеет, и напряжение клея не достигнет своего долгосрочного устойчивого состояния. Наконец, измерьте угловые положения с помощью хорошего штангенциркуля и лупы. Вы можете сойти с одного единственного числа для "среднего" размера квадрата, но оно должно быть средним из фактических измерений, а не из надежд-н-молитв. Лучшая практика - использовать таблицу измеренных позиций.

  2. Следите за изменениями температуры и влажности: бумага впитывает воду из воздуха, подложка расширяется и сжимается. Удивительно, сколько статей вы можете найти, в которых сообщается о точности калибровки менее миллиметра без цитирования условий окружающей среды (или целевой реакции на них). Излишне говорить, что они в основном дерьмо. Более низкий температурный коэффициент расширения стекла по сравнению с обычным листовым металлом является еще одной причиной предпочтения первого в качестве основы.

  3. Само собой разумеется, вы должны отключить функцию автофокуса вашей камеры, если она есть: фокусировка физически перемещает один или несколько кусков стекла внутри объектива, изменяя (слегка) поле зрения и (обычно много) искажение линзы и главное.

  4. Установите камеру на устойчивое крепление, которое не будет легко вибрировать. Сфокусируйтесь (и диафрагмируйте объектив, если у него есть диафрагма), как это необходимо для приложения (не для калибровки - процедура калибровки и цель должны быть разработаны для нужд приложения, а не наоборот). Даже не думайте касаться камеры или объектива после этого. Если возможно, избегайте "сложных" объективов - например, зум-объективов или объективов с очень широким углом обзора. Для объективов типа "рыбий глаз" или "анаморфоз" требуются модели, намного более сложные, чем доступные на складе OpenCV.

  5. Сделайте много измерений и фотографий. Вам нужны сотни измерений (углов) на изображение и десятки изображений. Что касается данных, чем больше, тем лучше. Шахматная доска 10х10 - это абсолютный минимум, который я бы рассмотрел. Я обычно работал в 20x20.

  6. Увеличьте объем калибровки при съемке. В идеале вы хотите, чтобы ваши измерения были равномерно распределены по объему пространства, с которым вы будете работать. Что наиболее важно, убедитесь, что на некоторых изображениях угол наклона цели значительно превышает фокусную ось - для калибровки фокусного расстояния вам необходимо "увидеть" какой-то реальный ракурс перспективы. Для достижения наилучших результатов используйте повторяемый механический зажим для перемещения цели. Хороший - это одноосный поворотный стол, который даст вам отличную модель для движения цели.

  7. Минимизируйте вибрации и связанное с ними размытие при съемке фотографий.

  8. Используйте хорошее освещение. В самом деле. Удивительно, как часто в конце игры люди понимают, что для калибровки любой камеры нужны фотоны:-) Используйте рассеянное окружающее освещение и отражайте его от белых карточек с обеих сторон поля зрения.

  9. Посмотрите, что делает ваш угловой код извлечения. Нарисуйте обнаруженные угловые позиции сверху изображений (например, в Matlab или Octave) и оцените их качество. Удалять выбросы раньше, используя жесткие пороги, лучше, чем доверять робустификатору в вашем коде настройки пакета.

  10. Ограничьте вашу модель, если можете. Например, не пытайтесь оценить основную точку, если у вас нет веских оснований полагать, что ваш объектив значительно смещен от центра изображения, просто зафиксируйте его в центре изображения с первой попытки. Местоположение основной точки обычно плохо наблюдается, потому что оно по своей сути спутано с центром нелинейного искажения и компонентом, параллельным плоскости изображения трансляции от цели к камере. Чтобы сделать это правильно, требуется тщательно продуманная процедура, которая дает три или более независимых точки схода сцены и очень хорошее брекетирование нелинейных искажений. Точно так же, если у вас нет оснований подозревать, что фокусная ось объектива действительно наклонена относительно плоскости датчика, зафиксируйте в нуле (1,2) компонент матрицы камеры. Вообще говоря, используйте простейшую модель, которая удовлетворяет вашим измерениям и потребностям вашего приложения (для вас это бритва Оккама).

  11. Если у вас есть решение для калибровки от вашего оптимизатора с достаточно низкой среднеквадратической ошибкой (обычно на несколько десятых долей пикселя, см. Также ответ Джоша ниже), постройте XY-шаблон остаточных ошибок (предсказанный_xy - измеренный_xy для каждого угла во всех изображениях). и посмотрите, является ли это круглым облаком с центром в (0, 0). "Скопления" выбросов или не округлость облака остатков - это крики сигналов тревоги о том, что что-то очень неправильно - скорее всего, выбросы или неправильная модель искажения линзы.

  12. Возьмите дополнительные изображения, чтобы проверить точность решения - используйте их, чтобы убедиться, что искажение линзы действительно удалено и что плоскостная гомография, предсказанная калиброванной моделью, фактически совпадает с той, что была получена с измеренных углов.

Это довольно поздний ответ, но для людей, пришедших на это из Google:

Правильный способ проверить точность калибровки - использовать ошибку перепроецирования, предоставленную OpenCV. Я не уверен, почему это не упоминалось нигде в ответе или комментариях, вам не нужно вычислять это вручную - это возвращаемое значение calibrateCamera, В Python это первое возвращаемое значение (за которым следует матрица камеры и т. Д.).

Ошибка перепроецирования - это среднеквадратическая ошибка между тем, где точки будут проецироваться с использованием внутренних коэффициентов, и тем, где они находятся в реальном изображении. Как правило, вы должны ожидать среднеквадратическую ошибку менее 0,5px - я обычно могу получить около 0,1px с камерами машинного зрения. Ошибка перепроецирования используется во многих документах о компьютерном зрении, поэтому нет более простого или более точного способа определить, насколько хороша ваша калибровка.

Если у вас нет стереосистемы, вы можете работать только там, где что-то находится в трехмерном пространстве, вплоть до луча, а не точки. Однако, поскольку можно определить позу каждого плоского калибровочного изображения, можно определить, где каждый угол шахматной доски должен падать на датчик изображения. Процесс калибровки (более или менее) пытается определить, где падают эти лучи, и минимизирует погрешность для всех различных калибровочных изображений. В первоначальной статье Чжана и последующих оценках, кажется, достаточно около 10-15 изображений; на этом этапе ошибка значительно не уменьшается с добавлением большего количества изображений.

Другие программные пакеты, такие как Matlab, будут давать вам оценки ошибок для каждого отдельного объекта, например, фокусное расстояние, центр проекции. Я не смог заставить OpenCV выплевывать эту информацию, но, возможно, она где-то там. Калибровка камеры теперь встроена в Matlab 2014a, но вы все равно можете воспользоваться набором инструментов для калибровки камеры, который чрезвычайно популярен среди пользователей компьютерного зрения.

http://www.vision.caltech.edu/bouguetj/calib_doc/

Визуальный осмотр необходим, но не достаточен при работе с вашими результатами. Самое простое, что нужно искать, это то, что прямые линии в мире становятся прямыми на ваших неискаженных изображениях. Кроме того, невозможно по-настоящему убедиться, что ваши камеры хорошо откалиброваны, просто взглянув на выходные изображения.

Процедура, предложенная Франческо, хороша, следуйте этому. В качестве самолета я использую полочную доску с рисунком, напечатанным на бумаге для постеров. Убедитесь, что изображения хорошо экспонированы - избегайте зеркального отражения! Я использую стандартный шаблон 8x6, я пробовал более плотные шаблоны, но я не видел такого улучшения в точности, что это имеет значение.

Я думаю, что этого ответа должно быть достаточно для большинства людей, желающих откалибровать камеру - реально, если вы не пытаетесь откалибровать что-то экзотическое, например, Fisheye, или вы делаете это по образовательным соображениям, OpenCV/Matlab - это все, что вам нужно. Метод Чжана считается достаточно хорошим, чтобы его использовали практически все исследователи компьютерного зрения, и большинство из них используют либо набор инструментов Буге, либо OpenCV.

Другие вопросы по тегам