aresnv 1 Жалоба Опубликовано August 11, 2012 Доброго времени суток! Пишу программу для калибровки камеры с использованием шахматной доски под 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 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
aresnv 1 Жалоба Опубликовано August 14, 2012 Никто не прокоментирует результаты? Может я просто не те значения из матриц достаю ? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано August 14, 2012 может результат зависит от инициализации? 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 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
aresnv 1 Жалоба Опубликовано August 14, 2012 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 Стало гораздо больше похоже на правду! Спасибо! Подскажите пожалуйста, какого порядка значения дисторсии, вращения и сдвига примерно должны быть? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
aresnv 1 Жалоба Опубликовано August 16, 2012 После калибровки камеры (беру оттуда только внутринние параметры. внешние считаю не известными, потому что применяться будет для других снимков) и нахождения фундаментальной матрицы, расчитал вещественную матрицу E= K*F*K. Есть ли в OpenCV функция для расчета матриц вращения и сдвига из вещественной матрицы? (нужно в дальнейшем для расчета матриц проэкции и использования их в функции triangulatePoints()). Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 16, 2012 rodrigues по моему для этих целей. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
aresnv 1 Жалоба Опубликовано August 16, 2012 Спасибо за ответ, но на вход этой функции нужно передать вектор вращения, который можно было бы посчитать с помощью solvePnP, но для этого нужны координаты точек объекта. Они не известны. Единственный вариант, это извлечь из вещественной матрицы. С одной стороны E=[tx]*R с другой стороны E=K*F*K. Получаем, что K*F*K = [tx]*R. А вот как дальше- не знаю Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 16, 2012 Найдите Graphics gems II (это не трудно), в книге есть глава: "Decomposing a Matrix into Simple Transformations" (на 320 с.) надеюсь поможет. на офф. сайте есть еще и исходники ко всем гемам (исходников к разложению на компоненты я там не видел, но зато там много других интересных вещей). Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
aresnv 1 Жалоба Опубликовано August 20, 2012 Спасибо за наводку Вычислил сдвиг и поворот из существенной матрицы с помощью 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мм. Как это можно объяснить? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах