Калибровка камеры (OpenCV 2.3) - как использовать параметры искажения?

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

Некоторое время я пробовал POSIT (следуя этому), но так и не получил приемлемых результатов, пока не понял, что мне нужно откалибровать камера на первом месте. Основываясь на этом и используя некоторые изображения, полученные с помощью калибровочного тела, я получил внутреннюю матрицу камеры и параметры искажения. Я также получил плохую (?) ошибку повторного проецирования 1,276.

  1. Ошибка повторного проецирования слишком велика? Как я могу улучшить его? (Я использовал больше изображений и просто добился небольшого уменьшения значения).
  2. Могу ли я использовать параметры искажения в POSIT? Как?

Спасибо.


Кажется, что единственный способ уменьшить ошибку перепроецирования (она изменилась с ~ 1,3 до ~ 0,7) — это установить «0» для следующих параметров в файле конфигурации XML:

<Calibrate_FixAspectRatio> 0 </Calibrate_FixAspectRatio>
<Calibrate_AssumeZeroTangentialDistortion> 0 </Calibrate_AssumeZeroTangentialDistortion>
<Calibrate_FixPrincipalPointAtTheCenter> 0 </Calibrate_FixPrincipalPointAtTheCenter>

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

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

Матрица камеры у меня получилась после калибровки:

<Camera_Matrix type_id="opencv-matrix">
<rows>3</rows>
<cols>3</cols>
<dt>d</dt>
<data>
2.0613885351075501e+003 0. 2.2865517805186334e+002 0.
2.2546461307897816e+003 2.5261706201677623e+002 0. 0. 1.
</data>
</Camera_Matrix>

и как я использовал это в POSIT:

#define FOCAL_LENGTH 2158.0175
#define FOCAL_LENGTH_X 2061.389 
#define FOCAL_LENGTH_Y 2254.646
#define cX 203.655
#define cY 205.117

Я рассчитал разницу между новыми координатами центра и координатами калибровочных изображений, а затем применил эту разницу к центральным координатам изображений, над которыми я работаю с POSIT.

Я использую POSIT на двух разных изображениях, где теоретически я должен получить поворот на 0 (для первого) и 10 (для второго) градусов между моделью и системой координат камеры. После того, как я получил матрицу вращения для каждого изображения, я определил единичный вектор в системе координат камеры и вычислил его в системе координат модели, умножив его на обратную из двух матриц вращения, заданных POSIT, получив два новых вектора в модели. система координат. Когда я вычисляю угол между этими двумя векторами в системе координат модели, результат не такой, как должен быть - 10 градусов.

Кто-нибудь знает, где я ошибаюсь?


person PN_    schedule 30.06.2012    source источник
comment
Забыл упомянуть, что мое калибровочное тело представляет собой сетку кругов, а не типичную шахматную доску.   -  person PN_    schedule 30.06.2012


Ответы (1)


Какое разрешение изображения? Основная точка должна быть близко к центру изображения. какое фокусное расстояние объектива? Эта ошибка калибровки может быть хорошей в зависимости от точности, которая вам нужна. Чтобы избежать ошибки, вызванной искажением объектива, вы должны устранить искажение точек изображения, переданных в POSIT, с помощью undistortPoints. Насколько велика эта ошибка, зависит от того, насколько велика дисторсия вашего объектива.

person Javier Barandiaran Martirena    schedule 03.07.2012
comment
У меня нет информации ни о разрешении изображения, ни о фокусном расстоянии, поэтому я сделал калибровку. Из матрицы камеры я получаю фокусное расстояние по x и y и главную точку изображения (она близка к центру изображения). Моя логика где-то неверна? - person PN_; 04.07.2012
comment
Разрешение изображения — это ширина и высота ваших изображений. Вы должны знать реальное фокусное расстояние вашего объектива (8 мм, 16 мм,...). Разрешение изображения и реальное фокусное расстояние определяют значение фокусного расстояния, которое следует оценить в процессе калибровки. Кстати, разве cX и cY не должны быть 228,655 и 252,617? - person Javier Barandiaran Martirena; 05.07.2012
comment
Только что понял .. Я неправильно маркировал точки изображения, не мог заметить это раньше. Спасибо за помощь, Хавьер! - person PN_; 06.07.2012