使用1个摄像头进行OpenCV 3D重建

时间:2016-01-11 01:32:00

标签: opencv 3d

使用一台摄像机播放立体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度的角度差异,或者我只是搞砸了某个地方。特别是我想知道我是否需要考虑从相机到物体旋转中心的距离:我相信旋转矩阵和平移向量应该照顾它,但它是以单位为基础的。

我知道这是一个模糊的问题,但我希望有人可以在这里证实或证实我的假设。

由于

1 个答案:

答案 0 :(得分:0)

经过一番思考,我理解为什么这不起作用:

我的虚拟立体相机消失点基本上位于物体的旋转中心,当算法假设它处于无穷远处时。

stereoRectify不能将近焦消失点转换为无限远。

此外,视差图假设水平移位以重新计算Z深度。在我的情况下,移位不是水平平移,而是由于平面内的旋转,这是不起作用。