python-3.x - 深度视差矩阵 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]])
我有以下问题:
- 这两个矩阵有什么区别?
- 用于校准和实际使用的基线是否必须相同?
- 如何通过图像调整大小重新缩放 Q?
谢谢。
解决方案
矩阵是相同的,除了建议的 Q 矩阵是在一般情况下使用的近似值。,值表示两个摄像机的主要点
-0.5*w
,0.5*h
就好像您要将它们视为一个统一的摄像机一样。在从 stereoRectify 获得的 Q 矩阵中,这些相同的值大致是图像的中心 x,y 像素值。该f
值以像素为单位,因此只要您的校准正确完成,大值应该是正确的。校准和实际使用的基线必须一致,这些参数非常敏感。如果您想要获得良好的效果,对摄像机位置、倾斜等的任何细微调整都需要重新校准。
通常,在校准和实际使用期间您应该使用相同的图像尺寸,但如果您想重新缩放,则需要使用相同的图像尺寸进行校准。您还可以尝试通过从旧图像大小到新图像大小的百分比变化来缩放 357.10 和 -138.90 值。
总的来说,您似乎关心cv.reprojectImageTo3D()
. 其输出的单位在某种意义上是任意的,因为它们在世界框架坐标系中表示,其中原点 (x,y,z)=(0,0,1) 表示视场的中心并且直接在镜头前。
推荐阅读
- python - matplotlib:绘制多维数据帧的二维散点图
- python - python 会像 Visual Studio 控制台应用程序那样提示用户输入吗?如果是,请举个例子
- angular - 在 Angular 6 全局环境中运行 Angular 5 应用程序
- javascript - Vue Leaflet 不渲染地图
- javascript - jquery自动点击多个链接
- angular - 从 RXJS 5 迁移到 6 - IntervalObservable
- javascript - 圈内的涟漪效应
- getorgchart - 如何在 getorgchart 中保存更新的节点?
- eclipse - 如何在 Maven 中添加依赖项,以便 Eclipse 可以在构建路径上使用它
- java - Java为数组分配错误的数字