0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于OpenCV3.0的BM、SGBM和GC算法對(duì)比

機(jī)器視覺(jué) ? 2019-06-12 15:10 ? 次閱讀

引言:基于OpenCV3.0,對(duì)BM、SGBM和GC算法進(jìn)行了對(duì)比測(cè)試研究。由于SGBM算法視差效果好速度快的特點(diǎn),常常被廣泛應(yīng)用和改進(jìn),本文針對(duì)SGBM算法主要參數(shù)設(shè)置作了對(duì)比測(cè)試,以供大家參考。

BM:Block Matching ,采用SAD方法計(jì)算匹配代價(jià);

SGBM: 修改自Heiko Hirschmuller的《Stereo Processing by Semi-global Matching and Mutual Information》:http://www.openrs.org/photogrammetry/2015/SGM%202008%20PAMI%20-%20Stereo%20Processing%20by%20Semiglobal%20Matching%20and%20Mutual%20Informtion.pdf;長(zhǎng)按以下二維碼可直接打開(kāi)

與原方法不同點(diǎn):

沒(méi)有實(shí)現(xiàn)原文中基于互信息的匹配代價(jià)計(jì)算,而是采用BT算法("Depth Discontinuities by Pixel-to-Pixel Stereo()" by S. Birchfield and C. Tomasi);

默認(rèn)運(yùn)行單通道DP算法,只用了5個(gè)方向,而fullDP使能時(shí)則使用8個(gè)方向(可能需要占用大量?jī)?nèi)存);

增加了一些BM算法中的預(yù)處理和后處理程序;

GC:OpenCV3.0中沒(méi)有實(shí)現(xiàn),可以在OpenCV以下版本中找到。該方法效果是最好的,但是速度太慢,不能達(dá)到實(shí)時(shí)的匹配效率;

1、SGBM

主要參數(shù):minDisparity 、numDisparities、blockSize、P1、P2。其他參數(shù)設(shè)置參照http://blog.csdn.net/zhubaohua_bupt/article/details/51866567

代碼:

#include "stdafx.h"

#include "opencv2/opencv.hpp

using namespace std;

using namespace cv;

int _tmain(int argc, _TCHAR* argv[])

{

Mat left = imread("imgL.jpg", IMREAD_GRAYSCALE);

Mat right = imread("imgR.jpg", IMREAD_GRAYSCALE);

Mat disp;

int mindisparity = 0;

int ndisparities = 64;

int SADWindowSize = 11;

//SGBM

cv::Ptr sgbm = cv::StereoSGBM::create(mindisparity, ndisparities, SADWindowSize);

int P1 = 8 * left.channels() * SADWindowSize* SADWindowSize;

int P2 = 32 * left.channels() * SADWindowSize* SADWindowSize;

sgbm->setP1(P1);

sgbm->setP2(P2);

sgbm->setPreFilterCap(15);

sgbm->setUniquenessRatio(10);

sgbm->setSpeckleRange(2);

sgbm->setSpeckleWindowSize(100);

sgbm->setDisp12MaxDiff(1);

//sgbm->setMode(cv::StereoSGBM::MODE_HH);

sgbm->compute(left, right, disp);

disp.convertTo(disp, CV_32F, 1.0 / 16); //除以16得到真實(shí)視差值

Mat disp8U = Mat(disp.rows, disp.cols, CV_8UC1); //顯示

normalize(disp, disp8U, 0, 255, NORM_MINMAX, CV_8UC1);

imwrite("results/SGBM.jpg", disp8U);

return 0;

}

minDisparity:最小視差,默認(rèn)為0。此參數(shù)決定左圖中的像素點(diǎn)在右圖匹配搜索的起點(diǎn),int 類(lèi)型;

numDisparities:視差搜索范圍長(zhǎng)度,其值必須為16的整數(shù)倍。最大視差 maxDisparity = minDisparity + numDisparities -1;

blockSize:SAD代價(jià)計(jì)算窗口大小,默認(rèn)為5。窗口大小為奇數(shù),一般在3*3 到21*21之間;

P1、P2:能量函數(shù)參數(shù),P1是相鄰像素點(diǎn)視差增/減 1 時(shí)的懲罰系數(shù);P2是相鄰像素點(diǎn)視差變化值大于1時(shí)的懲罰系數(shù)。P2必須大于P1。需要指出,在動(dòng)態(tài)規(guī)劃時(shí),P1和P2都是常數(shù)。

