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