摘 要: 根據(jù)嵌入式系統(tǒng)的特點(diǎn),設(shè)計(jì)了以ARM為核心的雙目立體視覺測距系統(tǒng)。系統(tǒng)使用雙目立體攝像頭采集圖像數(shù)據(jù),可設(shè)置圖像的多種屬性。利用開源計(jì)算機(jī)視覺庫OpenCV對(duì)采集的圖像數(shù)據(jù)進(jìn)行處理,分別完成了兩臺(tái)攝像機(jī)標(biāo)定、匹配、重建等工作,最后實(shí)現(xiàn)攝像機(jī)測距功能。實(shí)驗(yàn)結(jié)果表明,該系統(tǒng)測量結(jié)果合理,工作穩(wěn)定,同時(shí)可用Qt/Embedded實(shí)時(shí)顯示圖像和數(shù)據(jù),具有良好的人機(jī)交互功能和跨平臺(tái)移植性。
關(guān)鍵詞: 嵌入式;計(jì)算機(jī)視覺庫;立體視覺;雙目測距
0 引言
雙目立體視覺測距是計(jì)算機(jī)視覺技術(shù)中的一個(gè)分支,也是計(jì)算機(jī)視覺研究的重點(diǎn)和熱點(diǎn)之一。它通過雙攝像機(jī)模擬人眼的功能,對(duì)三維世界進(jìn)行立體感知,恢復(fù)物體的三維幾何信息。隨著機(jī)器視覺理論的發(fā)展,雙目立體視覺在機(jī)器視覺研究中發(fā)揮了越來越來越重要的作用,具有廣泛的適用性[1]。
嵌入式ARM因處理速度快、使用方便、操作系統(tǒng)開源等特點(diǎn)而廣泛應(yīng)用。目前,雙目視覺系統(tǒng)多是基于PC平臺(tái)實(shí)現(xiàn)[2],而在嵌入式系統(tǒng)中,因其屏幕尺寸、處理速度等硬件資源受到限制,測距系統(tǒng)的實(shí)現(xiàn)具有新特點(diǎn)。本文以嵌入式處理器作為硬件核心,構(gòu)建基于嵌入式系統(tǒng)的雙目測距系統(tǒng),并具有圖像的實(shí)時(shí)顯示功能。
1 雙目測距原理
1.1 攝像機(jī)模型
攝像機(jī)的針孔模型如圖1所示,攝像機(jī)之外物體X通過穿過針孔平面的針孔,光束在圖像平面成像,形成圖像x。其中,f為攝像機(jī)焦距,Z為攝像機(jī)與物體間距離。
根據(jù)相似三角原理可得:
1.2 雙目測距模型
利用針孔模型,可以得到雙目測距模型[3]。如圖2所示,Ol、Or分別為兩攝像機(jī)的光心,焦距為f1、f2。光軸經(jīng)過兩個(gè)像平面的主點(diǎn)cl、cr。假設(shè)兩攝像機(jī)的像平面精確共面,圖像行對(duì)準(zhǔn),光軸嚴(yán)格平行,并且具有相同的焦距f(以上這些假設(shè)都是需要后面實(shí)現(xiàn)的)。物理世界中的P在左右平面上的成像點(diǎn)為pl、pr,對(duì)應(yīng)橫坐標(biāo)xl、xr。
視差定義為d=xl-xr。根據(jù)相似三角形原理,以左攝像機(jī)光心為原點(diǎn),可以得到左攝像機(jī)坐標(biāo)系下的深度Z:
2 實(shí)驗(yàn)平臺(tái)
本系統(tǒng)主要分為硬件和軟件兩類。硬件是以S3C2440A為核心的ARM嵌入式開發(fā)平臺(tái)。S3C2440A以ARM920T為核心,低功耗,簡單,適合于成本和功耗敏感的應(yīng)用。使用CMOS立體攝像頭視頻流數(shù)據(jù),圖片格式JPEG。LCD液晶顯示器負(fù)責(zé)圖像數(shù)據(jù)的顯示和人機(jī)交互。軟件部分由攝像頭及屏幕驅(qū)動(dòng)程序、OpenCV圖像處理算法、QT主程序設(shè)計(jì)等組成。
開放源代碼的計(jì)算機(jī)視覺類OpenCV是由一些C函數(shù)和C++類所組成的庫,用來實(shí)現(xiàn)圖像處理和常用的計(jì)算機(jī)圖像算法。具有開發(fā)效率高、執(zhí)行速度快等優(yōu)點(diǎn)。使用C函數(shù)和C++類可進(jìn)行跨平臺(tái)移植,因此可以很好地應(yīng)用于工程實(shí)際當(dāng)中。
QT是跨平臺(tái)C++圖形用戶界面工具。它特有的“信號(hào)-插槽”機(jī)制是QT編程的基礎(chǔ),當(dāng)一個(gè)特定事件發(fā)生的時(shí)候,一個(gè)信號(hào)被發(fā)射。因此,執(zhí)行按鈕等事件時(shí),可以方便地執(zhí)行各個(gè)功能,如界面切換、顯示和關(guān)閉等。本嵌入式系統(tǒng)的功能框圖如圖3所示,其功能都是利用“信號(hào)-插槽”機(jī)制實(shí)現(xiàn)。
3 系統(tǒng)實(shí)現(xiàn)
3.1圖像采集
獲取立體圖像是圖像處理的基礎(chǔ),圖像質(zhì)量受到光照條件、攝像機(jī)性能以及景物特點(diǎn)等因素的影響。因此,獲得高質(zhì)量的立體圖像是雙目測距前提。
V4L2(Video 4 Linux 2)是針對(duì)免驅(qū)USB設(shè)備的編程框架,主要用于采集USB攝像頭。為了更方便地調(diào)節(jié)視頻設(shè)備的屬性,本系統(tǒng)并沒有使用OpenCV獲取圖像,而是調(diào)用V4L2的接口函數(shù)。在Linux系統(tǒng)編程中,一般使用ioct()函數(shù)來對(duì)設(shè)備的I/O通道進(jìn)行管理[4]。
針對(duì)本嵌入式的特點(diǎn),使用ioct()函數(shù)可以設(shè)置圖片亮度、對(duì)比度、格式、尺寸,如設(shè)置320×240或者640×480的分辨率,以適應(yīng)屏幕大小。
系統(tǒng)圖像采集過程如圖4所示。其中,圖像處理階段若是處在獲取標(biāo)定,可以用Opencv中的“角點(diǎn)檢測”函數(shù)計(jì)算角點(diǎn)個(gè)數(shù),以判斷角點(diǎn)圖的好壞。在測距時(shí),可以完成圖像的處理。利用V4L2采集圖像的主要過程如下:
(1)fd=open(″dev/video0″,O_RDWR),打開設(shè)備文件,即左、右攝像機(jī)。
(2)ioctl(fd,VIDIOC_QUERYSTD,&std),取得設(shè)備的功能,查看設(shè)備具有什么功能。
?。?)ioctl(fd,VIDIOC_S_FMT,&fmt),設(shè)置攝像機(jī)視頻圖片格式。
(4)ioctl(fd,VIDIOC_REQBUFS,&req),向驅(qū)動(dòng)申請(qǐng)幀緩沖。
(5)mmap(),申請(qǐng)物理內(nèi)存,并將申請(qǐng)到的幀緩沖映射到用戶空間。
(6)ioctl(fd,VIDIOC_STREAMON,&type),開始視頻的采集。
?。?)ioctl(fd,VIDIOC_DQBUF,&buf),出隊(duì)列以取得已采集數(shù)據(jù)的幀緩沖,取得原始采集數(shù)據(jù)。
?。?)ioctl(fd,VIDIOC_STREAMOFF,&type),停止視頻的采集,然后使用munmap()函數(shù)刪除映射。
(9)close(fd),關(guān)閉視頻設(shè)備。
3.2 基于QT的圖像顯示
在OpenCV中,圖片是IplImage類型,IplImage類型圖片的每個(gè)像素點(diǎn)是由24位的三通道B、G、R(藍(lán)、綠、紅)三種顏色組成。若使用QT庫內(nèi)與圖像處理與顯示有關(guān)的QImage類,QImage類顏色的排列順序?yàn)镽、G、B(紅、綠、藍(lán))。為使IplImage類圖像能夠在QT圖像界面中顯示,又不降低視頻圖像質(zhì)量,需要通過程序?qū)GR圖像轉(zhuǎn)化為RGB圖像,即交換R通道與B通道的順序,可采用cvCvtColor()函數(shù)。由于本系統(tǒng)QT的特殊性,圖片不能直接顯示,可將圖像顯示在label上。采用如下語句進(jìn)行轉(zhuǎn)換及顯示:
QLabel label(this);
cvCvtColor(frame,frame,CV_RGB2BGR);
QImage image=QImage((const uchar*)frame->imageData,
frame->width,frame->height,QImage::Format_RGB888);
label.setPixmap(QPixmap::fromImage(image));
label.show();
3.3 攝像機(jī)標(biāo)定
在雙目視覺中,可以通過兩幅二維圖像對(duì)應(yīng)像素點(diǎn)計(jì)算得到三維世界坐標(biāo)與二維世界坐標(biāo)的對(duì)應(yīng)關(guān)系,以此得到物體的三維坐標(biāo)值[5]。
光軸與圖像平面的交點(diǎn)與中心的偏移形成兩個(gè)攝像機(jī)的內(nèi)cx、cy。單個(gè)像素點(diǎn)在成像儀上是矩形,形成另外兩個(gè)x、y方向上的焦距內(nèi)參fx、fy。這樣,可以得到攝像機(jī)的內(nèi)矩陣M,將物理世界的點(diǎn)Q(X,Y,Z)投影到攝像機(jī)上q(x,y),利用齊次坐標(biāo),可表示為:
q=MQ(3)
其中,M=fx 0 cx0 fy cy0 0 1,q=xy1,Q=XYZ
透鏡的球形形狀產(chǎn)生徑向畸變k1、k2、k3,在成像儀上徑向位置按下式進(jìn)行調(diào)節(jié):
透鏡與圖像不平衡產(chǎn)生切向畸變,用兩個(gè)參數(shù)p1和p2表示:
其中,(x,y)是原來的點(diǎn),(xcorrected,ycorrected)為修正后的點(diǎn)。
兩攝像機(jī)之間的旋轉(zhuǎn)矩陣R和平移向量T構(gòu)成了攝像機(jī)的外參。OpenCV中利用cvStereoCalibrate()函數(shù)和多幅棋盤角點(diǎn)圖(圖5)進(jìn)行立體標(biāo)定。
3.4 立體校正
在實(shí)際應(yīng)用中,攝像機(jī)幾乎不可能像圖1那樣嚴(yán)格地前向平行對(duì)準(zhǔn),但可以通過數(shù)學(xué)方法計(jì)算投影圖和畸變圖,從而將左右攝像機(jī)圖像校正為前向平行對(duì)準(zhǔn)[6]。立體校正的目的就是使得兩臺(tái)攝像機(jī)準(zhǔn)確共面并且相對(duì)準(zhǔn),因此需要進(jìn)行校正。
立體校正算法有非標(biāo)定校正(如Hartley算法)等。其可以簡單地通過場景中觀察點(diǎn)完成校正,然而不可獲知圖像比例。Bouguet算法為標(biāo)定立體算法,使用兩臺(tái)攝像機(jī)之間的旋轉(zhuǎn)和平移參數(shù)進(jìn)行校正計(jì)算。Bouguet立體校正可使得兩圖像中的每一幅重投影次數(shù)都最小化,同時(shí)使得觀測面積最大化。
通過OpenCV中cvStereoRectify()立體校正函數(shù),可以得到重投影矩陣Q:
3.5 立體匹配
圖像立體匹配實(shí)質(zhì)上解決了對(duì)不同時(shí)間或空間位置下獲取的同一物體的兩幅或多幅圖像信息在位置空間或灰度空間上尋找對(duì)應(yīng)匹配像素點(diǎn)的問題。簡言之,尋找這些圖像中相同物體的對(duì)應(yīng)像素點(diǎn)。
立體匹配找到兩個(gè)不同攝像機(jī)圖像中具有相同特征的點(diǎn)。OpenCV中有BM算法、SGBM算法、GC算法等。其中BM算法測距速度很快,可以達(dá)到實(shí)時(shí)應(yīng)用的要求,SGBM算法和GC(Graph Cuts)算法的測距速度較慢,而BM算法誤差只比SGBM算法稍大,故系統(tǒng)采用BM算法[7]。BM塊匹配算法cvFindStereoCorrespondenceBM()函數(shù),使用“絕對(duì)誤差累計(jì)”,查找左右兩幅立體校正圖像之間的匹配點(diǎn),匹配代價(jià)函數(shù):
其中E表示匹配窗口灰度均值,D為匹配窗口,d為窗口的位移量。代價(jià)越小,匹配度越高。通過規(guī)定視差的搜索范圍構(gòu)成一個(gè)雙目視界。
3.6 三維重建
利用立體匹配得到的視差d、圖像中通過角點(diǎn)檢測到的點(diǎn)(x,y)以及由立體校正得到的投影矩陣Q,可得到3D深度:
其中三維坐標(biāo)就是(X/W,Y/W,Z/W)。Opencv中的函數(shù)cvReprojectImageTo3d(),該函數(shù)輸入視差數(shù)據(jù)和每個(gè)像素坐標(biāo),輸出所需的三維點(diǎn)陣,這樣就可以提取物體的深度信息。
4 實(shí)驗(yàn)結(jié)果
OpenCV利用張正友標(biāo)定法,使用20幅擺放在不同位置的平面黑白棋盤圖,對(duì)攝像機(jī)標(biāo)定。在應(yīng)用過程中,攝像機(jī)標(biāo)定誤差及系統(tǒng)結(jié)構(gòu)參數(shù)對(duì)系統(tǒng)測量精度有著不同程度的影響[8],采取優(yōu)化方法后的攝像機(jī)內(nèi)參數(shù)如下。
左攝像機(jī)內(nèi)參數(shù)為:
利用上述參數(shù),使用該系統(tǒng)測量多個(gè)目標(biāo)物體的距離,將測量值與實(shí)際值進(jìn)行比較,得到表1所示結(jié)果。
實(shí)驗(yàn)表明,攝像機(jī)間的距離約36.5 mm時(shí),在300~2 500 mm的實(shí)驗(yàn)范圍內(nèi),系統(tǒng)能夠識(shí)別匹配物體的圖像,得出物體的距離的測量誤差在10%以內(nèi)。系統(tǒng)測距較為準(zhǔn)確。但隨著距離的增加,導(dǎo)致匹配效果較差,誤差有逐漸擴(kuò)大的趨勢。物體距離為2 500 mm時(shí),測量距離誤差已超過100 mm。因此,本系統(tǒng)暫不適合遠(yuǎn)距離測距。為提高測距精度,可從以下幾個(gè)方面入手:增加標(biāo)定圖像數(shù)目,增加基線長度,調(diào)整相應(yīng)參數(shù),變換圖像處理方法,增大焦距等。如何更有效地減少測量誤差,擴(kuò)大測距范圍,需要以后不斷研究和改進(jìn)。
參考文獻(xiàn)
[1] 趙鵬.機(jī)器視覺理論及應(yīng)用[M].北京:電子工業(yè)出版社,2011.
[2] 王杰,孟浩,張潔.基于嵌入式Linux的雙目測距系統(tǒng)研究[J].世界科技研究與發(fā)展,2014,36(3):263-267.
[3] BRADSKI G, KAEHLER A. 學(xué)習(xí)OpenCV[M]. 于仕琪,劉瑞禎,譯. 北京:清華大學(xué)出版社,2009.
[4] 白長清,陳沛.嵌入式終端基于Linux V4L2的圖像采集系統(tǒng)[J].科技資訊,2012(2):22-23.
[5] 陳勝勇,劉盛.基于OpenCV的計(jì)算機(jī)視覺技術(shù)實(shí)現(xiàn)[M].北京:科學(xué)出版社,2008.
[6] 任繼昌,楊曉東.基于角點(diǎn)檢測的雙目視覺測距新方法[J].電光與控制,2013,20(7):93-95.
[7] 王浩,許志聞,謝坤,等.基于OpenCV的雙目測距系統(tǒng)[J].吉林大學(xué)學(xué)報(bào)(自然科學(xué)版),2014,32(2):188-193.
[8] 肖志濤,張文寅,耿磊.雙目視覺系統(tǒng)測量精度分析[J].光電工程,2014,41(2):6-11.