雙目立體視覺(jué)一直是機(jī)器視覺(jué)研究領(lǐng)域的發(fā)展熱點(diǎn)和難點(diǎn),“熱”是因?yàn)殡p目立體視覺(jué)有著及其廣闊的應(yīng)用前景,且隨著光學(xué)、計(jì)算機(jī)科學(xué)等學(xué)科的不斷發(fā)展,雙目立體技術(shù)將不斷進(jìn)步直到應(yīng)用到人類生活的方方面面?!?strong>難”則是因?yàn)槭艿綌z像機(jī)、鏡頭等硬件設(shè)備及一些相關(guān)算法的限制,雙目立體視覺(jué)的研究及如何更好的應(yīng)用到生產(chǎn)實(shí)際中仍有待在座的各位去進(jìn)行突破。
一.簡(jiǎn)介
雙目立體視覺(jué)是機(jī)器視覺(jué)中的一個(gè)重要分支,自上世紀(jì)60年代中期開(kāi)創(chuàng)以來(lái),經(jīng)過(guò)幾十年的發(fā)展,如今在機(jī)器人視覺(jué)、航空測(cè)繪、軍事應(yīng)及醫(yī)學(xué)成像、工業(yè)檢測(cè)上應(yīng)用極其廣泛。雙目立體視覺(jué)基于視差原理并利用成像設(shè)備從不同的位置獲取被測(cè)物體的左右兩幅圖像,然后根據(jù)三角測(cè)量原理計(jì)算空間點(diǎn)在二維圖像的位置偏差,最后再利用位置偏差進(jìn)行三維重建來(lái)獲取被測(cè)物體的三維幾何信息(本文不對(duì)雙目立體視覺(jué)的數(shù)學(xué)原理進(jìn)行詳細(xì)介紹)。
二.雙目立體視覺(jué)的三大基本算法的原理及其代碼實(shí)現(xiàn)(基于opencv)
雙目立體視覺(jué)中常用的基于區(qū)域的局部匹配準(zhǔn)則主要有圖像序列中對(duì)應(yīng)像素差的絕對(duì)值之和SAD(sum of absolute differences)、對(duì)應(yīng)像素差的平方之和SSD(sum of squared differences)及半全局匹配算法SGM(semi—global matching)。
2.1 SAD(sum of absolute differences)的原理
匹配算法SAD的基本思想是對(duì)經(jīng)行對(duì)準(zhǔn)后的左右視圖圖像的對(duì)應(yīng)像素塊的對(duì)應(yīng)像素差的絕對(duì)值進(jìn)行求和。
其數(shù)學(xué)公式如下:
SAD匹配算法的基本流程如下: ①輸入兩幅已經(jīng)校正實(shí)現(xiàn)行對(duì)準(zhǔn)的左視圖(Left-Image)及右視圖(Right-Image)。 ②對(duì)左視圖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)的差的絕對(duì)值之和。 ⑥移動(dòng)Right-Image的小窗口并重復(fù)④—⑤的操作(注意此處會(huì)設(shè)置一個(gè)搜索范圍,超過(guò)此范圍則跳出) ⑦找到這個(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//左圖從DSR開(kāi)始遍歷 { for (int j = 0; j { Kernel_L = L(Rect(i, j, winSize, winSize)); Mat MM(1, DSR, CV_32F, Scalar(0)); for (int k = 0; k { int x = i - k; if (x >= 0) { Kernel_R = R(Rect(x, j, winSize, winSize)); Mat Dif; absdiff(Kernel_L, Kernel_R, Dif);//求差的絕對(duì)值之和 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匹配算法的過(guò)程及代碼實(shí)現(xiàn)相類似,考慮到篇幅長(zhǎng)度的原因,故SSD算法的基本過(guò)程及代碼實(shí)現(xiàn)在本文中不在贅述,讀者可去自行實(shí)現(xiàn)。
2.3 SGBM(semi-global block matching)的原理
SGM(semi-global matching)是一種用于計(jì)算雙目立體視覺(jué)中的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算子對(duì)源圖像進(jìn)行處理,并將經(jīng)sobel算子處理后的圖像映射為新圖像,并得到圖像的梯度信息用于后續(xù)的計(jì)算代價(jià)。 ②代價(jià)計(jì)算:使用采樣方法對(duì)經(jīng)預(yù)處理得到的圖像梯度信息計(jì)算梯度代價(jià)、使用采樣方法對(duì)源圖像計(jì)算SAD代價(jià)。 ③動(dòng)態(tài)規(guī)劃:默認(rèn)四條路經(jīng),并對(duì)路徑規(guī)劃的參數(shù)P1,P2進(jìn)行設(shè)置(包括P1、P2、cn(圖像通道數(shù)量)以及SADWindowsize(SAD窗口大?。┑脑O(shè)置)。 ④后處理:包括唯一性檢測(cè)、亞像素插值、左右一致性檢測(cè)、連通區(qū)域的檢測(cè)。
2.3.1 SGBM(semi-global block matching)的基于opencv的C++代碼實(shí)現(xiàn)
首先先定義一個(gè)SGBM算法的頭文件(SGBM_Algorithm.h): 具體參數(shù)見(jiàn)代碼及其注釋(若讀者需優(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); //左右一致性檢測(cè)最大容許誤差閾值
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à)對(duì)應(yīng)的視差值才是該像素點(diǎn)的視差,否則該像素點(diǎn)的視差為 0 ,不能為負(fù)值,一般去5——15
sgbm->setSpeckleWindowSize(100); //視差連通區(qū)域像素點(diǎn)個(gè)數(shù)的大?。簩?duì)于每一個(gè)視差點(diǎn),當(dāng)其連通區(qū)域的像素點(diǎn)個(gè)數(shù)小于 //speckleWindowSize時(shí),認(rèn)為該視差值無(wú)效,是噪點(diǎn)。
sgbm->setSpeckleRange(32); //視差連通條件:在計(jì)算一個(gè)視差點(diǎn)的連通區(qū)域時(shí),當(dāng)下一個(gè)像素點(diǎn)視差變化絕對(duì)值大于 //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)致過(guò)平滑,并且誤匹配增多,體現(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位有符號(hào)轉(zhuǎn)為8位無(wú)符號(hào) 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的大小來(lái)給讀者探討并展示當(dāng)設(shè)置不同SADWindowsize大小時(shí)對(duì)Disparity效果圖的影響,其結(jié)果如下(皆為MODE_SGBM模式下):
?
?
由上述在不同SADWindowsize大小設(shè)置(其他參數(shù)保持不變)的效果圖對(duì)比下我們可得知如下結(jié)論: SADWindowsize過(guò)小時(shí),視差圖的噪聲較多;隨著SADWindowsize的增大,視圖越平滑,但當(dāng)SADWindowsize過(guò)大時(shí),視差圖中的空洞現(xiàn)象會(huì)增加;故在選擇SADWindowsize的大小時(shí),應(yīng)選取合適的大?。ńㄗh選擇SADWindowsize=9)。
三.雙目立體視覺(jué)的發(fā)展現(xiàn)狀
目前在國(guó)外,雙目立體視覺(jué)技術(shù)已廣泛運(yùn)用于生產(chǎn)生活實(shí)際中,但在我國(guó),雙目立體視覺(jué)技術(shù)仍處在起步階段,仍需要在座的各位發(fā)奮圖強(qiáng)、力爭(zhēng)創(chuàng)新。
3.1 雙目立體視覺(jué)的發(fā)展方向
就雙目立體視覺(jué)的發(fā)展現(xiàn)況和發(fā)展目標(biāo)(達(dá)到類似于人眼的通用雙目立體視覺(jué))仍是路漫漫其修遠(yuǎn)兮,我認(rèn)為進(jìn)一步的發(fā)展方向可以歸納如下: ①探索新的更具有通用性的計(jì)算理論和匹配算法結(jié)構(gòu),以解決目前存在的灰度失真、噪聲干擾以及幾何畸變的問(wèn)題。 ②提高算法的性能,對(duì)算法進(jìn)行優(yōu)化,盡可能向?qū)崟r(shí)效果推進(jìn)。 ③建立更有效的雙目體視模型能更充分地反映立體視覺(jué)不確定性的本質(zhì)屬性,為匹配提供更多的約束信息,降低立體匹配的難度。 ④強(qiáng)調(diào)場(chǎng)景與任務(wù)的約束,建立適用于不同場(chǎng)景和任務(wù)的雙目立體視覺(jué)系統(tǒng)的標(biāo)準(zhǔn)和方法。
3.2 雙目立體視覺(jué)的國(guó)內(nèi)外發(fā)展動(dòng)態(tài)
雙目體視目前主要應(yīng)用于四個(gè)領(lǐng)域:機(jī)器人導(dǎo)航、微操作系統(tǒng)的參數(shù)檢測(cè)、三維測(cè)量和虛擬現(xiàn)實(shí)。 目前在國(guó)外,日本大阪大學(xué)自適應(yīng)機(jī)械系統(tǒng)研究院研制了一種自適應(yīng)雙目視覺(jué)伺服系統(tǒng),利用雙目體視的原理,如每幅圖像中相對(duì)靜止的三個(gè)標(biāo)志為參考,實(shí)時(shí)計(jì)算目標(biāo)圖像的雅可比短陣,從而預(yù)測(cè)出目標(biāo)下一步運(yùn)動(dòng)方向,實(shí)現(xiàn)了對(duì)動(dòng)方式未知的目標(biāo)的自適應(yīng)跟蹤。該系統(tǒng)僅要求兩幅圖像中都有靜止的參考標(biāo)志,無(wú)需攝像機(jī)參數(shù)。
日本奈良科技大學(xué)信息科學(xué)學(xué)院提出了一種基于雙目立體視覺(jué)的增強(qiáng)現(xiàn)實(shí)系統(tǒng)(ar)注冊(cè)方法,通過(guò)動(dòng)態(tài)修正特征點(diǎn)的位置提高注冊(cè)精度。 日本東京大學(xué)將實(shí)時(shí)雙目立體視覺(jué)和機(jī)器人整體姿態(tài)信息集成,開(kāi)發(fā)了仿真機(jī)器人動(dòng)態(tài)行長(zhǎng)導(dǎo)航系統(tǒng),為機(jī)器人根據(jù)實(shí)時(shí)情況建立實(shí)時(shí)地圖從而實(shí)現(xiàn)障礙物檢測(cè)。
日本岡山大學(xué)使用立體顯微鏡、兩個(gè)ccd攝像頭、微操作器等研制了使用立體顯微鏡控制微操作器的視覺(jué)反饋系統(tǒng),用于對(duì)細(xì)胞進(jìn)行操作,對(duì)鐘子進(jìn)行基因注射和微裝配等。 麻省理工學(xué)院計(jì)算機(jī)系統(tǒng)提出了一種新的用于智能交通工具的傳感器融合方式,由雷達(dá)系統(tǒng)提供目標(biāo)深度的大致范圍,利用雙目立體視覺(jué)提供粗略的目標(biāo)深度信息,結(jié)合改進(jìn)的圖像分割算法,從而實(shí)現(xiàn)在高速環(huán)境下對(duì)視頻圖像中的目標(biāo)位置進(jìn)行分割。
華盛頓大學(xué)與微軟公司合作為火星衛(wèi)星“探測(cè)者”號(hào)研制了寬基線立體視覺(jué)系統(tǒng),使“探測(cè)者”號(hào)能夠在火星上對(duì)其即將跨越的幾千米內(nèi)的地形進(jìn)行精確的定位及導(dǎo)航。 在國(guó)內(nèi),浙江大學(xué)機(jī)械系統(tǒng)完全利用透視成像原理,采用雙目體視方法實(shí)現(xiàn)了對(duì)多自由度機(jī)械裝置的動(dòng)態(tài)、精確位姿檢測(cè),僅需從兩幅對(duì)應(yīng)圖像中抽取必要的特征點(diǎn)的三維坐標(biāo),信息量少,處理速度快,尤其適于動(dòng)態(tài)情況。
維視圖像公司采用雙目ccd相機(jī),從工業(yè)相機(jī)內(nèi)參標(biāo)定、鏡頭畸變標(biāo)定、立體匹配、特征點(diǎn)分割處理等方面給出了詳細(xì)的數(shù)學(xué)模型和算法接口。其雙目標(biāo)定軟件ccas采用了張正友平面標(biāo)定法,可以實(shí)現(xiàn)機(jī)器人導(dǎo)航、微操作系統(tǒng)的參數(shù)檢測(cè)、三維測(cè)量和虛擬現(xiàn)實(shí)等應(yīng)用。 東南大學(xué)電子工程系基于雙目立體視覺(jué),提出了一種灰度相關(guān)多峰值視差絕對(duì)值極小化立體匹配新方法,可對(duì)三維不規(guī)則物體(偏轉(zhuǎn)線圈)的三維空間坐標(biāo)進(jìn)行非接觸精密測(cè)量。
哈工大采用異構(gòu)雙目活動(dòng)視覺(jué)系統(tǒng)實(shí)現(xiàn)了全自主足球機(jī)器人導(dǎo)航。將一個(gè)固定攝像機(jī)和一個(gè)可以水平旋轉(zhuǎn)的攝像機(jī),分別安裝在機(jī)器人的頂部和中下部,可以同時(shí)監(jiān)視不同方位視點(diǎn),體現(xiàn)出比人類視覺(jué)優(yōu)越的一面。即使在實(shí)際比賽中當(dāng)其他傳感器失效的情況下,僅僅依靠雙目協(xié)調(diào)仍然可以實(shí)現(xiàn)全自主足球機(jī)器人導(dǎo)航。 火星863計(jì)劃課題“人體三維尺寸的非接觸測(cè)量”,采用“雙視點(diǎn)投影光柵三維測(cè)量”原理,由雙攝像機(jī)獲取圖像對(duì),通過(guò)計(jì)算機(jī)進(jìn)行圖像數(shù)據(jù)處理,不僅可以獲取服裝設(shè)計(jì)所需的特征尺寸,還可根據(jù)需要獲取人體圖像上任意一點(diǎn)的三維坐標(biāo)。
四.筆者總結(jié)
本文從雙目立體視覺(jué)的三個(gè)最基本的匹配算法出發(fā),講述了其基本原理、步驟及其opencv代碼實(shí)現(xiàn)并對(duì)雙目立體視覺(jué)的發(fā)展趨勢(shì)及現(xiàn)狀做了總結(jié),可供讀者參考借鑒,若有紕漏,請(qǐng)見(jiàn)諒!
編輯:黃飛
?
評(píng)論