在OpenCV 3.0中使用findEssentialMat函数

Sim*_*ing 6 c++ opencv computer-vision matlab-cvst

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

我看到有些人在这里有同样的问题 OpenCV findFundamentalMat非常不稳定和敏感

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

我已经阅读了OpenCV文档中的示例

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

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

Focal length (millimeters):   [  1104    1102]

Principal point (pixels):[  259      262]
Run Code Online (Sandbox Code Playgroud)

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

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

任何帮助表示赞赏.

Dim*_*ima 8

焦距

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

主要观点

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

翻译矢量

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