OpenCV 3.0中findEssentialMat函数的使用

Usage of findEssentialMat function in OpenCV 3.0

本文关键字:函数 findEssentialMat OpenCV      更新时间:2023-10-16

我目前正在研究一个项目,通过使用SIFT/SURF从两个图像中恢复相机6- dof姿势。在旧版本的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]

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

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

任何帮助都是感激的。

焦距

你从相机校准得到的焦距是以像素为单位的。它实际上是"真实"的比率。焦距(例如毫米)和像素大小(也以毫米为单位)。世界单位消掉了,剩下像素。不幸的是,你不能同时估计世界单位焦距和像素大小,只能估计它们的比例。

主点

主点也以像素为单位。它就是图像中与光轴相交的点。一个警告:您从MATLAB中的Camera Calibrator获得的主要点使用基于1的像素坐标,其中图像的右上角像素的中心是(1,1)。OpenCV使用基于0的像素坐标。所以如果你想在OpenCV中使用你的相机参数,你必须从主点减去1。

翻译向量

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