使用一台摄像机播放立体3D重建并旋转对象,但我似乎无法获得正确的Z贴图。
我遵循典型的流程: 使用棋盘校准相机,获取相机矩阵和 distorsion 。 通过旋转对象 unistort 来拍摄左和右图像。 这一切对我来说都很好。图像看起来不错。
我在左右图像上得到了StereoBM.compute
的视差图。
有一些黑色区域,但大多数是灰色的,所以Z似乎是为大部分图像计算的。
然后我使用stereoRectify
来获取 Q矩阵:
我使用旋转矩阵,我在旋转矢量上使用Rodrigues
构建。
我的旋转仅沿Y轴旋转,因此旋转矢量为[0, angle, 0]
(角度是旋转对象的角度)
就我所知,旋转矩阵似乎是正确的:我尝试了琐碎的角度,我得到了预期的结果。
我还需要翻译矢量,所以我使用了[cos(angle), 0, sin(angle)]
因为我只沿Y旋转,然后我通过旋转的圆弧对相机进行平移。
我使用stereoRectify和相同的相机矩阵和两个相机的失真,因为它是相同的相机。
当我reprojectImageTo3D
带有 Q 和视差地图时,我会在看到正确的角度时看到Meshlab中的结果,但深度当我四处移动时(例如,物体的Z深度是宽度的2倍,当物体的宽度是宽度的十分之一时),似乎有点离开了。
所以,我只是想知道这是否正常,并且预料到因为它只有2幅图像来自~20度的角度差异,或者我只是搞砸了某个地方。特别是我想知道我是否需要考虑从相机到物体旋转中心的距离:我相信旋转矩阵和平移向量应该照顾它,但它是以单位为基础的。
我知道这是一个模糊的问题,但我希望有人可以在这里证实或证实我的假设。
由于
答案 0 :(得分:0)
经过一番思考,我理解为什么这不起作用:
我的虚拟立体相机消失点基本上位于物体的旋转中心,当算法假设它处于无穷远处时。
stereoRectify不能将近焦消失点转换为无限远。
此外,视差图假设水平移位以重新计算Z深度。在我的情况下,移位不是水平平移,而是由于平面内的旋转,这是不起作用。