cv::Ptr<cv::StereoBM> bm = cv::StereoBM::create(16, 9);
bm->setPreFilterType(cv::StereoBM::PREFILTER_XSOBEL);//预处理滤波器类型,有两种可选类型:PREFILTER_NORMALIZED_RESPONSE(归一化响应) 或者 PREFILTER_XSOBEL (水平方向Sobel算子,默认类型)
bm->setPreFilterCap(63);//31//预处理滤波器的截断值,计算每个像素的x导数,并按[-preFilterCap, preFilterCap]间隔裁剪其值,结果值传递给 Birchfield-Tomasi 像素代价函数。
 bm->setPreFilterSize(7);//预处理滤波器窗口大小,容许范围是[5,255],一般应该在 5x5..21x21 之间,参数必须为奇数值
  bm->setTextureThreshold(30);//低纹理区域的判断阈值,如果当前窗口内所有邻居像素点的x导数绝对值之和小于指定阈值,则该窗口对应的像素点的视差值为0
  bm->setUniquenessRatio(10);// 视差窗口范围内最低代价(指最好的结果)是次低代价的(1 + uniquenessRatio/100)倍时,最低代价对应的视差值才是该像素点的视差,否则该像素点的视差为 0
  bm->setSpeckleWindowSize(72);//检查视差连通区域变化度的窗口大小, 值为 0 时取消 speckle 检查,否则取【50,200】内的值比较合适
   bm->setSpeckleRange(16);//在sgbm的官方参数介绍中说该值会被乘以16,设置为1或2比较合适,bm应该是没有乘以16
   //roi1, roi2:左右视图的有效像素区域,一般由双目校正阶段的 cvStereoRectify 函数传递,也可以自行设定。一旦在状态参数中设定了 roi1 和 roi2,OpenCV 会通过cvGetValidDisparityROI 函数计算出视差图的有效区域,在有效区域外的视差值将被清零。
//disp12MaxDiff:左视差图(直接计算得出)和右视差图(通过cvValidateDisparity计算得出)之间的最大容许差异。超过该阈值的视差值将被清零。该参数默认为 -1,即不执行左右视差检查。int 型。注意在程序调试阶段最好保持该值为 -1,以便查看不同视差窗口生成的视差效果。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