OpenCV:相机位姿估计

5
我需要使用OpenCV来匹配两张有重叠的相机图像。目前,我已经通过SurfFeatureDetector提取出了特征。现在,我正在尝试计算这两张图像之间的旋转和平移向量。
据我所知,应该使用cvFindExtrinsicCameraParams2()方法。不幸的是,此方法需要一个objectPoints参数。这些objectPoints是提取特征的世界坐标。在当前情况下,这些坐标是未知的。
请问有谁能给我一些提示如何解决这个问题?
2个回答

9
这里讨论了同时计算两幅图像之间的相对姿态和未知三维世界坐标的问题:
Berthold K. P. Horn. Relative orientation revisited. Berthold K. P. Horn. Massachusetts Institute of Technology人工智能实验室,545 Technology...
编辑:这是一篇论文链接: 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

假设有一个初始估计可用。

编辑:我找到了一些代码资源,您可能想要查看:

资源 I:

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

带有异常值的两视图几何估计

C++代码,用于在存在异常值的情况下找到两个已校准相机的相对方向。所得解决方案在内点数量最大的意义上是最优的。

资源 II:

http://lear.inrialpes.fr/people/triggs/src/ 五点相对定位:这是一个更加精细的C语言程序,实现了从未知3D点中计算两个已标定相机之间相对定位的最小解。需要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
有一个理论解决方案,然而OpenCV的相机位姿估计实现缺少所需工具。
理论方法如下: 步骤1:提取单应矩阵(描述图像之间几何转换的矩阵)。使用findHomography()函数。 步骤2:将结果矩阵分解为旋转和平移。使用cv::solvePnP()函数。
问题:findHomography()返回一个3x3矩阵,对应一个平面到另一个平面的投影。solvePnP()需要一个3x4矩阵,表示物体的3D旋转/平移。我认为通过一些近似,可以修改solvePnP()函数以给出一些结果,但这需要大量数学知识和对3D几何的深刻理解。
了解更多信息,请参阅http://en.wikipedia.org/wiki/Transformation_matrix

如果(i)姿态的唯一差异是相机中心周围的旋转或(ii)两个图像都描绘了填充整个图像平面的平面对象,则图像将由单应性相关。通常,单应性不会对图像之间的变换进行建模。 - Rulle
你在这里描述的是一种仿射变换。单应性变换是从任意3D位置到任意其他3D位置的一般变换。它可以通过一个4x4矩阵完全描述。然而,如果对变换施加一些限制(比如它们都应该保持在同一平面上),则只需使用一个3x3矩阵。 - Sam
哦,我以为你指的是将用齐次坐标表示的2D图像点与两个图像之间的3x3单应矩阵相关联。 - Rulle
单应性假设所有点都位于同一平面上,但在本例中可能并非如此。至于旋转和平移-您可以计算基础矩阵(cv :: findFundamentalMat()),计算本质矩阵(cv :: findEssentialMat()),并使用SVD加上几个附加步骤对第二个进行分解(请参阅书籍“多视角计算机视觉中的多个视图几何”由Hartley和Zisserman)以获取这些信息。 - rbaleksandar
单应矩阵只适用于测试平面上的点或者运动是纯旋转的情况。否则,您将需要使用本质矩阵来提取相对位姿。 - Yonatan Simson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接