雙目立體視覺一直是機(jī)器視覺研究領(lǐng)域的發(fā)展熱點(diǎn)和難點(diǎn),“熱”是因?yàn)殡p目立體視覺有著及其廣闊的應(yīng)用前景,且隨著光學(xué)、計(jì)算機(jī)科學(xué)等學(xué)科的不斷發(fā)展,雙目立體技術(shù)將不斷進(jìn)步直到應(yīng)用到人類生活的方方面面?!半y”則是因?yàn)槭艿綌z像機(jī)、鏡頭等硬件設(shè)備及一些相關(guān)算法的限制。
01 簡介
雙目立體視覺是機(jī)器視覺中的一個(gè)重要分支,自上世紀(jì)60年代中期開創(chuàng)以來,經(jīng)過幾十年的發(fā)展,如今在機(jī)器人視覺、航空測繪、軍事應(yīng)及醫(yī)學(xué)成像、工業(yè)檢測上應(yīng)用極其廣泛。雙目立體視覺基于視差原理并利用成像設(shè)備從不同的位置獲取被測物體的左右兩幅圖像,然后根據(jù)三角測量原理計(jì)算空間點(diǎn)在二維圖像的位置偏差,最后再利用位置偏差進(jìn)行三維重建來獲取被測物體的三維幾何信息(本文不對雙目立體視覺的數(shù)學(xué)原理進(jìn)行詳細(xì)介紹)。
02
雙目立體視覺的三大基本算法的原理及其代碼實(shí)現(xiàn)(基于opencv)
雙目立體視覺中常用的基于區(qū)域的局部匹配準(zhǔn)則主要有圖像序列中對應(yīng)像素差的絕對值之和SAD(sum of absolute differences)、對應(yīng)像素差的平方之和SSD(sum of squared differences)及半全局匹配算法SGM(semi—global matching)。
2.1 SAD(sum of absolute differences)的原理
匹配算法SAD的基本思想是對經(jīng)行對準(zhǔn)后的左右視圖圖像的對應(yīng)像素塊的對應(yīng)像素差的絕對值進(jìn)行求和。
其數(shù)學(xué)公式如下:
SAD匹配算法的基本流程如下:
①輸入兩幅已經(jīng)校正實(shí)現(xiàn)行對準(zhǔn)的左視圖(Left-Image)及右視圖(Right-Image)。
②對左視圖Left-Image進(jìn)行掃描選定一個(gè)錨點(diǎn)并構(gòu)建一個(gè)類似于卷積核的小窗口。
③用此小窗口覆蓋Left-Image,并選擇出小窗口覆蓋區(qū)域的全部像素點(diǎn)。
④同樣用此小窗口覆蓋Right-Image,并選擇出小窗口覆蓋區(qū)域的全部像素點(diǎn)。
⑤Left-Image覆蓋區(qū)域的像素減去Right-Image覆蓋區(qū)域的像素,并求出所有像素點(diǎn)的差的絕對值之和。
⑥移動Right-Image的小窗口并重復(fù)④—⑤的操作。(注意此處會設(shè)置一個(gè)搜索范圍,超過此范圍則跳出)
⑦找到這個(gè)范圍內(nèi)SAD值最小的小窗口,此時(shí)便找到了與Left-Image錨點(diǎn)的最佳匹配的像素塊。
2.1.1 SAD(sum of absolute differences)的基于opencv的C++代碼實(shí)現(xiàn)
首先先定義一個(gè)SAD 算法的頭文件(SAD_Algorithm.h):
#include"iostream" #include"opencv2/opencv.hpp" #include"iomanip" using namespace std; using namespace cv; class SAD { public: SAD() :winSize(7), DSR(30) {} SAD(int _winSize, int _DSR) :winSize(_winSize), DSR(_DSR) {} Mat computerSAD(Mat &L, Mat &R); //計(jì)算SAD private: int winSize; //卷積核的尺寸 int DSR; //視差搜索范圍 }; Mat SAD::computerSAD(Mat &L, Mat &R) { int Height = L.rows; int Width = L.cols; Mat Kernel_L(Size(winSize, winSize), CV_8U, Scalar::all(0)); Mat Kernel_R(Size(winSize, winSize), CV_8U, Scalar::all(0)); Mat Disparity(Height, Width, CV_8U, Scalar(0)); //視差圖 for (int i = 0; i= 0) { Kernel_R = R(Rect(x, j, winSize, winSize)); Mat Dif; absdiff(Kernel_L, Kernel_R, Dif);//求差的絕對值之和 Scalar ADD = sum(Dif); float a = ADD[0]; MM.at (k) = a; } } Point minLoc; minMaxLoc(MM, NULL, NULL, &minLoc, NULL); int loc = minLoc.x; //int loc=DSR-loc; Disparity.at (j, i) = loc * 16; } double rate = double(i) / (Width); cout << "已完成" << setprecision(2) << rate * 100 << "%" << endl; //顯示處理進(jìn)度 } return Disparity; } 調(diào)用示例: #include"SAD_Algorithm.h" int main(int argc, char* argv[]) { Mat Img_L = imread("Teddy_L.png", 0); //此處調(diào)用的圖像已放入項(xiàng)目文件夾中 Mat Img_R = imread("Teddy_R.png", 0); Mat Disparity; //創(chuàng)建視差圖 SAD mySAD(7, 30); //給出SAD的參數(shù) Disparity = mySAD.computerSAD(Img_L, Img_R); imshow("Teddy_L", Img_L); imshow("Teddy_R", Img_R); imshow("Disparity", Disparity); //顯示視差圖 waitKey(); system("pause"); //按任意鍵退出 return 0; }
2.1.2 SAD算法的運(yùn)行效果
可以看出SAD算法雖然運(yùn)行較快,但效果較差。
2.2 SSD(sum of squared differences)的原理
SSD(sum of squared differences)算法大致與SAD(sum of absolute differences)相似。
其數(shù)學(xué)公式如下:
因SSD匹配算法與SAD匹配算法的過程及代碼實(shí)現(xiàn)相類似,考慮到篇幅長度的原因,故SSD算法的基本過程及代碼實(shí)現(xiàn)在本文中不在贅述,讀者可去自行實(shí)現(xiàn)。
2.3 SGBM(semi-global block matching)的原理
SGM(semi-global matching)是一種用于計(jì)算雙目立體視覺中的disparity的半全局匹配算法。其在opencv中的實(shí)現(xiàn)為SGBM(semi-global block matching)。
SGBM的原理:設(shè)置一個(gè)和disparity map(由每個(gè)像素點(diǎn)的disparity所構(gòu)成)相關(guān)的全局能量函數(shù),使這個(gè)能量函數(shù)最小。
原始文獻(xiàn):Heiko Hirschmuller. Stereo processing by semiglobal matching and mutual information.Pattern Analysis and Machine Intelligence, IEEE Transactions on, 30(2):328–341, 2008.
其能量函數(shù)如下:
D--disparity map(視差圖)
p、q—圖像中的某個(gè)像素
Np—像素點(diǎn)Pd 相鄰像素點(diǎn)(一般認(rèn)為是8連通)
C(P,Dp)--當(dāng)前像素點(diǎn)的disparity為Dp時(shí),該像素點(diǎn)的cost
P1、P2—懲罰系數(shù),分別適用于當(dāng)像素P相鄰像素中的disparity值與P的disparity差值為1和大于1時(shí)
I[]—當(dāng)[]內(nèi)的參數(shù)為真時(shí)返回1,否則返回0
SGBM算法的基本流程如下:
①預(yù)處理:使用sobel算子對源圖像進(jìn)行處理,并將經(jīng)sobel算子處理后的圖像映射為新圖像,并得到圖像的梯度信息用于后續(xù)的計(jì)算代價(jià)。
②代價(jià)計(jì)算:使用采樣方法對經(jīng)預(yù)處理得到的圖像梯度信息計(jì)算梯度代價(jià)、使用采樣方法對源圖像計(jì)算SAD代價(jià)。
③動態(tài)規(guī)劃:默認(rèn)四條路經(jīng),并對路徑規(guī)劃的參數(shù)P1,P2進(jìn)行設(shè)置(包括P1、P2、cn(圖像通道數(shù)量)以及SADWindowsize(SAD窗口大?。┑脑O(shè)置)。
④后處理:包括唯一性檢測、亞像素插值、左右一致性檢測、連通區(qū)域的檢測。
2.3.1 SGBM(semi-global block matching)的基于opencv的C++代碼實(shí)現(xiàn)
首先先定義一個(gè)SGBM算法的頭文件(SGBM_Algorithm.h):
具體參數(shù)見代碼及其注釋(若讀者需優(yōu)化可自行調(diào)整),不再贅述
enum { STEREO_BM = 0, STEREO_SGBM = 1, STEREO_HH = 2, STEREO_VAR = 3, STEREO_3WAY = 4 }; #include"iostream" #include"opencv2/opencv.hpp" using namespace std; using namespace cv; void calDispWithSGBM(Mat Img_L, Mat Img_R, Mat &imgDisparity8U) { Size imgSize = Img_L.size(); int numberOfDisparities = ((imgSize.width / 8) + 15) & -16; Ptrsgbm = StereoSGBM::create(0, 16, 3); int cn = Img_L.channels(); //左圖像的通道數(shù) int SADWindowSize = 9; int sgbmWinSize = SADWindowSize > 0 ? SADWindowSize : 3; sgbm->setMinDisparity(0); //minDisparity最小視差默認(rèn)為0; sgbm->setNumDisparities(numberOfDisparities); //numDisparity視差搜索范圍,其值必須為16的整數(shù)倍; sgbm->setP1(8 * cn*sgbmWinSize*sgbmWinSize); sgbm->setP2(32 * cn*sgbmWinSize*sgbmWinSize); //一般建議懲罰系數(shù)P1、P2取此兩值,P1、P2控制視差圖的光滑度 //P2越大,視差圖越平滑 sgbm->setDisp12MaxDiff(1); //左右一致性檢測最大容許誤差閾值 sgbm->setPreFilterCap(31); //預(yù)處理濾波器的截?cái)嘀?,預(yù)處理的輸出值僅保留 //[-preFilterCap, preFilterCap]范圍內(nèi)的值,參數(shù)范圍:1 - 31 sgbm->setUniquenessRatio(10); //視差唯一性百分比:視差窗口范圍內(nèi)最低代價(jià)是次低代價(jià)的(1 + uniquenessRatio/100)倍時(shí) //最低代價(jià)對應(yīng)的視差值才是該像素點(diǎn)的視差,否則該像素點(diǎn)的視差為 0 ,不能為負(fù)值,一般去5——15 sgbm->setSpeckleWindowSize(100); //視差連通區(qū)域像素點(diǎn)個(gè)數(shù)的大小:對于每一個(gè)視差點(diǎn),當(dāng)其連通區(qū)域的像素點(diǎn)個(gè)數(shù)小于 //speckleWindowSize時(shí),認(rèn)為該視差值無效,是噪點(diǎn)。 sgbm->setSpeckleRange(32); //視差連通條件:在計(jì)算一個(gè)視差點(diǎn)的連通區(qū)域時(shí),當(dāng)下一個(gè)像素點(diǎn)視差變化絕對值大于 //speckleRange就認(rèn)為下一個(gè)視差像素點(diǎn)和當(dāng)前視差像素點(diǎn)是不連通的。 sgbm->setMode(0); //模式選擇 sgbm->setBlockSize(sgbmWinSize); //設(shè)置SAD代價(jià)計(jì)算窗口,一般在3*3到21*21之間 //blockSize(SADWindowSize) 越小,也就是匹配代價(jià)計(jì)算的窗口越小,視差圖噪聲越大; //blockSize越大,視差圖越平滑; //太大的size容易導(dǎo)致過平滑,并且誤匹配增多,體現(xiàn)在視差圖中空洞增多 //三種模式選擇(HH、SGBM、3WAY) int algorithm = STEREO_SGBM; if (algorithm == STEREO_HH) sgbm->setMode(StereoSGBM::MODE_HH); else if (algorithm == STEREO_SGBM) sgbm->setMode(StereoSGBM::MODE_SGBM); else if (algorithm == STEREO_3WAY) sgbm->setMode(StereoSGBM::MODE_SGBM_3WAY); Mat imgDisparity16S = Mat(Img_L.rows, Img_L.cols, CV_16S); sgbm->compute(Img_L, Img_R, imgDisparity16S); //--Display it as a CV_8UC1 image:16位有符號轉(zhuǎn)為8位無符號 imgDisparity16S.convertTo(imgDisparity8U, CV_8U, 255 / (numberOfDisparities*16.)); } 調(diào)用示例: #include"SGBM_Algorithm.h" int main() { Mat Img_L = imread("Teddy_L.png", 0); Mat Img_R = imread("Teddy_R.png", 0); Mat Disparity8U = Mat(Img_L.rows, Img_R.cols, CV_8UC1);//創(chuàng)建一個(gè)Disparity圖像 calDispWithSGBM(Img_L, Img_R, Disparity8U); imshow("Teddy_L", Img_L); imshow("Teddy_R", Img_R); imshow("Disparity", Disparity8U); waitKey(); system("pause"); //按任意鍵退出 return 0; }
2.3.2 SGBM算法的運(yùn)行效果
還順便調(diào)整了SADWindowsize的大小來給讀者探討并展示當(dāng)設(shè)置不同SADWindowsize大小時(shí)對Disparity效果圖的影響,其結(jié)果如下(皆為MODE_SGBM模式下):
由上述在不同SADWindowsize大小設(shè)置(其他參數(shù)保持不變)的效果圖對比下我們可得知如下結(jié)論:
SADWindowsize過小時(shí),視差圖的噪聲較多;隨著SADWindowsize的增大,視圖越平滑,但當(dāng)SADWindowsize過大時(shí),視差圖中的空洞現(xiàn)象會增加;故在選擇SADWindowsize的大小時(shí),應(yīng)選取合適的大小(建議選擇SADWindowsize=9)。
03 雙目立體視覺的發(fā)展現(xiàn)狀
目前在國外,雙目立體視覺技術(shù)已廣泛運(yùn)用于生產(chǎn)生活實(shí)際中,但在我國,雙目立體視覺技術(shù)仍處在起步階段,仍需要在座的各位發(fā)奮圖強(qiáng)、力爭創(chuàng)新。
3.1 雙目立體視覺的發(fā)展方向
就雙目立體視覺的發(fā)展現(xiàn)況和發(fā)展目標(biāo)(達(dá)到類似于人眼的通用雙目立體視覺)仍是路漫漫其修遠(yuǎn)兮,我認(rèn)為進(jìn)一步的發(fā)展方向可以歸納如下:
①探索新的更具有通用性的計(jì)算理論和匹配算法結(jié)構(gòu),以解決目前存在的灰度失真、噪聲干擾以及幾何畸變的問題。
②提高算法的性能,對算法進(jìn)行優(yōu)化,盡可能向?qū)崟r(shí)效果推進(jìn)。
③建立更有效的雙目體視模型能更充分地反映立體視覺不確定性的本質(zhì)屬性,為匹配提供更多的約束信息,降低立體匹配的難度。
④強(qiáng)調(diào)場景與任務(wù)的約束,建立適用于不同場景和任務(wù)的雙目立體視覺系統(tǒng)的標(biāo)準(zhǔn)和方法。
3.2 雙目立體視覺的國內(nèi)外發(fā)展動態(tài)
雙目體視目前主要應(yīng)用于四個(gè)領(lǐng)域:機(jī)器人導(dǎo)航、微操作系統(tǒng)的參數(shù)檢測、三維測量和虛擬現(xiàn)實(shí)。
目前在國外,日本大阪大學(xué)自適應(yīng)機(jī)械系統(tǒng)研究院研制了一種自適應(yīng)雙目視覺伺服系統(tǒng),利用雙目體視的原理,如每幅圖像中相對靜止的三個(gè)標(biāo)志為參考,實(shí)時(shí)計(jì)算目標(biāo)圖像的雅可比短陣,從而預(yù)測出目標(biāo)下一步運(yùn)動方向,實(shí)現(xiàn)了對動方式未知的目標(biāo)的自適應(yīng)跟蹤。該系統(tǒng)僅要求兩幅圖像中都有靜止的參考標(biāo)志,無需攝像機(jī)參數(shù)。
日本奈良科技大學(xué)信息科學(xué)學(xué)院提出了一種基于雙目立體視覺的增強(qiáng)現(xiàn)實(shí)系統(tǒng)(ar)注冊方法,通過動態(tài)修正特征點(diǎn)的位置提高注冊精度。
日本東京大學(xué)將實(shí)時(shí)雙目立體視覺和機(jī)器人整體姿態(tài)信息集成,開發(fā)了仿真機(jī)器人動態(tài)行長導(dǎo)航系統(tǒng),為機(jī)器人根據(jù)實(shí)時(shí)情況建立實(shí)時(shí)地圖從而實(shí)現(xiàn)障礙物檢測。
日本岡山大學(xué)使用立體顯微鏡、兩個(gè)ccd攝像頭、微操作器等研制了使用立體顯微鏡控制微操作器的視覺反饋系統(tǒng),用于對細(xì)胞進(jìn)行操作,對鐘子進(jìn)行基因注射和微裝配等。
麻省理工學(xué)院計(jì)算機(jī)系統(tǒng)提出了一種新的用于智能交通工具的傳感器融合方式,由雷達(dá)系統(tǒng)提供目標(biāo)深度的大致范圍,利用雙目立體視覺提供粗略的目標(biāo)深度信息,結(jié)合改進(jìn)的圖像分割算法,從而實(shí)現(xiàn)在高速環(huán)境下對視頻圖像中的目標(biāo)位置進(jìn)行分割。
華盛頓大學(xué)與微軟公司合作為火星衛(wèi)星“探測者”號研制了寬基線立體視覺系統(tǒng),使“探測者”號能夠在火星上對其即將跨越的幾千米內(nèi)的地形進(jìn)行精確的定位及導(dǎo)航。
在國內(nèi),浙江大學(xué)機(jī)械系統(tǒng)完全利用透視成像原理,采用雙目體視方法實(shí)現(xiàn)了對多自由度機(jī)械裝置的動態(tài)、精確位姿檢測,僅需從兩幅對應(yīng)圖像中抽取必要的特征點(diǎn)的三維坐標(biāo),信息量少,處理速度快,尤其適于動態(tài)情況。
INDEMIND公司基于雙目立體視覺,開發(fā)了一種針對商用和家用服務(wù)機(jī)器人的視覺導(dǎo)航技術(shù),在算法和硬件上,提出了一套自研的VSLAM算法和集合多種視覺傳感器的一體化模組,可以實(shí)現(xiàn)機(jī)器人視覺定位、語義識別、語義建圖、避障、交互等多種功能。
東南大學(xué)電子工程系基于雙目立體視覺,提出了一種灰度相關(guān)多峰值視差絕對值極小化立體匹配新方法,可對三維不規(guī)則物體(偏轉(zhuǎn)線圈)的三維空間坐標(biāo)進(jìn)行非接觸精密測量。
哈工大采用異構(gòu)雙目活動視覺系統(tǒng)實(shí)現(xiàn)了全自主足球機(jī)器人導(dǎo)航。將一個(gè)固定攝像機(jī)和一個(gè)可以水平旋轉(zhuǎn)的攝像機(jī),分別安裝在機(jī)器人的頂部和中下部,可以同時(shí)監(jiān)視不同方位視點(diǎn),體現(xiàn)出比人類視覺優(yōu)越的一面。即使在實(shí)際比賽中當(dāng)其他傳感器失效的情況下,僅僅依靠雙目協(xié)調(diào)仍然可以實(shí)現(xiàn)全自主足球機(jī)器人導(dǎo)航。
審核編輯:劉清
-
機(jī)器視覺
+關(guān)注
關(guān)注
161文章
4321瀏覽量
119997 -
SSD
+關(guān)注
關(guān)注
20文章
2837瀏覽量
117129 -
C++語言
+關(guān)注
關(guān)注
0文章
147瀏覽量
6951 -
OpenCV
+關(guān)注
關(guān)注
29文章
625瀏覽量
41215 -
預(yù)處理器
+關(guān)注
關(guān)注
0文章
13瀏覽量
2216
原文標(biāo)題:前沿丨關(guān)于雙目立體視覺的三大基本算法及發(fā)展現(xiàn)狀
文章出處:【微信號:gh_c87a2bc99401,微信公眾號:INDEMIND】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論