一、原理
就是最基本的滑动窗口。BM的匹配方法是通过计算SAD(绝对差之和),即两个匹配块的像素相减取绝对值,再把匹配窗口中所有值加起来,这个值越小就代表匹配度越高。
二、API
可以通过StereoBM::create 来创建BM算法
Ptr<StereoBM> bm = StereoBM::create(
int minDisparity = 0,
int numDisparities = 16,
int blockSize = 3,
int P1 = 0, int P2 = 0,
int disp12MaxDiff = 0,
int preFilterCap = 0,
int uniquenessRatio = 0,
int speckleWindowSize = 0,
int speckleRange = 0,
int mode = StereoSGBM::MODE_SGBM
);
也可以create之后再设置参数
bm->setBlockSize(2 * blockSize + 5); //SAD窗口大小,5~21之间为宜
bm->setROI1(validROIL);
bm->setROI2(validROIR);
bm->setPreFilterCap(31);
bm->setMinDisparity(0); //最小视差,默认值为0, 可以是负值,int型
//视差窗口,即最大视差值与最小视差值之差,窗口大小必须是16的整数倍,int型
bm->setNumDisparities(numDisparities * 16 + 16);
bm->setTextureThreshold(10);
//uniquenessRatio主要可以防止误匹配
bm->setUniquenessRatio(uniquenessRatio);
bm->setSpeckleWindowSize(100);
bm->setSpeckleRange(32);
bm->setDisp12MaxDiff(-1);
//输入图像必须为灰度图
bm->compute(rectifyImageL, rectifyImageR, disp);
其中的参数意义如下:
参考链接:
https://blog.csdn.net/weixin_36135696/article/details/105576877?ops_request_misc=&request_id=&biz_id=102&utm_term=%E7%AB%8B%E4%BD%93%E5%8C%B9%E9%85%8Dbm%E7%AE%97%E6%B3%95%E5%8E%9F%E7%90%86&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-105576877.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187
setROI1、setROI2: 图像校正后一般会对图像进行裁剪,这个是用来设置裁剪之后的区域。
setFilterType:预处理滤波器的类型。用于消除噪声、降低亮度失真、增强纹理。
preFilterSize:预处理滤波器的窗口大小。一般为5~21
preFilterCap:预处理滤波器的截断值,预处理的输出值仅保留[-preFilterCap, preFilterCap]之间。参数范围是1-63,int型
SADwindowSize:SAD窗口大小,允许范围[5,255]必须是奇数
minDisparity:最小视差,默认为0
numDIsparities:视差窗口,即最大视差值与最小视差值之差,窗口大小必须是16的整倍数,int型
textureThresshold:低纹理区域判定阈值,如果当前SAD窗口内所有邻居像素点的x导数绝对值小于指定阈值,则该窗口对应的像素点视差值为0
uniquenessRatio:视差唯一性百分比,视差窗口范围内最低代价是次低代价的(1+uniquenessRatio/100)倍时,最低代价对应的视差值是该像素点的视差,否则该像素点视差为0
//视差窗口,即最大视差值与最小视差值之差,窗口大小必须是16的整数倍,int型
speckleWindowSize:检查视差连通区域变化的窗口大小,值为0时取消speckle检查,int型
speckleRange:视差变化阈值,当窗口呢视差变化大于阈值时,该窗口内的视差清零,int型
Disp12MaxDiff:左右一致性检测最大容许误差阈值。