给定OpenCV中的立体视差图,如何在左右图像(每像素)之间找到真正的像素偏移?

时间:2013-05-10 15:49:20

标签: opencv stereo-3d disparity-mapping

我在OpenCV 2.4.5中使用cv :: stereoSGBM类成功地创建了一个令人满意的视差图,具有256个不同的差异级别。我已将所有视差值除以16,如文档中所示,但此最终地图不可能包含“真实”视差:如果我添加到(x,y)像素的水平尺寸,则计算差异(x + d),另一图像中的结果坐标(x + d,y)对应于完全不同的像素。

我想这个问题源于我最初为256个视差水平参数化stereoSGBM的事实,但实际最大差异(以像素为单位)更小。由于我真的不知道实际最大差异,我不能相应地规范化由stereoSGBM计算的值。

我需要实际的视差值来计算密集的立体声对应(三角测量和三维重建所必需的)。

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,这就是我修复它的方法:

您的实际(原始)差异是StereoSGBM类作为输出提供的。您只能缩放它,以便您可以以图像格式查看它。

为了获得左图像和右图像的对应像素,使用由StereoSGBM类给出的视差矩阵。这意味着,您不应该将其缩放为以图像格式查看。然后你会得到相应的点。

但是在访问这些值时要小心。数据类型为_int16。如果使用错误的数据类型,您将遇到异常。

这就是你要为相应的点做的事情: 假设I1是你的左图,I2是你的右图,而d是某行i和列j的差异值,那么,{假设水平立体声,{1}}和I1(i,j)将是相应的点。

答案 1 :(得分:0)

我做了一些测试,当你将SGBM的输出除以16时,给你真正的差异。这里你看到两个直方图的视差输出为-128到128和-128到256的差异:(显示的差异)除以16)

-128_128

-128_256

您会看到介于-50和128之间的中间区域是等效的。所以num_disparity和min_disparity的值不会影响SGBM的缩放输出。

请注意,视差是根据使用过的相机的基线和焦距来缩放的。因此,如果您使用来自多个立体对图像的多个视差图,则每个单一视差图由该对的基线缩放,并且如果特定焦距使用不同的相机。