В настоящее время я работаю над проектом восстановления 6-DOF-Pose камеры из двух изображений с помощью SIFT / SURF. В старой версии OpenCV я использовал findFundamentalMat, чтобы найти фундаментальную матрицу, а затем получить существенную матрицу с помощью встроенной в камеру K и, в конечном итоге, получить R и t путем разложения матрицы. Результат очень чувствительный и нестабильный.
Я видел, что некоторые люди имеют такую же проблему здесь
OpenCV findFundamentalMat очень нестабильный и чувствительный
Некоторые люди предлагают применить 5-точечный алгоритм Нистера, который реализован в последней версии OpenCV3.0.
Я прочитал примеры из
Документация OpenCV
В примере это использовать focal = 1.0
а также Point2d pp(0.0, 0.0)
,
Это реальное фокусное расстояние и принципиальная точка камеры? Какие единицы? в пикселях? или в реальном размере? У меня проблемы с пониманием этих двух параметров. Я думаю, что эти два параметра должны быть получены из процедуры калибровки, верно?
Для моей текущей камеры (режим VGA) я использую Matlab Camera Calibrator чтобы получить эти два параметра, и эти параметры
Focal length (millimeters): [ 1104 1102]
Principal point (pixels):[ 259 262]
Итак, если я хочу использовать вместо этого параметры моей камеры, нужно ли мне напрямую заполнять эти значения? или конвертировать их в фактический размер, как миллиметр?
Кроме того, результат перевода, который я получаю, выглядит скорее как направление, а не как фактический размер, есть ли способ получить перевод фактического размера, а не направление?
Любая помощь приветствуется.
Фокусное расстояние, полученное при калибровке камеры, указывается в пикселях. Это на самом деле отношение «реального» фокусного расстояния (например, в мм) и размера пикселя (также в мм). Единицы мира отменяются, и у вас остаются пиксели. К сожалению, вы не можете оценить как фокусное расстояние в мировых единицах, так и размер пикселя, только их соотношение.
Основная точка также в пикселях. Это просто точка на изображении, где она пересекает оптическую ось. Одно предостережение: основная точка, которую вы получаете от калибратора камеры в MATLAB, использует координаты пикселей на основе 1, где центр верхнего правого пикселя изображения равен (1,1). OpenCV использует 0-пиксельные координаты. Поэтому, если вы хотите использовать параметры вашей камеры в OpenCV, вы должны вычесть 1 из основной точки.
Вектор перевода, который вы получаете из существенной матрицы, является единичным вектором, потому что существенная матрица определяется только в масштабе. Другими словами, вы получите реконструкцию, где единица измерения — это расстояние между камерами. Если вам нужна метрическая реконструкция (в реальных единицах мира), вам нужно либо узнать фактическое расстояние между камерами, либо вы должны быть в состоянии обнаружить объект известного размера в сцене. Видеть это пример.