SSS*_*SSS 2 disparity-mapping 3d-reconstruction camera-matrix
我已成功计算了两个摄像头的固有摄像机矩阵的旋转,平移.我还从左右相机中得到了校正后的图像.现在,我想知道如何计算一个点的3D坐标,只是图像中的一个点.在这里,请看绿点.我看看这个等式,但它需要基线,我不知道如何计算.你能告诉我用给定信息(R,T和内在矩阵)计算绿点的三维坐标的过程吗?
仅供参考1.我还有一个基本矩阵和基本矩阵,以防我们需要它们.2.原始图像尺寸为960 x 720.整流图像为925 x 669 3.左图像的绿点:(562,185),右图:(542,185)
术语"基线"通常仅指翻译.既然你已经有你的旋转,平移和内部函数矩阵(我们不要他们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
Run Code Online (Sandbox Code Playgroud)
理想情况下,你希望这两条光线在某一点上相遇X.因为在实践中,我们总是有一些噪声(离散噪声,舍入误差等)的两条射线不会在见面X,所以最好的答案将是一个点Q,使得
Q=argmin_X {d(X,ray_1)^2+d(X,ray_2)^2}
Run Code Online (Sandbox Code Playgroud)
其中d(.)表示直线与点之间的欧几里德距离.你能解决这个问题作为一个普通最小二乘问题,或者你可以采取几何方法(称为中点考虑线段)l垂直于两ray_1 和ray_2,并取其中间为您的解决方案.另一种快速而又脏的方法是使用DLT.基本上,您重新编写约束(即 X应尽可能接近两条光线)作为线性系统AX=0并使用SVD求解.
通常,几何(中点)方法不太精确.基于DLT的,虽然数值上不是最稳定的,但通常产生可接受的结果.
存在深度形式化的资源
当然是Hartley-Zisserman的书!第12章.一个简单的基于DLT的方法,就是在opencv中使用的方法(在校准和sfm模块中)都在第312页进行了解释.它非常容易实现,任何时候都不应该超过10分钟.语言.
Szeliski'st书.它在关于可持续森林管理的章节中进行了关于三角测量的讨论,但不像哈特利 - 齐瑟曼那样直截了当或深入.
码.您可以使用opencv中的triangulation方法,来自calib3d模块,或来自contribs/sfm模块.两者都使用DLT,但SFM模块的代码更容易理解(calib3d代码有很多老式的C代码,读起来不是很愉快).还有另一个名为openGV的lib,它有一些有趣的三角测量方法.
CV :: SFM :: triangulatePoints
openGV git repo看起来并不活跃,我不是图书馆设计的忠实粉丝,但如果我没记错的话(请随时告诉我),它提供了DLT用于三角测量的其他方法.
当然,这些都是用C++编写的,但如果你使用其他语言,找到包装器或类似的库并不困难(使用python你仍然有opencv包装器,而MATLAB有一个包模块等).
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |