袁 寧,范有情,何 濤
(1湖北工業(yè)大學(xué)現(xiàn)代制造質(zhì)量工程重點(diǎn)實(shí)驗(yàn)室,湖北 武漢430068;2湖北工業(yè)大學(xué)機(jī)械工程學(xué)院,湖北 武漢430068)
隨著計(jì)算機(jī)視覺技術(shù)的發(fā)展,對三維重建的開發(fā)效率、軟件產(chǎn)品質(zhì)量以及重建速度的要求越來越突出[1].在數(shù)值化計(jì)算程度高的雙目視覺三維重建的應(yīng)用程序開發(fā)中,利用Matlab實(shí)現(xiàn)矩陣計(jì)算和數(shù)值計(jì)算較多的相機(jī)標(biāo)定部分以及三維繪圖部分,利用VC++實(shí)現(xiàn)程序界面、圖像采集以及立體匹配等部分.而Matlab語言和C語言相比較,它具有語言簡單、內(nèi)涵豐富、易學(xué)易用等優(yōu)點(diǎn),尤其是它提供了豐富的繪圖函數(shù)和命令,可方便地繪制一維、二維和三維圖形,如線性圖、極坐標(biāo)圖、直方圖、等高線圖、落差圖等[2].針對傳統(tǒng)的利用單一環(huán)境實(shí)現(xiàn)三維重建的軟件開發(fā)效率和重建速度受局限等問題,本文提出了一種基于VC++與Matlab混合編程的雙目視覺三維重建方法.
Matlab可以通過引擎的方式與其他編程環(huán)境下的程序?qū)崿F(xiàn)通信,將Matlab作為一個(gè)計(jì)算引擎使用,讓其在后臺(tái)運(yùn)行,完成復(fù)雜的矩陣計(jì)算,簡化前臺(tái)用戶程序設(shè)計(jì)的任務(wù).與其他各種接口相比,引擎所提供的Matlab功能支持是最全面的.通過引擎方式,應(yīng)用程序會(huì)打開一個(gè)新的Matlab進(jìn)程,可以控制它完成任何Matlab所支持的計(jì)算和繪圖等操作.在數(shù)據(jù)交流方面,可以對幾乎所有的基本數(shù)據(jù)類型提供支持.同時(shí)以引擎方式打開的Matlab進(jìn)程以非常友好的界面方式支持Matlab的各種操作[2].
在編程環(huán)境中使用Matlab引擎擴(kuò)展編程的基本操作步驟為:1)對開發(fā)環(huán)境進(jìn)行必要的設(shè)置;2)創(chuàng)建Matlab引擎對象;3)向引擎空間寫入數(shù)據(jù);4)調(diào)用Matlab命令處理數(shù)據(jù);5)從引擎空間讀取數(shù)據(jù);6)釋放Matlab引擎對象.如果在VC集成環(huán)境下利用Matlab引擎實(shí)現(xiàn)VC和Matlab的混合編程,一般需要對VC++與Matlab混合編程的編譯環(huán)境進(jìn)行設(shè)置,在完成了若干基本步驟后即可利用Matlab引擎庫函數(shù)engEvalString來調(diào)用Matlab的內(nèi)建函數(shù)[3].
雙目視覺的三維重建系統(tǒng)包括兩個(gè)computar的16mm鏡頭和2個(gè)西安方誠科技的VDC-FD 130M型CCD相機(jī)(圖1).
圖1 雙目視覺示意圖
該三維重建系統(tǒng)的軟件部分是以VC++為基本框架,調(diào)用 Matlab engine來實(shí)現(xiàn)三維重建的工作.開發(fā)環(huán)境:Win2000、VC++6.0和 Matlab7.0.該系統(tǒng)采用的具體流程如圖2所示.
圖2 三維重建基本流程
為了從圖像中獲取世界坐標(biāo)系中三維物點(diǎn)與像點(diǎn)的對應(yīng)關(guān)系(圖3),計(jì)算物體的形狀位置等信息,必須建立相機(jī)成像的集合模型并獲得其參數(shù).在大多數(shù)條件下,這些參數(shù)必須通過計(jì)算與實(shí)驗(yàn)才能得到,這種求解參數(shù)的過程稱為相機(jī)標(biāo)定[5].
圖3 相機(jī)標(biāo)定模型
設(shè)(Xw,Yw,Zw)是三維世界坐標(biāo)系中某目標(biāo)點(diǎn)p的三維坐標(biāo),(x,y,z)是該點(diǎn)在相機(jī)坐標(biāo)系(定義如下圖所示)中的坐標(biāo).相機(jī)坐標(biāo)系定義為:中心在O點(diǎn)(光學(xué)中心),Z軸與光軸重合,(X,Y)是中心在Oi點(diǎn)(光軸z與圖像平面的交點(diǎn))且平行于x,y軸的圖像坐標(biāo)系,有效焦距f是圖像平面和光心的距離.(xu,yu)是在理想Pin-h(huán)ole模型下P點(diǎn)的圖像坐標(biāo),(xd,yd)是由透鏡畸變引起的(dxu,dyu)偏離的實(shí)際圖像坐標(biāo)[11].
相機(jī)標(biāo)定部分涉及到了大量的矩陣運(yùn)算,而Matlab具有強(qiáng)大的數(shù)學(xué)運(yùn)算功能,并且有專業(yè)的相機(jī)標(biāo)定工具箱.
利用Matlab相機(jī)標(biāo)定工具箱對一個(gè)基于15張平面西洋跳棋盤圖片的全面標(biāo)定.具體步驟:1)裝入標(biāo)定圖片;2)提取圖像角點(diǎn);3)運(yùn)行主標(biāo)定程序;4)顯示結(jié)果;5)控制精度;6)添加或減少圖片;7)糾正圖片畸變;8)以不同格式輸出標(biāo)定數(shù)據(jù).標(biāo)定板圖集如圖4所示.
標(biāo)定的結(jié)果被保存在Matlab的二進(jìn)制文件(mat文件)里以便于數(shù)據(jù)傳遞.圖5所示為左右兩個(gè)相機(jī)與標(biāo)定板之間的位置關(guān)系.圖6所示為相機(jī)標(biāo)定工具箱獲得標(biāo)定結(jié)果的誤差分析.從圖中可以看出每個(gè)標(biāo)定板圖像的誤差范圍,便于添加或減少圖片,通過進(jìn)一步標(biāo)定獲得誤差更小的標(biāo)定結(jié)果.
通過Matlab相機(jī)標(biāo)定工具箱可以簡便快速地完成相機(jī)的標(biāo)定以及標(biāo)定結(jié)果數(shù)據(jù)的存儲(chǔ)與傳遞,避免了利用VC++標(biāo)定的復(fù)雜過程,有效提高了相機(jī)標(biāo)定的效率.
通過CCD工業(yè)相機(jī)獲取圖像后,考慮到光照、噪聲以及相機(jī)性能等條件的影響,需要對獲取的圖像做進(jìn)一步處理,以提高圖像清晰度,改善視覺效果,將圖像轉(zhuǎn)換成更適合人或計(jì)算機(jī)分析處理的形式[4].該過程包括兩個(gè)部分:1)圖像的濾波、增強(qiáng)及平滑;2)目標(biāo)物體與背景的分離.在VC++環(huán)境中有圖像預(yù)處理算法集,能夠完全滿足三維重建中原始圖像的預(yù)處理要求.因此,圖像預(yù)處理部分在VC++環(huán)境中實(shí)現(xiàn).
特征點(diǎn)提取是通過 Harris[6]算法實(shí)現(xiàn).Harris特征提取算法的思想是:在圖像中設(shè)計(jì)一個(gè)局部檢測窗口,當(dāng)該窗口沿任一方向做微小移動(dòng)時(shí),檢測窗口平均能量的變化.當(dāng)能量變化值超過了設(shè)定閾值時(shí),則將窗口中心像素點(diǎn)設(shè)為角點(diǎn).圖像亮度
Harris算法的角點(diǎn)響應(yīng)函數(shù)
式中,det(M)=λ1λ2=AB-C2;trace(M)=λ1+λ2=A+B;k為經(jīng)驗(yàn)值,取0.04.角點(diǎn)對應(yīng)于函數(shù)R的局部極大值點(diǎn).當(dāng)圖像上某點(diǎn)像素的R值大于給定的閾值T時(shí),就把該點(diǎn)作為特征點(diǎn).
立體匹配是三維重建的核心問題.立體匹配是指將在不同視點(diǎn)下拍攝到的同一空間場景的投影圖像中的映像點(diǎn)對應(yīng)起來,并生成相應(yīng)的視差圖的過程[7].對于實(shí)際的立體圖像對,求解其對應(yīng)問題極具挑戰(zhàn)性,可以說是立體視覺中最困難的一步.Barnard[8]回顧了立體重構(gòu)的基本原理,對主要的匹配方法做了綜述,并且給出了算法新能的評價(jià)標(biāo)準(zhǔn).Dhond[9]總結(jié)了大量的立體匹配算法,并介紹了分級處理思想,提出了使用三目約束減少立體匹配的不確定性.Koschan[10]對動(dòng)態(tài)立體和主動(dòng)立體、早期的遮擋和無紋理問題以及實(shí)時(shí)立體視覺實(shí)現(xiàn)進(jìn)行了探討與總結(jié).
本文設(shè)計(jì)了一種基于置信度傳播的立體匹配算法模型,在Harris角點(diǎn)提取算法的基礎(chǔ)上實(shí)現(xiàn)立體匹配.圖7為本文立體匹配流程圖.
在VC++的編譯環(huán)境中編寫程序的主界面(圖8).在程序主界面中,點(diǎn)擊按鍵可以有效調(diào)用Matlab內(nèi)置函數(shù).基于雙目視覺的三維重建中包含相機(jī)標(biāo)定、立體匹配、三維重構(gòu)等三部分.
三維重構(gòu)部分在matlab環(huán)境中實(shí)現(xiàn),因其有著強(qiáng)大的繪圖功能,在前期工作的數(shù)據(jù)結(jié)果基礎(chǔ)上,可以快速獲得需要的三維圖.圖8中的“顯示三維圖”按鍵調(diào)用Matlab engine來繪制三維圖.圖9a為左相機(jī)拍攝軸承圖片,圖9b為右相機(jī)拍攝軸承圖片,圖9c為三維重建以后獲得的軸承三維圖.
本文的三維重建是VC++和Matlab混合編程的一個(gè)應(yīng)用,即以VC++環(huán)境為程序主框架,并且利用其完成每個(gè)界面,同時(shí)利用Matlab強(qiáng)大的數(shù)學(xué)計(jì)算和繪圖功能,完成整個(gè)工作.在實(shí)際的數(shù)值計(jì)算、控制系統(tǒng)開發(fā)等工程應(yīng)用中,可以很好地利用二者混合編程技術(shù),從而簡化應(yīng)用程序的開發(fā).
三維重建技術(shù)是計(jì)算機(jī)視覺、人工智能、虛擬現(xiàn)實(shí)、醫(yī)學(xué)圖像等前沿領(lǐng)域的熱點(diǎn)和難點(diǎn),也是在基礎(chǔ)研究和應(yīng)用研究中面臨的重大挑戰(zhàn)之一.本文通過對VC++和Matlab的集成開發(fā),以精練的代碼和較高的運(yùn)行效率實(shí)現(xiàn)對二維圖像的三維重建.該系統(tǒng)不僅穩(wěn)定,而且操作簡單,提高了自動(dòng)化的程度.
[1]史利民,郭復(fù)勝,高 偉,等.基于語義交互的三維重建[J].計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào),2011(5):731-734.
[2]王素立,高 潔,孫新德.MATLAB混合編程與工程應(yīng)用[M].北京:清華大學(xué)出版社,2008.
[3]景征駿,許家民.VC++與 MATLAB混合編程及其應(yīng)用[J].計(jì)算機(jī)與信息技術(shù),2006(12):70-71.
[4]馮 宇.基于計(jì)算機(jī)立體視覺的三維重建系統(tǒng)研究[D].青島:青島科技大學(xué)圖書館,2009.
[5]趙 娟,曾 強(qiáng),魏林媛,等.基于立體視覺的三維模型重建系統(tǒng)設(shè)計(jì)[J].光電系統(tǒng),2011(2):12-14,30.
[6]Harris C,Stephens M.A Co mbined C0rner and Edge Detector[C]∥Fourth Alvey Vision Conference,1988:147-151.
[7]魏 沖.基于數(shù)碼相機(jī)圖像的三維重建技術(shù)研究[D].太原:中北大學(xué)圖書館,2009.
[8]Barnard S T,F(xiàn)ischler M A.Computational stereo[J].ACM Computing Surverys,1982.
[9]Dhond U R,Aggarwal J K.Structure from stereo-Areview[J].IEEE Trans on Systems,Man and Cybernetics,1989,19(6):1 489-1 510.
[10]Koschan A.What is new in computational stereo since 1989:A survey of current stereo papers[R].Berlin:Technical University of Berlin,1993.
[11]張 楠.雙目立體視覺的攝像機(jī)標(biāo)定方法研究[D].武漢:湖北工業(yè)大學(xué)圖書館,2008.