视差(disparity)是通过计算立体匹配算法(StereoSGBM)得到的。立体匹配是一种用于计算左右立体图像之间像素对应关系的方法。
首先,通过cv::StereoSGBM::create()
函数创建了一个立体匹配对象sgbm
,并传入一系列参数:
- P1: 控制视差平滑度的第一个参数,越大表示视差变化越平滑。
- P2: 控制视差平滑度的第二个参数,越大表示视差变化越平滑。
- preFilterCap: 预处理滤波器的最大值。它是一个限制滤波器输出值的阈值,用于消除杂散噪声。
- minDisparity: 最小视差值。
- numDisparities: 可能的视差值的范围,每个像素将在这个范围内搜索最佳匹配。
- uniquenessRatio: 具有最佳匹配之外的第二最佳匹配的阈值。
- speckleWindowSize: 视差图上移除孤立的小斑点的窗口大小。
- speckleRange: 视差图上移除孤立的小斑点的阈值。
- disp12MaxDiff: 左右两个像素之间的最大视差差异。
接下来,通过sgbm->compute()
函数计算了左右两张图像的视差图(disparity_sgbm)。
最后,通过disparity_sgbm.convertTo(disparity, CV_32F, 1.0 / 16.0f)
函数将视差图的数据类型转换为CV_32F,并将每个像素的值除以16,得到实际的视差值。这是因为在计算视差时,通常会将像素值乘以一个放大因子,以避免损失精度。而在这里,将其恢复为实际视差值,除以16表示将该放大因子还原。
注意:视差图的单位是像素,较小的视差值表示较远的距离,较大的视差值表示较近的距离。
disparity_sgbm
是通过sgbm->compute()
函数计算得到的视差图,其数据类型为CV_16S
,表示每个像素的视差值是一个有符号的16位整数。该视差图的数值范围通常是根据算法的参数和输入图像的大小来确定,一般是一个较小的范围,比如[-128, 127]或[-64, 63]。这种有符号的16位整数视差图可以存储较大的视差范围,但其数值不直接对应实际的距离。
为了得到实际的视差值,通常会将disparity_sgbm
转换成disparity
。通过disparity_sgbm.convertTo(disparity, CV_32F, 1.0 / 16.0f)
将视差图的数据类型转换为CV_32F
,即单精度浮点数。转换后,每个像素的值表示实际的视差值,单位为像素。并且,除以16是根据具体的算法参数来确定的,用于将之前的视差值还原为实际的视差值。
总结起来,disparity_sgbm
是一个有符号的16位整数视差图,disparity
是一个单精度浮点数视差图,存储了实际的视差值,单位为像素。