2011-11-19 431 views
5

我尝试匹配用相机拍摄的两个重叠图像。为此,我想使用OpenCV。我已经提取了SurfFeatureDetector的功能。现在我试图计算两幅图像之间的旋转和平移向量。OpenCV:相机姿态估计

据我所知,我应该使用cvFindExtrinsicCameraParams2()。不幸的是,这种方法需要objectPoints作为参数。这些objectPoints是提取的特征的世界坐标。这些在当前情况下是不知道的。

有人可以给我一个提示如何解决这个问题?

回答

8

的同时计算两个图像和3D未知世界坐标已经在这里治疗之间的相对位姿的问题:

贝特霍尔德K. P.号角。相对定位重新审视。 Berthold K. P. Horn。人工智能实验室,技术,545麻省理工学院...

编辑:这里是一个链接到文件: http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.64.4700

请参阅我的回答一个相关的问题,我提出了一个解决这个问题:

OpenCV extrinsic camera from feature points

编辑:您可能想看看捆绑的调整也

http://en.wikipedia.org/wiki/Bundle_adjustment

假定有一个初始估计值可用。

编辑:我发现了一些代码资源,你可能想看一看:

资源我:

http://www.maths.lth.se/vision/downloads/

两个视图几何估计与离群

用于查找两个校准的相对方向的C++代码 存在异常值的相机。所获得的解决方案在内部数量最大化的意义上是最优的。

资源II:稍微更抛光C例程执行从 未知3D点为两个校准摄像机的相对取向的最小 溶液:从 5分

http://lear.inrialpes.fr/people/triggs/src/相对定向。需要5分,可以有多达10个可行的解决方案(但更常见的是2-5个)。还需要几个用于线性代数的CLAPACK例程。还有一个简短的技术报告 (包含在源代码中)。

资源III:

http://www9.in.tum.de/praktika/ppbv.WS02/doc/html/reference/cpp/toc_tools_stereo.html vector_to_rel_pose计算给定图像点对应2个 相机和已知的摄像机参数和 重建三维空间中的点之间的相对方位。

+0

感谢您提供非常详细的答案!那正是我需要的。 – SecStone

2

有一个理论上的解决方案,但是,相机姿态估计的OpenCV实现缺少所需的工具。

理论方法: 步骤1:提取单应性矩阵(描述图像之间几何变换的矩阵)。使用findHomography() 第2步。将结果矩阵分解为旋转和平移。使用cv :: solvePnP();

问题:findHomography()返回一个3x3矩阵,对应于从一个平面到另一个平面的投影。 solvePnP()需要一个3x4矩阵,表示对象的3D旋转/平移。我认为通过一些近似值,你可以修改solvePnP来给你一些结果,但是它需要很多的数学和对3D几何的很好的理解。

了解更多关于http://en.wikipedia.org/wiki/Transformation_matrix

+0

如果(i)姿势的唯一区别是关于相机中心的旋转_or_(ii)两幅图像描绘了填充整个图像平面的平面物体,则图像将通过单应相关。一般来说,单应性不能模拟图像之间的转换。 – Rulle

+0

这里描述的是仿射变换。单应性是从任何3D位置到任何其他3D位置的一般变换。它完全由4x4矩阵描述。但是,如果您对变换应用了一些约束(如所有这些约束应该保持在同一平面中),则只能使用3x3矩阵。 – Sam

+0

哦,我以为你的意思是3x3单应性矩阵,它涉及用两个图像之间的均匀坐标表示的二维图像点。 – Rulle