Использование функции findEssentialMat в OpenCV 3.0

В настоящее время я работаю над проектом восстановления 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]

Итак, если я хочу использовать вместо этого параметры моей камеры, нужно ли мне напрямую заполнять эти значения? или конвертировать их в фактический размер, как миллиметр?

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

Любая помощь приветствуется.

5

Решение

Фокусное расстояние

Фокусное расстояние, полученное при калибровке камеры, указывается в пикселях. Это на самом деле отношение «реального» фокусного расстояния (например, в мм) и размера пикселя (также в мм). Единицы мира отменяются, и у вас остаются пиксели. К сожалению, вы не можете оценить как фокусное расстояние в мировых единицах, так и размер пикселя, только их соотношение.

Основная точка

Основная точка также в пикселях. Это просто точка на изображении, где она пересекает оптическую ось. Одно предостережение: основная точка, которую вы получаете от калибратора камеры в MATLAB, использует координаты пикселей на основе 1, где центр верхнего правого пикселя изображения равен (1,1). OpenCV использует 0-пиксельные координаты. Поэтому, если вы хотите использовать параметры вашей камеры в OpenCV, вы должны вычесть 1 из основной точки.

Вектор перевода

Вектор перевода, который вы получаете из существенной матрицы, является единичным вектором, потому что существенная матрица определяется только в масштабе. Другими словами, вы получите реконструкцию, где единица измерения — это расстояние между камерами. Если вам нужна метрическая реконструкция (в реальных единицах мира), вам нужно либо узнать фактическое расстояние между камерами, либо вы должны быть в состоянии обнаружить объект известного размера в сцене. Видеть это пример.

6

Другие решения


По вопросам рекламы [email protected]