术语“基准”通常仅表示翻译。由于您已经有了旋转,平移和内在矩阵(请不要使用R, T
和K
)。您可以进行三角剖分,并且不需要基本矩阵或基本矩阵(它们可以用于提取R, T
等,但是您已经有了它们)。您实际上也不需要校正图像,因为它不会对三角测量过程造成太大的改变。有许多种三角测量方法,每种都有其优缺点,并且有许多实现它们的库。因此,我在这里所能做的就是为您提供有关问题和潜在解决方案的概述,以及指向资源的指针,这些资源既可以直接使用,也可以用作编写自己的代码的灵感之源。
形式化和解决方案概述。让我们在这里形式化我们要做什么。你有一个三维点X
,有两个意见x_1
,并x_2
分别在左,右图像。如果对它们进行背投,则会获得两条光线:
ray_1=K^{1}x_1
rat_2=R*K^{-1}x_2+T //I'm assuming that [R|T] is the pose of the second camera expressed in the referential of the first camera
理想情况下,您希望这两条光线在point相遇X
。由于在实践中我们总是会遇到一些噪声(离散噪声,舍入误差等)X
,因此两条光线不会在处相遇,因此最佳答案是这样的点Q
:
Q=argmin_X {d(X,ray_1)^2+d(X,ray_2)^2}
其中d(.)
表示线与点之间的欧几里得距离。您可以将其作为常规的最小二乘问题来解决,也可以采用考虑垂直于 和的线段的几何方法(称为中点),并将其中间作为解决方案。另一种快速而肮脏的方法是使用DLT。基本上,您将约束(即,应尽可能靠近两条光线)重写为线性系统,并使用SVD求解。l
ray_1
ray_2
X
AX=0
通常,几何(中点)方法不太精确。基于DLT的数字虽然不是最稳定的数字,但通常会产生可接受的结果。
深入形式化的资源
当然是哈特利·齐瑟曼的书!第312章介绍了一种简单的基于DLT的方法,该方法在opencv中使用(在校准和sfm模块中都使用)。该方法非常容易实现,在任何情况下都不应花费超过10分钟语言。
塞利斯基的书。它在SFM一章中对三角剖分进行了有趣的讨论,但没有Hartley-Zisserman的那么直截了当或深入。
码。您可以从calib3d模块或contribs / sfm模块中使用来自opencv的三角剖分方法。两者都使用DLT,但是SFM模块中的代码更容易理解(calib3d代码具有很多老式的C代码,阅读起来并不愉快)。还有另一个库,称为openGV,它具有一些有趣的三角剖分方法。
cv :: sfm :: triangulatePoints
openGV git repo似乎不是很活跃,我也不是库设计的忠实拥护者,但是如果我没记错的话(可以告诉我),它提供了除DLT之外的三角剖分方法。
当然,这些都是用C ++编写的,但是,如果您使用其他语言,查找包装器或类似的库将不会很困难(使用python时,您仍然具有opencv包装器,而MATLAB具有bundle模块等)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句