如何使用立体三角测量从2D图像点计算3D对象点?

emi*_*ish 5 python opencv image-processing triangulation stereoscopy

我有一个使用OpenCV和Python校准的立体校准相机系统.我试图用它来计算图像点的3D位置.我收集了内在和外在矩阵,以及E,F,R和T矩阵.我对如何将2D图像点三角测量到3D对象点感到困惑.我已阅读以下文章,但我对这个过程感到困惑(在校准的立体视觉设备中,如何获得实现3D三角测量算法所需的"相机矩阵"?).有人可以解释如何从2D到3D吗?从阅读开始,我觉得基本矩阵(F)很重要,但我没有找到一种明确的方法将它与投影矩阵(P)联系起来.有人可以指导我完成这个过程吗?

我感谢任何帮助.

BCo*_*nic 10

如果您校准了立体摄像机,则每台摄像机应具有内在函数K1,K2,以及从第一台摄像机到第二台摄像机的旋转R12和平移t12.从这些,你可以形成相机投影矩阵P1和P2如下:

P1 = K1 * [I3 | 0]
P2 = K2 * [R12 | t12]
Run Code Online (Sandbox Code Playgroud)

这里,I3是3x3单位矩阵,符号[R | t]表示水平堆叠R和t.

然后,您可以使用函数triangulatePoints(文档),它实现两个摄像机矩阵的稀疏立体三角剖分.

如果您需要密集三角测量或深度图估计,那么有几个功能.首先需要使用stereoRectify(文档)纠正两个图像,然后执行立体匹配,例如使用StereoBM(文档).

  • 仅供参考.要获得准确的测量值,请记住采用4xn输出矩阵(来自triangulatePoints)并将前三列(x,y,z)除以第4列.`output/= output [3]` (3认同)
  • 每个点都必须是 float 类型,否则你会得到意想不到的结果(甚至是段错误) (2认同)