1. 程式人生 > >BM、GC、SGBM三種演算法的比較和BM在OpenCV3下的引數設定

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,這三個引數要重點關注和調整。其他引數的影響不算很大。