SGBM算法实现双目相机视差图计算

3星 · 超过75%的资源 需积分: 50 85 下载量 91 浏览量 更新于2024-09-07 2 收藏 1KB TXT 举报
计算机视觉视差图(SGBM算法)是一种广泛应用于双目视觉系统中的深度估计方法,它基于结构相似性(SAD)模板匹配原理,用于计算左右两幅图像之间的像素差异。在给出的C++代码片段中,主要展示了如何使用OpenCV库实现SGBM(Stereo Block Matching)算法来生成视差图。 首先,包括必要的头文件,如`#include <opencv2/opencv.hpp>`,引入OpenCV库的接口。`StereoBM`类是OpenCV提供的一个高效且可配置的单应性和深度估计器,适合于实时应用。 代码初始化了两个灰度图像,分别读取左右相机的图像文件"imgL.jpg"和"imgR.jpg"。然后定义了视差图变量`Mat disp`,以及一些关键参数,如最小视差(`mindisparity`)、视差范围(`ndisparities`)、模板窗口大小(`SADWindowSize`)等。这些参数的选择对最终结果有显著影响,例如模板窗口大小会影响匹配精度与速度。 接下来,创建了一个`cv::StereoBM`对象`bm`,并设置了上述参数。预滤波器大小(`setPreFilterSize`)、阈值(`setTextureThreshold`)、唯一性比率(`setUniquenessRatio`)和最大允许的相邻视差差(`setDisp12MaxDiff`)都是用来提高匹配性能和消除噪声的。 为了处理边缘和光照变化,代码使用`copyMakeBorder`函数在图像边缘添加了边界像素,这里使用了复制边界模式(`IPL_BORDER_REPLICATE`)。接着,调用`bm->compute`方法,输入左右图像,计算出视差图`disp`。由于原始视差值可能范围较大,通过`convertTo`函数将其转换为浮点型,并缩放以适应实际应用场景(这里是将像素值范围缩小到1/16,以便后续处理)。 最后,视差图进一步进行8位无符号整数(`CV_8UC1`)的归一化,确保值在0到255之间,便于显示和保存。通过`imwrite`函数将处理后的视差图保存为"results/BM.jpg"。 总结来说,这段代码演示了如何使用SGBM算法在计算机视觉中估计双目相机的视差图,展示了基本的图像读取、参数设置、计算过程以及结果的后处理步骤。这是一种简单但实用的方法,适用于需要快速获得相对深度信息的应用场景。