BM、GC、SGBM三种算法的比较和BM在OpenCV3下的参数设置

         第一部分BM、GC和SGBM算法的性能比较转自:http://blog.csdn.net/chenyusiyuan/article/details/5967291,其中原博主推荐的Stefano Mattoccia大神的讲义Stereo Vision:algorithms and applications,我看了以后觉得非常受用,讲的非常条理全面,里面的参考文献也很经典。第二部分为原创,主要是在OpenCV3.2版本下BM算法的用法改变和参数说明。


    1.BM、GC和SGBM算法性能比较:

    (1)视差效果:BM<SGBM<GC;

    (2)处理速度:BM>SGBM>GC;

    (3)图像类型:BM和GC算法只能对8位灰度图像计算视差,SGBM算法可以处理24位彩色图像;

    (4) SGBM 立体匹配算法(源自Heiko Hirschmuller的《Stereo Processing by Semi-global Matching and Mutual Information》),可以获得比 BM 算法物体轮廓更清晰的视差图(但低纹理区域容易出现横/斜纹路,在 GCstate->fullDP 选项使能时可消减这种异常纹路,但对应区域视差变为0,且运行速度会有所下降),速度比 BM 稍慢, 352*288的帧处理速度大约是 5 帧/秒;

    2.OpenCV3中BM算法的使用更新:

    在OpenCV3中,StereoBM算法发生了比较大的变化,StereoBM被定义为纯虚类,因此不能直接实例化,只能用智能指针的形式实例化,也不用StereoBMState类来设置了,而是改成用bm->set...的形式,详细看如下代码。

//BM(bidirectional matching)算法进行双向匹配,首先通过匹配代价在右图中计算得出匹配点。
//然后相同的原理及计算在左图中的匹配点。比较找到的左匹配点和源匹配点是否一致,如果是,则匹配成功。
//初始化 stereoBMstate 结构体
//错误:不允许使用抽象类型的stereoBM对象
//C++中含有纯虚拟函数并且所有纯虚函数并未完全实现的类称为抽象类,它不能生成对象
//opencv3以后的版本不能这么用了
//StereoBM bm;
//int unitDisparity = 15;//40
//int numberOfDisparities = unitDisparity * 16;
//bm.state->roi1 = roi1;
//bm.state->roi2 = roi2;
//bm.state->preFilterCap = 13;
//bm.state->SADWindowSize = 19;                                     
//bm.state->minDisparity = 0;                                      
//bm.state->numberOfDisparities = numberOfDisparities;             
//bm.state->textureThreshold = 1000;                              
//bm.state->uniquenessRatio = 1;                                 
//bm.state->speckleWindowSize = 200;                            
//bm.state->speckleRange = 32;                           
//bm.state->disp12MaxDiff = -1;

cv::Ptr<cv::StereoBM> bm = cv::StereoBM::create();
int unitDisparity = 15;//40
int numberOfDisparities = unitDisparity * 16;
bm->setROI1(roi1);
bm->setROI2 (roi2);
bm->setPreFilterCap(13);
bm->setBlockSize = 15;                          //SAD窗口大小
bm->setMinDisparity(0);                         //确定匹配搜索从哪里开始  默认值是0
bm->setNumDisparities(numberOfDisparities) ;    //在该数值确定的视差范围内进行搜索,视差窗口
                                                //  即最大视差值与最小视差值之差, 大小必须是16的整数倍
bm->setTextureThreshold(1000);                  //保证有足够的纹理以克服噪声
bm->setUniquenessRatio(1);                      //使用匹配功能模式
bm->setSpeckleWindowSize(200);                  //检查视差连通区域变化度的窗口大小, 值为0时取消 speckle 检查
bm->setSpeckleRange(32);                        // 视差变化阈值,当窗口内视差变化大于阈值时,该窗口内的视差清零
bm->setDisp12MaxDiff(-1);                       //左视差图(直接计算得出)和右视差图(通过cvValidateDisparity计算得出)
                                                //  之间的最大容许差异,默认为-1

      最后需要注意的是,在上述参数中,对视差生成效果影响较大的主要参数是setSADWindowSize、setNumberDisparities和setUniquenessRatio,这三个参数要重点关注和调整。其他参数的影响不算很大。

    



版权声明:本文为zilanpotou182原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>