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

Калибровка камеры для Android

Recommended Posts

Доброго времени суток!

Пишу программу для калибровки камеры с использованием шахматной доски под Android. Получаю примерно следующие результаты:

DistorCoeff= 0-2.74600062551539E-8

R= 1.8985174637828507E-4

T= 9.470996538536085

Fx= 0.9999999999998178

Fy= 0.9999999999998863

Cx= 0.9999999999999993

Cy= 0.9999999999999994

На мой взгляд, результаты слегка необычные :) кто нибудь может объяснить в чем дело? прилагаю файл с кодом

Спасибо!

Calibration.txt

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


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

Никто не прокоментирует результаты?

Может я просто не те значения из матриц достаю ?

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


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

может результат зависит от инициализации?

CV_CALIB_USE_INTRINSIC_GUESS and/or CV_CALIB_FIX_ASPECT_RATIO are specified, some or all of fx, fy, cx, cy must be initialized before calling the function

еще неплохо бы проверить какие точки передаются object_points, image_points

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


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

image_points это результат функции findChessboardCorners, судя по картикам которые рисует drawChessboardCorners доска распознается хорошо. Размер внешнего массива совпадает с количеством снимков доски, внутринние массивы отображают количество детектированых точек.

object_points так же имеет длину совпадающую с количеством снимков и внутринние массивы с количесвтом детектированых точек. точки описываются 3 координатами

Х = номер точки / номер квадрата);

Y = номер точки % номер квадрата);

Z = 0.0f;

Поставил флаг CV_CALIB_FIX_ASPECT_RATIO получил следующие результаты: (в качестве эксперимента размер фотографий был выбран 320*240)

Distor= 035.255336901634

R= 0.5826785808607036

T= 3.969967429365635

Fx= 4923.640688437316

Fy= 4923.640688437316

Cx= 107.38375464884622

Cy= 163.25697047296157

Стало гораздо больше похоже на правду! Спасибо!

Подскажите пожалуйста, какого порядка значения дисторсии, вращения и сдвига примерно должны быть?

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


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

После калибровки камеры (беру оттуда только внутринние параметры. внешние считаю не известными, потому что применяться будет для других снимков) и нахождения фундаментальной матрицы, расчитал вещественную матрицу E= K*F*K.

Есть ли в OpenCV функция для расчета матриц вращения и сдвига из вещественной матрицы? (нужно в дальнейшем для расчета матриц проэкции и использования их в функции triangulatePoints()).

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


Ссылка на сообщение
Поделиться на других сайтах
rodrigues по моему для этих целей.

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


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

Спасибо за ответ, но на вход этой функции нужно передать вектор вращения, который можно было бы посчитать с помощью solvePnP, но для этого нужны координаты точек объекта. Они не известны. Единственный вариант, это извлечь из вещественной матрицы.

С одной стороны E=[tx]*R с другой стороны E=K*F*K. Получаем, что K*F*K = [tx]*R. А вот как дальше- не знаю :(

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


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

Найдите Graphics gems II (это не трудно),

в книге есть глава:

"Decomposing a Matrix into Simple Transformations" (на 320 с.) надеюсь поможет.

на офф. сайте есть еще и исходники ко всем гемам (исходников к разложению на компоненты я там не видел, но зато там много других интересных вещей).

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


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

Спасибо за наводку :) Вычислил сдвиг и поворот из существенной матрицы с помощью SVD разложения. Затем с помощью функции triangulatePoints() получил 4-х мерные координаты в 3D пространстве. Первые 3 разделил на 4-ю координату, чтобы уйти от однородных координат, и получил для всех точек Z- координату равной единице. Я предполагал, что Z координата покажет мне насколько точка удалена от камеры, поэтому не может быть равной для ВСЕХ точек. Если сравнивать координаты на изображении и те, которые я получил в 3D, то первые всегда меньше вторых ровно в 2 раза... Например:

ImagePoint №257: (336.819091796875, 236.49000549316406)

ObjectPoint №257: (673.6381835937501, 472.98001098632824, 1.0)

Где я мог ошибиться или как правильно интерпретировать полученые результаты?

одним из параметров функции calibrationMatrixValues() является фокусное расстояние в миллиметрах.

для различных разрешений фотографий (640*480, 1600*1200, 2560*1920) получаю соответсвенно 4923.64; 6857.63 и 8965.34 а в свойствах самих фотографий стоит всегда 4мм. Как это можно объяснить?

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×