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

Компьютерное зрение, OpenCV

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

Сообщение erly » 30 окт 2018, 19:28

Подскажите, пожалуйста, возможно ли откалибровать камеру, если известны 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 точек в экранные координаты выполняется не верно, ошибка сильная и бессистемная.

Что я делаю не так? Кто-нибудь сталкивался с подобной задачей?
erly
 
Сообщения: 2
Зарегистрирован: 30 окт 2018, 18:19
programming: C++, Erlang

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

Сообщение erly » 01 ноя 2018, 14:32

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

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

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

Сообщение noonv » 02 ноя 2018, 08:52

erly писал(а):Нашел рабочий вариант.

Спасибо, что поделились! :)
Аватара пользователя
noonv
Администратор
 
Сообщения: 556
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++


Вернуться в Компьютерное зрение

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

cron
© 2009-2017 |  О проекте  |  Политика Конфиденциальности  |