SGBM算法:双目相机视差图生成详解

需积分: 37 46 下载量 90 浏览量 更新于2024-09-07 3 收藏 2KB TXT 举报
得到视差图(BM算法)是计算机视觉领域中的一个重要技术,尤其在双目相机系统中,通过处理左、右眼捕获的图像对,计算出两个图像之间的深度信息,形成视差图。OpenCV库提供了一个名为StereoSGBM的函数来实现这一过程,它基于半全局匹配(Semi-Global Block Matching, SGBM)算法,这是一种广泛应用于立体视觉的匹配方法。 在给定的C++代码示例中,我们看到以下几个关键步骤: 1. **图像读取**: 使用`cvLoadImage`函数加载左右眼的图像,如"left.png"和"right.png"。这些图像通常需要预处理,确保它们具有相同的尺寸和通道数。 2. **设置参数**: - `StereoSGBM`类的实例化:创建一个StereoSGBM对象,这是进行匹配的核心。 - `SADWindowSize`(Sum of Absolute Differences, 求绝对差窗口大小):这是一个重要的参数,用于计算像素间差异,较大的窗口可能提供更准确的匹配,但计算成本更高。 - `preFilterCap`:滤波器的阈值,用于降低噪声的影响。 - 其他参数,如`P1`和`P2`用于控制匹配的质量和计算成本,`minDisparity`指定最小可能的视差,`numberOfDisparities`是最大视差范围,`uniquenessRatio`确保匹配的稀疏性和一致性,`speckleWindowSize`和`speckleRange`用于处理匹配噪声,`disp12MaxDiff`限制了匹配结果的差异。 3. **计算视差图**: 使用`sgbm`对象调用`StereoBM()`函数,该函数会返回一个视差图矩阵(Mat disp)和一个8位深度的视差图(Mat disp8)。这里的时间消耗用`getTickCount()`获取,以便后续评估性能。 4. **结果存储**: 视差图存储在`disp`和`disp8`矩阵中,分别用于后续处理或可视化。这些数据可以用于重建3D模型,增强虚拟现实体验,或者在机器人导航等应用中确定物体的距离和位置。 得到视差图(BM算法)的关键在于理解双目相机的工作原理,选择合适的OpenCV API,以及正确调整SGBM的参数以适应特定应用场景。这段代码提供了一个基础框架,实际应用时可能需要根据具体需求进一步优化和调整。