相机位姿估计

4

我正在尝试从零开始编写一个程序,可以估计相机的姿态。我可以使用任何编程语言和内置的功能/方法进行特征检测...

我一直在探索不同的估计姿态的方法,如SLAM、PTAM、DTAM等...但我并不需要跟踪和映射,我只需要姿态。

你们能否建议一种方法或任何资源,可以帮助我?我知道什么是姿态,大致了解如何估计它,但我找不到任何解释如何完成它的资源。

我想先从录制视频开始,从视频中提取特征,然后使用这些特征和几何学来估计姿态。

(请原谅我的天真,我不是计算机视觉专家,对所有这些都还很新)

2个回答

4
为了计算相机的姿态,您需要有一个参考框架,该框架由图像中的一些已知点给出。 这些已知点来自于标定模式,例如标定模式,但也可以是图像中已知的地标(例如吉萨金字塔底部的4个角)。
估计相机姿态的问题是给定相机看到的已知地标(即从2D点找到3D位置)的问题,经典上称为PnP。OpenCV为此问题提供了现成的解算器
但是,您需要首先对相机进行校准,即确定它的独特性。需要估计的参数称为内在参数,因为它们将取决于相机焦距、传感器大小等,但不会取决于相机位置或方向。这些参数将在数学上解释世界点如何投影到相机传感器框架上。您可以使用已知平面模式(同样,OpenCV具有一些现成的函数)估计它们。

1
谢谢回复! 但是我能用这个技术找到相机本身的姿态吗? 据我所知,这只给我们提供了图像内部物体的姿态。 - Rohit H.S.
PnP求解器的输出是描述相对已知地标物体的方向和位置(分别为)的3D旋转和3D平移。 - sansuiso
如果您不是在寻找绝对比例/值,而是相对值,那么您是否应该关心相机校准?我认为例如在SLAM的情况下(不进行任何距离测量或类似的操作),这一步骤是不必要的。我现在指的是普通相机,而不是带有鱼眼镜头或类似物的相机... - privetDruzia
如果您不校准相机的内参,但仍然尝试使用两个视图(或等效地使用两个相机),那么您将获得正确的重建结果,但只能达到单应性,这比仅仅缺少一个比例更糟糕。了解基本矩阵是进行双视图几何的先决条件。如果您对相机有更多了解,则可以获得特定比例下的结果。 - sansuiso
@RohitH.S. 你是正确的,如果你对于找到相机位姿与校准物体坐标系相关感兴趣,你需要在校准物体坐标系和相机坐标系之间进行坐标变换。你可能会发现这个链接有帮助: https://ksimek.github.io/2012/08/22/extrinsic/ - el psy Congroo

0
通常情况下,你只能相对于给定的参考框架提取相机的姿态。估计相机的一个视图与另一个视图之间的相对姿态是非常普遍的。两个不同相机从同一场景中得到的两个视图之间最一般的关系由基础矩阵(请谷歌)给出。你可以通过图像之间的对应关系计算基础矩阵。例如,在Matlab实现中查找:http://www.mathworks.com/help/vision/ref/estimatefundamentalmatrix.html。在计算完这个之后,你可以使用基础矩阵的分解来获得相机之间的相对姿态。 (例如,在这里查找:http://www.daesik80.com/matlabfns/function/DecompPMatQR.m)。如果你有一个校准过的相机,你可以按照类似的程序进行操作,然后你需要的是本质矩阵而不是基础矩阵。

谢谢 ezfn! 目前我对此的理解是这样的,请告诉我是否正确。
  1. 使用SurfPoins或cornerPoints从两个连续图像(比如视频中的)中提取特征。
  2. 创建两个不同的矩阵,包含这些点的坐标,然后将这两个矩阵传递给estimateFundamentalMatrix函数。
  3. 输出将是一个基础矩阵。
  4. 使用DecompPMatQR分解基础矩阵以获得三个矩阵:内部矩阵、旋转和平移,这应该可以给出两个图像之间相机的旋转和平移。
- Rohit H.S.
嗨,本质矩阵分解有4种可能的解决方案。 - ezfn
引用自维基百科(http://en.wikipedia.org/wiki/Essential_matrix):“然而,实际上只有四类解决方案中的一种可以实现。给定一对相应的图像坐标,其中三个解决方案总是会产生一个3D点,该点位于至少一个摄像机后面,因此无法看到。只有四类中的一种将始终产生在两个摄像机前面的3D点。这必须是正确的解决方案。然而,它仍然具有与平移分量相关的不确定正比例缩放。” - ezfn
关于比例尺,你无法确定比例尺,因为你对场景没有任何物理知识(它可能是一个小木偶房子或一个巨大的豪宅)。你可以通过考虑场景中一些已知长度来提取真实的比例尺。清楚吗? - ezfn
非常感谢您,终极目标是制作一个3D模型,同时记录视频时还能复制相机的姿态。现在我遇到的新问题是,我的基本矩阵可能会出现问题,导致ThetaZ(来自R)大部分等于约90度,这是不正确的。这里是问题和代码的链接: http://stackoverflow.com/questions/27223361/error-in-fundamental-matrix如果您有时间,可以帮忙解决一下吗?非常感谢您迄今为止提供的所有帮助! - Rohit H.S.
显示剩余4条评论

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