首页 > 解决方案 > 深度视差矩阵 Q

问题描述

我正在使用立体视觉和需要 Q 矩阵的命令 cv2.reprojectImageTo3D()。我从 cv2.stereoRectify() 获得的 Q 矩阵是

Q = np.array([[1, 0, 0,  357.10], 
              [0, 1, 0, -138.90], 
              [0, 0, 0,  4775.51], 
              [0, 0, 3.42, 0]])

当我尝试将 cv2.reprojectImageTo3D() 与上述 Q 矩阵一起使用时,我得到错误的值。另外,为什么 Q[2,3] 这么大?应用 cv2.reprojectImageTo3D() 后的单位是什么?

然而,许多人建议使用

h, w = imgL.shape[:2]
f = 0.8 * w 
Q = np.float32([[1,  0, 0, -0.5*w],
                [0, -1, 0,  0.5*h],
                [0,  0, 0, -f],
                [0,  0, 1,  0]])

我有以下问题:

  1. 这两个矩阵有什么区别?
  2. 用于校准和实际使用的基线是否必须相同?
  3. 如何通过图像调整大小重新缩放 Q?

谢谢。

标签: python-3.xcamera-calibrationopencv-python

解决方案


  1. 矩阵是相同的,除了建议的 Q 矩阵是在一般情况下使用的近似值。,值表示两个摄像机的主要点-0.5*w0.5*h就好像您要将它们视为一个统一的摄像机一样。在从 stereoRectify 获得的 Q 矩阵中,这些相同的值大致是图像的中心 x,y 像素值。该f值以像素为单位,因此只要您的校准正确完成,大值应该是正确的。

  2. 校准和实际使用的基线必须一致,这些参数非常敏感。如果您想要获得良好的效果,对摄像机位置、倾斜等的任何细微调整都需要重新校准。

  3. 通常,在校准和实际使用期间您应该使用相同的图像尺寸,但如果您想重新缩放,则需要使用相同的图像尺寸进行校准。您还可以尝试通过从旧图像大小到新图像大小的百分比变化来缩放 357.10 和 -138.90 值。

总的来说,您似乎关心cv.reprojectImageTo3D(). 其输出的单位在某种意义上是任意的,因为它们在世界框架坐标系中表示,其中原点 (x,y,z)=(0,0,1) 表示视场的中心并且直接在镜头前。


推荐阅读