Перейти к содержимому
Compvision.ru
erly

Калибровка камеры с помощью известных координат объекта

Recommended Posts

Всем привет.

Подскажите, пожалуйста, возможно ли откалибровать камеру, если известны 3D координаты нескольких (50) точек из реального мира и соответствующие им 2D координаты на изображении от камеры? Требуется найти как внутренние, так и внешние параметры камеры.

Калибровать пытаюсь методом calibrateCamera. Мануалы с туториалами описывают калибровку с помощью шахматной доски нескольких видов. Оно работает нормально, только мне такое не подходит. Надо как-то обойтись настоящими координатами известных реперных точек в пространстве. Камера стоит в фиксированном положении относительно объекта съемки, поэтому по идее после вызова функции ожидаю получить не только Camera Matrix и Distortions, но и корректные Translation и Rotation векторы.

Пробовал такие варианты:

1. В параметрах функции указываю реальные 3D координаты единым блоком: vector<vector<Point3f>>. Размерность вектора получается [1][50]. Аналогично для проективных точек: vector<vector<Point2f>>.
Вызов функции приводит к ошибке:
.. opencv-3.4.2/modules/calib3d/src/calibration.cpp:1468: error: (-5:Bad argument) For non-planar calibration rigs the initial intrinsic matrix must be specified in function 'cvCalibrateCamera2Internal'
Ругается, что калибровочный шаблон - не плоскость. А он действительно не плоскость, а набор точек в некотором объеме пространства.

2. То же самое, но с флагом CV_CALIB_USE_INTRINSIC_GUESS.
Ошибки нет, все матрицы вычислились. Но проверка не проходит. Пересчет проверочных 3D точек в экранные координаты выполняется не верно, ошибка сильная и бессистемная.

Что я делаю не так? Кто-нибудь сталкивался с подобной задачей?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нашел рабочий вариант.

Если кому интересно:
Калибровку делал в 2 этапа.
1. Разделил все 3D точки реального объекта на плоскости (Z координаты обнулил), подал их в calibrateCamera отдельными векторами. И 2D точки из плоскости кадра разделил на отдельные векторы тоже. В результате получилось первое приближение cameraMatrix (M) и Distortions (D). Матрицы вращения (R) и положения (T) игнорируются.
2. Второй вызов calibrateCamera. У нее в параметрах Все 3D точки одним общим вектором, 2D точки одним вектором, M и D из первого шага. Вызов функции без флагов. В результате получились уточненные M и D, а также вычисленные R и T.
Проверка по отображению других 3D точек объекта в 2D картинную плоскость прошла успешно.

Всем спасибо, кто думал над задачей. Ваши мысли, выпущенные в ноосферу, безусловно помогли поиску решения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×