给定OpenCV中的立体视差贴图,如何找到左右图像之间的真实像素偏移(每像素)?
我已经成功地使用OpenCV 2.4.5中的cv::立体声GBM类创建了一个令人满意的视差图,具有256个不同的视差级别。我已经将所有视差值除以16,如文档中所示,但最终的贴图不可能包含“真实”的视差:如果我将计算的视差(x+d)添加到(x,y)像素的水平维度上,则另一个图像中的结果坐标(x+d,y)对应于完全不同的像素 我想问题是因为我最初将立体GBM参数化为256个视差级别,但实际的最大视差(以像素为单位)要小得多。因为我不知道实际的最大视差,所以我不能相应地标准化由GBM计算的值给定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计算的值 我需要实
我需要实际视差值来计算密集立体对应(三角测量和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的缩放输出
请注意,视差是由所用相机的基线和焦距缩放的。因此,如果您使用多个立体对图像中的多个视差贴图,则每个视差贴图都会根据该对图像的基线进行缩放,并且如果特定焦距使用了不同的摄影机,则会进行缩放