Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
给定OpenCV中的立体视差贴图,如何找到左右图像之间的真实像素偏移(每像素)?_Opencv_Stereo 3d_Disparity Mapping - Fatal编程技术网

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

给定OpenCV中的立体视差贴图,如何找到左右图像之间的真实像素偏移(每像素)?,opencv,stereo-3d,disparity-mapping,Opencv,Stereo 3d,Disparity Mapping,我已经成功地使用OpenCV 2.4.5中的cv::立体声GBM类创建了一个令人满意的视差图,具有256个不同的视差级别。我已经将所有视差值除以16,如文档中所示,但最终的贴图不可能包含“真实”的视差:如果我将计算的视差(x+d)添加到(x,y)像素的水平维度上,则另一个图像中的结果坐标(x+d,y)对应于完全不同的像素 我想问题是因为我最初将立体GBM参数化为256个视差级别,但实际的最大视差(以像素为单位)要小得多。因为我不知道实际的最大视差,所以我不能相应地标准化由GBM计算的值 我需要实

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

我想问题是因为我最初将立体GBM参数化为256个视差级别,但实际的最大视差(以像素为单位)要小得多。因为我不知道实际的最大视差,所以我不能相应地标准化由GBM计算的值


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

我也有同样的问题,我就是这样解决的:

您的实际(原始)差异是立体声GBM类作为输出给出的。您只能缩放它,以便以图像格式查看它

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

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

这是您将对相应点执行的操作:
假设
I1
是您的左图像,
I2
是您的右图像,
d
是某行
i
和某列
j
的视差值,那么,
I1(i,j)
I2(i,j-d)
将是相应的点,假设水平立体。

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

您可以看到-50和128之间的中间区域是等效的。因此,num_dispation和min_dispation的值不会影响SGBM的缩放输出

请注意,视差是由所用相机的基线和焦距缩放的。因此,如果您使用多个立体对图像中的多个视差贴图,则每个视差贴图都会根据该对图像的基线进行缩放,并且如果特定焦距使用了不同的摄影机,则会进行缩放