一般建議:P1 = 8*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;

總結(jié):

1. blockSize(SADWindowSize) 越小,也就是匹配代價(jià)計(jì)算的窗口越小,視差圖噪聲越大;blockSize越大,視差圖越平滑;太大的size容易導(dǎo)致過(guò)平滑,并且誤匹配增多,體現(xiàn)在視差圖中空洞增多;

2. 懲罰系數(shù)控制視差圖的平滑度,P2>P1,P2越大則視差圖越平滑;

3. 八方向動(dòng)態(tài)規(guī)劃較五方向改善效果不明顯,主要在圖像邊緣能夠找到正確的匹配;

2、BM

代碼:

#include "stdafx.h"

#include "opencv2/opencv.hpp"

using namespace std;

using namespace cv;

int _tmain(int argc, _TCHAR* argv[])

{

Mat left = imread("imgL.jpg", IMREAD_GRAYSCALE);

Mat right = imread("imgR.jpg", IMREAD_GRAYSCALE);

Mat disp;

int mindisparity = 0;

int ndisparities = 64;

int SADWindowSize = 11;

cv::Ptr bm = cv::StereoBM::create(ndisparities, SADWindowSize);

// setter

bm->setBlockSize(SADWindowSize);

bm->setMinDisparity(mindisparity);

bm->setNumDisparities(ndisparities);

bm->setPreFilterSize(15);

bm->setPreFilterCap(31);

bm->setTextureThreshold(10);

bm->setUniquenessRatio(10);

bm->setDisp12MaxDiff(1);

copyMakeBorder(left, left, 0, 0, 80, 0, IPL_BORDER_REPLICATE); //防止黑邊

copyMakeBorder(right, right, 0, 0, 80, 0, IPL_BORDER_REPLICATE);

bm->compute(left, right, disp);

disp.convertTo(disp, CV_32F, 1.0 / 16); //除以16得到真實(shí)視差值

disp = disp.colRange(80, disp.cols);

Mat disp8U = Mat(disp.rows, disp.cols, CV_8UC1);

normalize(disp, disp8U, 0, 255, NORM_MINMAX, CV_8UC1);

imwrite("results/BM.jpg", disp8U);

return 0;

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 機(jī)器視覺(jué)
    +關(guān)注

    關(guān)注

    162

    文章

    4373

    瀏覽量

    120333
  • OpenCV
    +關(guān)注

    關(guān)注

    31

    文章

    635

    瀏覽量

    41355

原文標(biāo)題:立體匹配算法對(duì)比研究

文章出處:【微信號(hào):www_51qudong_com,微信公眾號(hào):機(jī)器視覺(jué)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于QT+OpenCv的目標(biāo)跟蹤算法實(shí)現(xiàn)

    目標(biāo)跟蹤算法作為一種有著非常廣泛的應(yīng)用的算法,在航空航天、智能交通、智能設(shè)備等領(lǐng)域有著非常廣泛的應(yīng)用。本系列博客將教大家在410c開(kāi)發(fā)板上基于linux操作系統(tǒng)環(huán)境,采用QT+Opencv來(lái)實(shí)現(xiàn)
    發(fā)表于 09-21 10:42

    關(guān)于BM_OPENCV相關(guān)問(wèn)題

    upsample的做法沒(méi)有標(biāo)準(zhǔn)強(qiáng)制統(tǒng)一,jpeg-turbo提供了默認(rèn)Fancy upsample,也提供了快速?gòu)?fù)制上采樣的算法,原生opencv采用默認(rèn)的fancy upsample;而BM
    發(fā)表于 09-19 07:28

    如何在開(kāi)發(fā)環(huán)境中的Python環(huán)境下使用我們提供的BM-OpenCV?

    如何在開(kāi)發(fā)環(huán)境中的Python環(huán)境下使用我們提供的BM-OpenCV?
    發(fā)表于 09-19 07:14

    關(guān)于BM-OpenCV中GB28181接口,說(shuō)的是接國(guó)標(biāo)流是吧?本身支持轉(zhuǎn)國(guó)標(biāo)流功能嗎?

    關(guān)于BM-OpenCV中GB28181接口,說(shuō)的是接國(guó)標(biāo)流是吧?本身支持轉(zhuǎn)國(guó)標(biāo)流功能嗎?
    發(fā)表于 09-19 06:31

    openCV的庫(kù)自帶了模板匹配算法嗎?

    openCV的庫(kù)自帶了模板匹配算法
    發(fā)表于 10-10 06:48

    改進(jìn)的AC-BM字符串匹配算法

    提出了改進(jìn)的AC-BM算法,將待匹配的字符串集合轉(zhuǎn)換為一個(gè)類(lèi)似于Aho-Corasick算法的樹(shù)狀有限狀態(tài)自動(dòng)機(jī)。匹配時(shí),采取自后向前的方法,并借用BM
    發(fā)表于 12-10 17:30 ?13次下載

    基于網(wǎng)絡(luò)入侵模式匹配的BM 算法研究與優(yōu)化The Optim

    本文在分析現(xiàn)有網(wǎng)絡(luò)入侵模式匹配BM 算法的基礎(chǔ)上,提出了改進(jìn)BM 規(guī)則匹配算法。該算法克服了傳統(tǒng)BM
    發(fā)表于 05-27 16:42 ?29次下載

    BM模式匹配算法的研究和改進(jìn)

    模式匹配算法在數(shù)字通信、入侵檢測(cè)等多種領(lǐng)域都有著廣泛的應(yīng)用,BM算法以其高效的匹配過(guò)程成為模式匹配算法中應(yīng)用最為廣泛的算法之一。盡管如此,
    發(fā)表于 10-17 11:23 ?0次下載
    <b class='flag-5'>BM</b>模式匹配<b class='flag-5'>算法</b>的研究和改進(jìn)

    直方圖對(duì)比_OpenCV3編程入門(mén)-源碼例程

    OpenCV3編程入門(mén)-源碼例程全集-直方圖對(duì)比,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 09-18 17:02 ?2次下載

    字符串的KMP算法BM算法

    本文主要介紹KMP算法BM算法,它們分別是前綴匹配和后綴匹配的經(jīng)典算法。所謂前綴匹配是指:模式串和母串的比較從左到右,模式串的移動(dòng)也是從左到右;所謂后綴匹配是指:模式串和母串的的比較
    發(fā)表于 11-15 14:53 ?2428次閱讀
    字符串的KMP<b class='flag-5'>算法</b>和<b class='flag-5'>BM</b><b class='flag-5'>算法</b>

    opencv3.0.0(x86)安裝教程與配置設(shè)置教程

    OpenCV3.0的幾個(gè)變動(dòng)   更加細(xì)顆粒度的模塊化,大量的 module   更加的 C++ 化,所有算法繼承自 cv::Algorithm,算法的接口統(tǒng)一   向過(guò)去說(shuō)
    發(fā)表于 12-14 18:30 ?2次下載

    opencv 白平衡算法

    白平衡就是圖片中最亮的部分為白色,最暗的部分為黑色,其余部分進(jìn)行拉伸。下文將詳細(xì)介紹OpenCV實(shí)現(xiàn)的灰度世界算法
    發(fā)表于 01-17 09:05 ?7817次閱讀

    立體匹配:經(jīng)典算法Fast Bilateral Solver

    而下面左圖是OpenCVSGBM算法得到的視差圖,右邊則是通過(guò)我今天要介紹的算法處理后的視差圖。看了它們后,我想你應(yīng)該對(duì)什么叫做”化腐朽為神奇“有了深刻印象了吧。
    的頭像 發(fā)表于 01-03 10:59 ?1743次閱讀

    ART虛擬機(jī)CMC GC算法核心實(shí)現(xiàn)介紹

    當(dāng)前Android(O-T)一直使用的是Concurrent Copy GC算法(CC),該算法通過(guò)FromSpace和ToSpace兩個(gè)空間實(shí)現(xiàn)了非常巧妙的Copy機(jī)制,算是空間換時(shí)間(或者說(shuō)復(fù)雜度),所以在
    的頭像 發(fā)表于 06-28 09:10 ?1683次閱讀

    深入探討SGBM參數(shù)影響效果

    SGBM(Semi-Global Block Matching)是一種用于計(jì)算雙目視覺(jué)中視差(disparity)的半全局匹配算法,在OpenCV中的實(shí)現(xiàn)為semi-global block matching(
    的頭像 發(fā)表于 06-28 09:29 ?2399次閱讀
    深入探討<b class='flag-5'>SGBM</b>參數(shù)影響效果