在OpenCV 3.0中使用findEssentialMat函数

时间:2015-08-29 06:34:25

标签: c++ opencv computer-vision matlab-cvst

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

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

有些人建议应用Nister的5点算法,该算法已在最新版本的OpenCV3.0中实现。

我已经阅读了一些例子 OpenCV documentation

在示例中,它使用focal = 1.0Point2d pp(0.0, 0.0)。 这是相机的真实焦距和原理点吗?单位是什么?在像素?还是实际尺寸?我无法理解这两个参数。我认为这两个参数应该从校准程序中获取,对吗?

对于我当前的相机(VGA模式),我使用Matlab Camera Calibrator来获取这两个参数,这些参数是

Focal length (millimeters):   [  1104    1102]

Principal point (pixels):[  259      262]

所以,如果我想使用我的相机参数,我是否需要直接填写这些值?或者将它们转换为实际尺寸,如毫米?

另外,我得到的翻译结果看起来像是一个方向而不是实际大小,有什么方法可以得到实际的大小翻译而不是方向?

感谢任何帮助。

1 个答案:

答案 0 :(得分:7)

焦距

从相机校准中获得的焦距以像素为单位。它实际上是"真实"的比例。焦距(例如以mm为单位)和像素大小(也以mm为单位)。世界单位取消,你留下像素。不幸的是,你无法估计世界单位的焦距和像素大小,只能估算它们的比例。

校长点

主要点也是像素。它只是图像中与光轴相交的点。需要注意的一点是:从MATLAB中的Camera Calibrator获得的主要点是使用基于1的像素坐标,其中图像的右上角像素的中心是(1,1)。 OpenCV使用基于0的像素坐标。因此,如果要在OpenCV中使用相机参数,则必须从主点中减去1。

翻译矢量

从基本矩阵得到的平移向量是一个单位向量,因为基本矩阵只是按比例定义。换句话说,你得到一个重建,其中单位是相机之间的距离。如果您需要度量重建(在实际世界单位中),您可能需要知道摄像机之间的实际距离,或者您需要能够在场景中检测已知大小的对象。请参阅此example