周奇才 姜 寬 趙科淵
同濟(jì)大學(xué)機(jī)械與能源工程學(xué)院 上海 201804
近年來(lái)人工智能視覺(jué)識(shí)別技術(shù)發(fā)展迅速,在起重機(jī)領(lǐng)域發(fā)揮出極大助力作用。段銳等[1]融合計(jì)算機(jī)視覺(jué)技術(shù)和建筑信息模型,實(shí)現(xiàn)在起重機(jī)運(yùn)行過(guò)程中實(shí)時(shí)監(jiān)控,對(duì)傾翻、碰撞、墜落等安全事故進(jìn)行危險(xiǎn)預(yù)警。周前飛等[2]借助無(wú)人機(jī)巡檢,采集起重機(jī)復(fù)雜鋼結(jié)構(gòu)表面圖像,進(jìn)行起重機(jī)健康狀態(tài)的結(jié)構(gòu)檢測(cè)。通過(guò)圖像處理進(jìn)行特征提取識(shí)別方式,有著非接觸、遠(yuǎn)程可視化的優(yōu)點(diǎn)。黃宏安等[3]使用YOLOv3、Faster-RCNN和SSD等主流算法實(shí)現(xiàn)對(duì)塔吊的裂縫進(jìn)行識(shí)別。熊肖磊等[4]基于YOLOv3目標(biāo)檢測(cè)算法識(shí)別吊鉤,根據(jù)圖像中吊鉤離開(kāi)平衡位置的位移和圖像坐標(biāo)變換能夠計(jì)算出吊鉤擺動(dòng)角度。雙目相機(jī)擁有更大的視野,并可以產(chǎn)生有限感知范圍的深度信息,適合滿足定位、測(cè)距、路徑規(guī)劃等相關(guān)需求。漆靜等[5]在研究實(shí)時(shí)圖像處理、惡劣天氣條件下預(yù)處理、集裝箱顏色自動(dòng)識(shí)別等方面后,提出了雙目機(jī)器視覺(jué)用于集裝箱吊具定位系統(tǒng)的理論分析和實(shí)驗(yàn)研究。張銳[6]通過(guò)雙目視覺(jué)對(duì)塔式起重機(jī)吊鉤進(jìn)行識(shí)別,獲取深度信息,得出坐標(biāo)系下具體位置。劉濤等[7]針對(duì)塔式起重機(jī)群交叉作業(yè)過(guò)程中存在的安全問(wèn)題,運(yùn)用雙目視覺(jué)測(cè)量技術(shù)來(lái)實(shí)現(xiàn)塔式起重機(jī)主動(dòng)避撞。
Matlab的相機(jī)標(biāo)定工具有2種[8]。早期的Camera Calibration Toolbox將參數(shù)設(shè)置、加載圖片、角點(diǎn)提取、相機(jī)參數(shù)計(jì)算和優(yōu)化、重投影誤差分析、數(shù)據(jù)保存和導(dǎo)出等標(biāo)定功能集成在GUI程序中,其操作多為工作區(qū)命令行方式,較為操作繁瑣。后期的Camera Calibreator集成在Matlab的APP中,標(biāo)定后直接提供重投影誤差、3D視圖的展示、相機(jī)參數(shù)、誤差等數(shù)據(jù)的標(biāo)準(zhǔn)格式導(dǎo)出將操作大大簡(jiǎn)化。OpenCV是一款免費(fèi)的計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)庫(kù),可運(yùn)行在各種操作系統(tǒng)上,由C語(yǔ)言編寫(xiě)并包含Matlab等軟件接口,實(shí)現(xiàn)了關(guān)于圖像處理和計(jì)算機(jī)視覺(jué)的通用算法,擴(kuò)展性良好。如張峰峰[9]等提出基于OpenCV利用差分遺傳算法優(yōu)化BP神經(jīng)網(wǎng)絡(luò)來(lái)進(jìn)行雙目相機(jī)標(biāo)定的方法,簡(jiǎn)化了標(biāo)定的流程,降低了計(jì)算的復(fù)雜度,亦提高了標(biāo)定的精度。李莉[10]基于OpenCV解決了張正友標(biāo)定中當(dāng)鏡頭與圖像平面夾角過(guò)小或標(biāo)定圖像次數(shù)過(guò)少時(shí)精度較差的問(wèn)題。
如圖1所示,相機(jī)模型分為小孔成像模型和雙目相機(jī)模型。假設(shè)P(XC,YC,ZC)為空間中一點(diǎn),則Pl和Pr分別是點(diǎn)P在左右相機(jī)投影平面上的投影,根據(jù)射線OlPl和射線OrPr的交點(diǎn),可確定點(diǎn)P的位置,從而得到深度信息。在實(shí)際中,攝像機(jī)不會(huì)嚴(yán)格地前向平行對(duì)準(zhǔn),還存在旋轉(zhuǎn)關(guān)系,故左右目相機(jī)可通過(guò)旋轉(zhuǎn)矩陣R和平移向量T相互聯(lián)系起來(lái)。
圖1 小孔成像模型和雙目相機(jī)模型
基于小孔成像原理,由于安裝誤差導(dǎo)致芯片的中心通常不在光軸上,且成像裝置的單個(gè)像素是矩形但不是正方形,需要引入2個(gè)新的參數(shù)Cx、Cv來(lái)對(duì)投影屏幕坐標(biāo)中心可能的偏移(對(duì)光軸而言)進(jìn)行建模。這樣假設(shè)點(diǎn)P坐標(biāo)為(X,Y,Z),根據(jù)式(1)投射到成像裝置上某個(gè)像素位置(xscreen,yscreen)
用透鏡使光線彎曲,讓足夠多的光線聚集在投影點(diǎn)上,使得圖像生成更加迅速,但也會(huì)引入因透鏡形狀或加工工藝造成的徑向畸變,導(dǎo)致離透鏡中心越遠(yuǎn)光線越彎曲,越靠近透鏡邊緣越嚴(yán)重。在實(shí)際應(yīng)用中畸變很小,用r=0附近的泰勒級(jí)數(shù)展開(kāi)前幾項(xiàng)描述,成像裝置上某點(diǎn)徑向位置可根據(jù)式(2)進(jìn)行調(diào)整。切向畸變由整個(gè)相機(jī)的組裝過(guò)程造成,由透鏡和CMOS(或CCD)的安裝誤差導(dǎo)致透鏡不與成像平面平行而產(chǎn)生的,可用2個(gè)額外參數(shù)得到,即
假設(shè)圖像物理坐標(biāo)系xOy坐標(biāo)原點(diǎn)O在圖像像素坐標(biāo)系x1O1y1下坐標(biāo)為(cx,cy),像素在各坐標(biāo)軸上所占據(jù)的物理尺寸分別為dx、dy(mm/px),則圖像中任意像素點(diǎn)在2坐標(biāo)系的轉(zhuǎn)換關(guān)系為
齊次坐標(biāo)形式為
假設(shè)空間中存在一點(diǎn)P,在雙目相機(jī)坐標(biāo)系Oc-XcYcZc下坐標(biāo)為(Xc,Yc,Zc),圖像物理坐標(biāo)為(x,y),由小孔成像模型可以得到
化為齊次坐標(biāo)形式
將式(7)代入式(5)式得
式中:K為相機(jī)內(nèi)參數(shù)矩陣,fx=f/dx,fy=f/dy為有效焦距,為相機(jī)焦距與水平和垂直方向上像素大小的比值。
相機(jī)內(nèi)外參數(shù)標(biāo)定方法有經(jīng)典標(biāo)定法、自動(dòng)標(biāo)定法以及主動(dòng)視覺(jué)標(biāo)定法[11]。目前使用最多的是經(jīng)典標(biāo)定法中的張氏相機(jī)標(biāo)定法,它解決了經(jīng)典標(biāo)定法中標(biāo)定物制作精度要求高的問(wèn)題,比自標(biāo)定法的精度更高,模板制作容易,成本低、使用方便、魯棒性好、準(zhǔn)確率高,用戶可快速、方便、準(zhǔn)確地得到相機(jī)的各內(nèi)外參數(shù)和畸變參數(shù)。Matlab視覺(jué)處理庫(kù)和Open CV開(kāi)源視覺(jué)庫(kù)都是基于張正友標(biāo)定原理求解相機(jī)參數(shù)。張正友標(biāo)定法流程如圖2所示。
圖2 張正友標(biāo)定法流程
2.1.1 標(biāo)定板選擇
為了保證標(biāo)定結(jié)果的精度,可采用高精度加工工藝,熱膨脹系數(shù)較低,不易變形,尺寸合適的標(biāo)定板。標(biāo)定板大小要求大于全視野的1/3,小于全視野。根據(jù)透光、反光等因素可選擇氧化鋁加玻璃基板、菲林PET加玻璃基板,亞克力基板等標(biāo)定板??紤]到制作成本以及運(yùn)輸儲(chǔ)存成本,更直接的方法是自己制作,用打印機(jī)打印出黑白棋盤(pán)格并固定到現(xiàn)有平整的基板上實(shí)現(xiàn)。
在實(shí)際中,使用不對(duì)稱(chēng)的奇偶維數(shù)的棋盤(pán)格通常更為方便,因?yàn)橹挥?個(gè)對(duì)稱(chēng)軸,所以棋盤(pán)方向可以唯一確定。拍攝一系列照片,最少2張,10~20張為宜,不同的圖片進(jìn)行標(biāo)定時(shí)得到的結(jié)果會(huì)有差異,重投影誤差很小,則表明標(biāo)定結(jié)果足夠使用。照片可實(shí)時(shí)從相機(jī)中獲取,也可利用已有的圖片來(lái)標(biāo)定。
本文選用圖3所示9行×12列的黑白標(biāo)定棋盤(pán)格,每個(gè)格子尺寸大小為30×30 mm。采用質(zhì)量較好的打印設(shè)備和紙張,粘貼在平整的剛性平木板上。實(shí)際使用中,會(huì)省略最外層格子。
圖3 黑白棋盤(pán)格
2.1.2 相機(jī)參數(shù)
雙目相機(jī)有較高的分辨率和幀率可以提升檢測(cè)精度,但控制器對(duì)數(shù)據(jù)處理的相應(yīng)時(shí)間也會(huì)增加。本次實(shí)驗(yàn)選用ZED雙目相機(jī),利用CUDA進(jìn)行計(jì)算,緩解CPU計(jì)算能力。ZED雙目相機(jī)部分參數(shù)如表1所示,實(shí)際測(cè)量中可以根據(jù)環(huán)境條件和精度要求選擇合適的分辨率與幀率,通過(guò)USB3.0接口與控制器相連并進(jìn)行數(shù)據(jù)獲取和處理,單目相機(jī)標(biāo)定可以看作是雙目相機(jī)標(biāo)定的簡(jiǎn)化。
表1 ZED雙目相機(jī)技術(shù)規(guī)格
雙目標(biāo)定的內(nèi)容包含獲取相機(jī)的內(nèi)部參數(shù)和外部參數(shù),外部參數(shù)包括旋轉(zhuǎn)矩陣和平移向量;
利用雙目相機(jī)完成立體成像具體包括使用數(shù)學(xué)方法消除徑向和切向透鏡畸變,輸出去畸變圖像;調(diào)整攝像機(jī)之間的角度和距離,輸出整幀行對(duì)齊的圖像,即2個(gè)圖像平面共面,2個(gè)成像儀上的對(duì)應(yīng)圖像行實(shí)際上相對(duì)于彼此共線。
本次實(shí)驗(yàn)中,由于雙目相機(jī)獲得的是如圖4所示的左右相連圖像,可以利用OpenCV或其他裁剪工具把圖像簡(jiǎn)單的分割成左右2幅圖像。最終獲得如圖5所示的圖像集。
圖4 雙目相機(jī)獲取圖像
圖5 左目圖像集和右目圖像集
3.2.1 OpenCV實(shí)現(xiàn)
1)確定好標(biāo)定所用標(biāo)定棋盤(pán)格寬度、高度、棋盤(pán)格寬度和所需照片數(shù)量等數(shù)據(jù)并修改相關(guān)參數(shù)。
2)利用imread()從文檔中或利用cv::Capture從相機(jī)中分別獲取左右相機(jī)含棋盤(pán)格的一系列圖像對(duì)。
3)根據(jù)提前輸入角點(diǎn)數(shù),使用 findChessboardCorner()函數(shù)檢測(cè)角點(diǎn),也使用 find4QuadCornerSubpix()函數(shù)對(duì)角點(diǎn)進(jìn)行亞像素精確化。利用drawChessboardCorners()將角點(diǎn)顯示。
4)通過(guò)stereocalibrateCamera()函數(shù)進(jìn)行標(biāo)定,標(biāo)定給出2個(gè)相機(jī)的相機(jī)矩陣、畸變矢量、產(chǎn)生旋轉(zhuǎn)矩陣、平移向量、本征矩陣、基本矩陣,并將參數(shù)寫(xiě)入xml文檔。
5)利用projectPoints()函數(shù)計(jì)算重投影誤差。利用undistortPoints()對(duì)原始點(diǎn)去畸變處理,computeCorrespondEpilines()計(jì)算極線,計(jì)算點(diǎn)和線的點(diǎn)擊,之后通過(guò)極線幾何約束計(jì)算誤差。
6)如果已經(jīng)完成標(biāo)定,使用Bouguer方法cv::stereoRectify計(jì)算標(biāo)定映射;如果未完成標(biāo)定,則使用Hartley方法cv:;stereoRectifyUncalibrated()計(jì)算標(biāo)定映射,最后利用remap()校正相機(jī)圖像。圖6是經(jīng)過(guò)立體校正左右圖像對(duì)。
圖6 經(jīng)過(guò)立體校正左右圖像對(duì)
實(shí)驗(yàn)得到平均重投影誤差=0.78,雙目極線誤差=1.73367。
3.2.2 Matlab實(shí)現(xiàn)
1)打開(kāi)模塊,將窗口上方Skew、Tangential Distortion以及3 Coefficients選項(xiàng)選中,將2 Coefficients選項(xiàng)去掉。
2)分別輸入左標(biāo)定圖像所在文件夾和右標(biāo)定圖像所在文件夾;輸入棋盤(pán)格上每個(gè)格子所占的真實(shí)尺寸大小。
3)選擇好左右相機(jī)所在文件之后,點(diǎn)擊確定按鈕,系統(tǒng)會(huì)自動(dòng)檢測(cè)效果好的標(biāo)定圖像,并剔除效果不好的圖像。
4)點(diǎn)擊Calibrate按鈕,進(jìn)行標(biāo)定。窗口界面包含:標(biāo)定的效果,雙目矯正結(jié)果,重投影誤差柱狀圖。對(duì)于重投影誤差較大的圖像可以手動(dòng)刪除掉,然后重新標(biāo)。由圖7可以看出,最高標(biāo)定誤差為0.18 pixels,平均誤差0.11 pixels,標(biāo)定效果好。
圖7 每幅圖像誤差以及平均誤差
如圖8所示,可以展示出不同位置和姿態(tài)下雙目相機(jī)和標(biāo)定板的相互位置,可以增加合適的位置關(guān)系來(lái)改善標(biāo)定結(jié)果。圖9展示了經(jīng)過(guò)立體校正左右圖像對(duì)。
圖8 相對(duì)于標(biāo)定板不同位置和姿態(tài)下雙目相機(jī)的相對(duì)位置
圖9 經(jīng)過(guò)立體校正左右圖像對(duì)
5)點(diǎn)擊Exprot Camera Parameter按鈕,保存標(biāo)定的參數(shù)數(shù)據(jù)。
3.3.3 標(biāo)定結(jié)果
2種方法標(biāo)定得到相機(jī)參數(shù)結(jié)果如表2所示。
表2 不同標(biāo)定軟件標(biāo)定結(jié)果
由圖10a可以直觀看出Matlab和OpenCV的重投影誤差均在一個(gè)像素之間,精度較好。Matlab法精度比OpenCV法更好更穩(wěn)定,而OpenCV法重投影誤差隨著照片數(shù)量先增加后減少。
圖10 雙目相機(jī)參數(shù)標(biāo)定結(jié)果與照片數(shù)關(guān)系
具體到每個(gè)參數(shù),以左目相機(jī)內(nèi)參矩陣為對(duì)象,研究了fx、fv、cx、cv、k1、k2、k3與照片數(shù)關(guān)系,以及雙目相機(jī)間的平移向量T與照片數(shù)關(guān)系。Matlab和OpenCV標(biāo)定結(jié)果在照片數(shù)較多情況下標(biāo)定結(jié)果的相差不大,其中cx、cv變化明顯和廠家值偏差明顯。2款軟件對(duì)切向畸變[p1,p2],估計(jì)都為零,而實(shí)際廠家還是給出了2個(gè)非零的微小量。總體而言,Matlab結(jié)果更加穩(wěn)定,在照片數(shù)量較少的情況下仍能得到良好的標(biāo)定結(jié)果;而OpenCV方法在如Tv、Tz、k1等參數(shù)有著更接近廠家值的結(jié)果。此外,實(shí)驗(yàn)過(guò)程中環(huán)境因素如光線、灰塵,棋盤(pán)格質(zhì)量如材料、平整度,都會(huì)對(duì)重投影誤差有影響,而棋盤(pán)格大小,角點(diǎn)數(shù)量對(duì)結(jié)果沒(méi)有明顯影響。
即使輸入相同照片,2種工具得到的相機(jī)標(biāo)定結(jié)果也不盡相同。二者雖然都是基于張正友提出的標(biāo)定算法來(lái)進(jìn)行相機(jī)標(biāo)定,Matlab采用的是進(jìn)一步的Heikkil?的改進(jìn)算法,有進(jìn)行結(jié)果的迭代優(yōu)化。同時(shí)標(biāo)定時(shí)OpenCV在處理魚(yú)眼相機(jī)或比較模糊的圖片時(shí)會(huì)報(bào)錯(cuò),且2個(gè)相機(jī)的初始位置近乎平行且基線長(zhǎng)度不要太長(zhǎng),否則誤差會(huì)很大。OpenCV中角點(diǎn)是自動(dòng)檢測(cè)的,為了保證相同參考系,左右相機(jī)標(biāo)定的角點(diǎn)必須選擇相同的網(wǎng)格點(diǎn)和相同的原點(diǎn)。因此,實(shí)驗(yàn)時(shí)最好將角點(diǎn)可視化,觀察角點(diǎn)是否匹配正確。
為了得到更好的結(jié)果,實(shí)驗(yàn)顯示照片數(shù)量最好為15~20對(duì),OpenCV相比Matlab需要更多的照片對(duì)來(lái)完成準(zhǔn)確的標(biāo)定,否則當(dāng)照片數(shù)量較少時(shí)會(huì)產(chǎn)生很大誤差。在照片數(shù)小于14張時(shí),OpenCV法在fx、fv、k1、k2有較大的誤差,Matlab在Tv、Tz有較大的誤差。當(dāng)照片數(shù)小于6張時(shí),Matlab法的其他參數(shù)也有著不小的誤差。不同的圖片因?yàn)閷?shí)際拍攝質(zhì)量原因進(jìn)行標(biāo)定時(shí)得到的結(jié)果會(huì)有差異,重投影誤差足夠小時(shí)標(biāo)定結(jié)果就足夠使用。
Matlab作為現(xiàn)有的標(biāo)定軟件,簡(jiǎn)單易操作,結(jié)果穩(wěn)定,有著更好的用戶交互功能,但其結(jié)果不能直接被應(yīng)用到CMAKE工程里,也因其對(duì)程序的打包不利于程序跟蹤和二次開(kāi)發(fā)。當(dāng)現(xiàn)有照片數(shù)量不多以及存在標(biāo)定板與鏡頭夾角較小情況時(shí)優(yōu)先選用。
OpenCV自帶的標(biāo)定程序目前仍存在不足和限制,后續(xù)可利用一些方法和算法進(jìn)行二次開(kāi)發(fā)對(duì)標(biāo)定流程和結(jié)果進(jìn)行優(yōu)化。除了Matlab中直接輸入攝像頭信息和采用已經(jīng)采集好的多張不同位置的標(biāo)定模板照片2種輸入方式外,OpenCV還支持采集的視頻流文件輸入方式。OpenCV雖然操作復(fù)雜,但可以結(jié)合圖像分割、相機(jī)校正和后續(xù)外參標(biāo)定,以實(shí)現(xiàn)全自動(dòng)標(biāo)定和其他操作,易于將結(jié)果加載到程序中??梢詫atlab某些結(jié)果導(dǎo)入到OpenCV中來(lái)細(xì)化標(biāo)定結(jié)果,即在Matlab中標(biāo)定之后再使用OpenCV標(biāo)定。但需要注意的是矩陣在Matlab中是按列存儲(chǔ)的,即內(nèi)參矩陣IntrinsicMatrix和旋轉(zhuǎn)矩陣RotationOfCamera2需要轉(zhuǎn)置后再使用。
其次,畸變系數(shù)徑向畸變參數(shù)第3個(gè)數(shù)值需要放在上述2個(gè)參數(shù)中的第5個(gè)位置。即OpenCV中D=[k1,k2,p1,p2,k3],而在 Matlab 中為 RadialDistortion=[k1,k2,k3],TangentialDistortion=[P1,P2]。否則校正后的圖片會(huì)有很大偏差。
1)利用Matlab和OpenCV均可實(shí)現(xiàn)單目相機(jī)、雙目相機(jī)參數(shù)標(biāo)定。
2)隨著標(biāo)定所用照片數(shù)量增加,2種工具的標(biāo)定結(jié)果都逐漸趨于穩(wěn)定。在照片數(shù)量較少的時(shí)候,Matlab法有著更加穩(wěn)定的精度。
3)即使采用的照片相同,2種工具得到的結(jié)果也會(huì)不同。
4)Matlab適合新手操作以及滿足只需要得到相機(jī)參數(shù)這種簡(jiǎn)單需求。OpenCV適合進(jìn)行二次開(kāi)發(fā),可以利用一些方法和算法對(duì)標(biāo)定流程和結(jié)果進(jìn)行優(yōu)化,以及配合后續(xù)圖像分割、相機(jī)校正和圖像識(shí)別等過(guò)程實(shí)現(xiàn)自動(dòng)操作。而兩種工具結(jié)果融合能提供更可靠的參考。