У меня есть набор изображений твердого тела с прикрепленными маркерами. Я определил систему координат с началом в одном из этих маркеров и хочу получить вращение и перевод между этой системой координат и той, которая определена в начале камеры.
Некоторое время я пробовал POSIT (следуя этому), но так и не получил приемлемых результатов, пока не понял, что мне нужно откалибровать камера на первом месте. Основываясь на этом и используя некоторые изображения, полученные с помощью калибровочного тела, я получил внутреннюю матрицу камеры и параметры искажения. Я также получил плохую (?) ошибку повторного проецирования 1,276.
- Ошибка повторного проецирования слишком велика? Как я могу улучшить его? (Я использовал больше изображений и просто добился небольшого уменьшения значения).
- Могу ли я использовать параметры искажения в 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 градусов.
Кто-нибудь знает, где я ошибаюсь?