OpenCV 3.0中findEssentialMat函数的使用

Usage of findEssentialMat function in OpenCV 3.0

我目前正在进行一个项目,使用 SIFT/SURF 从两张图像中恢复相机的 6-DOF-Pose。在旧版本的 OpenCV 中,我使用 findFundamentalMat 找到基本矩阵,然后通过已知相机固有 K 进一步得到基本矩阵,最终通过矩阵分解得到 R 和 t。结果非常敏感且不稳定。

我看到这里有人有同样的问题 OpenCV findFundamentalMat very unstable and sensitive

有人建议使用在最新版本的OpenCV3.0中实现的Nister的5点算法。

我读过一个例子 OpenCV documentation

示例中使用focal = 1.0Point2d 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。

平移矢量

你从本质矩阵得到的平移向量是一个单位向量,因为本质矩阵只是按比例定义的。换句话说,你得到一个重建,其中单位是相机之间的距离。如果您需要公制重建(以实际世界单位表示),您需要知道相机之间的实际距离,或者您需要能够检测场景中已知大小的物体。看到这个 example.