王道累,孫 昊,胡 松,韓 洋
(1. 上海電力大學(xué)能源與機(jī)械工程學(xué)院,上海200090; 2. 中國(guó)電建集團(tuán)江西省電力設(shè)計(jì)院有限公司,江西南昌330000)
隨著人工智能技術(shù)的飛速發(fā)展,計(jì)算機(jī)視覺(jué)技術(shù)已廣泛地應(yīng)用于智能制造、自動(dòng)控制、自動(dòng)導(dǎo)航、三維重建逆向工程、虛擬現(xiàn)實(shí)(VR)和增強(qiáng)現(xiàn)實(shí)(AR)等領(lǐng)域中。相機(jī)標(biāo)定是計(jì)算機(jī)視覺(jué)技術(shù)中一個(gè)必不可少的基礎(chǔ)環(huán)節(jié),其結(jié)果將會(huì)參與到其他與之有關(guān)的計(jì)算過(guò)程中,直接影響整個(gè)計(jì)算機(jī)視覺(jué)系統(tǒng)的精度[1]。
相機(jī)標(biāo)定就是利用空間中的一些固定的標(biāo)定點(diǎn)或者標(biāo)志物,通過(guò)它們?cè)谑澜缈臻g中的位置以及在圖片中的坐標(biāo)關(guān)系,確定世界空間坐標(biāo)系對(duì)于相機(jī)圖像坐標(biāo)系的對(duì)應(yīng)幾何關(guān)系模型,然后計(jì)算得到該幾何模型的對(duì)應(yīng)參數(shù),也就是求解出相機(jī)的內(nèi)部參數(shù)和外部參數(shù)以及畸變系數(shù)[2]。其中,內(nèi)部參數(shù)對(duì)應(yīng)的是相機(jī)自身的成像特性和內(nèi)部結(jié)構(gòu),外部參數(shù)則可以反映相機(jī)關(guān)于真實(shí)世界坐標(biāo)系的朝向和位置關(guān)系[3]。
目前,在實(shí)際應(yīng)用中使用最廣泛的相機(jī)標(biāo)定方法主要包括直接線性變換(DLT)解法[4]、基于徑向校正約束(RAC)的兩步標(biāo)定法[5]以及張正友平面標(biāo)定法等[6]。DLT算法中使用的透視變換模型被簡(jiǎn)化為線性模型,所求解的參數(shù)矩陣方程都是基于線性模型,但是相機(jī)在實(shí)際成像時(shí)受制造工藝等因素的影響,拍攝的圖像都會(huì)存在一定程度的非線性畸變,導(dǎo)致用這種方法求解出的相機(jī)參數(shù)在精度上存在很大的局限性[7]。
基于RAC的兩步標(biāo)定法利用相機(jī)成像模型中的部分內(nèi)在性質(zhì)和關(guān)系,先求解出一些參數(shù),然后利用這些已求出的參數(shù)增加相機(jī)非線性畸變等因素對(duì)模型進(jìn)行優(yōu)化,進(jìn)一步求解出較為精確的標(biāo)定結(jié)果[8],但這種方法在實(shí)際使用中需要一個(gè)精確的標(biāo)定物,存在對(duì)初始值敏感、收斂性差和容易陷入局部最優(yōu)解等缺點(diǎn)。張正友平面標(biāo)定法是在RAC兩步標(biāo)定法的基礎(chǔ)上對(duì)標(biāo)定物進(jìn)行改進(jìn),僅需要一個(gè)打印的棋盤格就可以求解標(biāo)定結(jié)果,克服了RAC兩步標(biāo)定算法需要高精度標(biāo)定物的缺點(diǎn),但標(biāo)定結(jié)果精度并沒(méi)有很大提高,仍然存在與RAC算法相同的缺點(diǎn)[9]。
相機(jī)標(biāo)定計(jì)算是一個(gè)多維的非線性問(wèn)題,每一幅標(biāo)定圖像都對(duì)應(yīng)著不同的外參數(shù),因此在對(duì)標(biāo)定點(diǎn)進(jìn)行反投影的過(guò)程中,難以找到具體的計(jì)算方程。常見(jiàn)的優(yōu)化算法如擬牛頓法等,必須依賴具體的函數(shù)形式,不能適用于相機(jī)標(biāo)定的優(yōu)化,因此,研究者們多聚焦于使用粒子群算法對(duì)相機(jī)標(biāo)定結(jié)果進(jìn)行優(yōu)化。黃偉光等[10]使用經(jīng)典粒子群算法對(duì)相機(jī)標(biāo)定進(jìn)行了優(yōu)化,以平均相對(duì)誤差絕對(duì)值為目標(biāo)函數(shù),求解出相機(jī)參數(shù),標(biāo)定精度得到了提高。秦瑞康等[11]研究了基于全參數(shù)自適應(yīng)變異粒子群算法的單目相機(jī)標(biāo)定方法,設(shè)計(jì)了基于粒子群平均粒距的改進(jìn)的粒子自適應(yīng)變異率,對(duì)相機(jī)標(biāo)定結(jié)果進(jìn)行了優(yōu)化。徐呈藝等[12]引入擴(kuò)散機(jī)制來(lái)改善粒子群算法易陷入局部最優(yōu)解的問(wèn)題。
為了提高相機(jī)標(biāo)定所獲得相機(jī)參數(shù)的精度,本文中利用天牛須搜索(BAS)算法,對(duì)標(biāo)定結(jié)果進(jìn)行優(yōu)化。所使用的BAS算法具有不依賴目標(biāo)函數(shù)具體形式、收斂快、優(yōu)化多維問(wèn)題時(shí)參數(shù)不會(huì)互相影響以及不容易陷入局部最優(yōu)解等優(yōu)點(diǎn),收斂速度和標(biāo)定結(jié)果精度都優(yōu)于粒子群算法的。
在實(shí)際應(yīng)用的相機(jī)成像模型中,針孔相機(jī)成像模型因原理簡(jiǎn)單而得到最廣泛的應(yīng)用[13]。
圖1所示為針孔相機(jī)的成像模型,反映了相機(jī)把真實(shí)三維世界拍攝成圖像的過(guò)程[14]。該過(guò)程主要包括4個(gè)坐標(biāo)系及其轉(zhuǎn)換關(guān)系: 1)世界空間坐標(biāo)系和相機(jī)坐標(biāo)系之間的轉(zhuǎn)換關(guān)系稱為剛體變換,涉及旋轉(zhuǎn)矩陣R和平移向量T,統(tǒng)稱為相機(jī)外部參數(shù); 2)相機(jī)坐標(biāo)系和理想圖像坐標(biāo)系之間通過(guò)透視投影相互變換,涉及2個(gè)焦距參數(shù)fx、fy與1個(gè)主點(diǎn)坐標(biāo)(u0,v0),共4個(gè)參數(shù),統(tǒng)稱為相機(jī)內(nèi)部參數(shù); 3)最終的實(shí)際圖像坐標(biāo)系和理想圖像坐標(biāo)系之間的畸變校正模型,涉及5個(gè)參數(shù)k1、k2、k3、p1、p2,統(tǒng)稱為畸變系數(shù)[15-16]。
(Xc, Yc, Zc)、(Xw, Yw, Zw)—三維世界中的點(diǎn)在相機(jī)坐標(biāo)系與世界坐標(biāo)系下的坐標(biāo); (x, y)、(u, v)—對(duì)應(yīng)的理想圖像坐標(biāo)系下的坐標(biāo),其中(x, y)為以圖像中心作為原點(diǎn)時(shí)的坐標(biāo),(u, v)為以圖像左上角頂點(diǎn)為原點(diǎn)時(shí)的坐標(biāo); (xr, yr)—真實(shí)圖像坐標(biāo)系下的坐標(biāo); R、T—相機(jī)外部參數(shù); fx、fy、u0、v0、α、β—相機(jī)內(nèi)部參數(shù),其中α、β可以由另外4個(gè)參數(shù)變換得到; k1、k2、k3、p1、p2—畸變參數(shù)。圖1 針孔相機(jī)成像模型
BAS算法是一種新的基于仿生原理的智能優(yōu)化算法[17],受仿生學(xué)中對(duì)天牛在覓食時(shí)行為的啟發(fā),優(yōu)化的目標(biāo)函數(shù)就是天牛要尋找食物的位置。在天牛尋找食物的過(guò)程中,會(huì)根據(jù)左、右2個(gè)觸角接收到食物氣味的強(qiáng)度不同來(lái)確定食物的方向,然后跳躍到下一個(gè)位置,直到找到食物[18]。跟大多數(shù)智能優(yōu)化算法相比,BAS算法在尋優(yōu)的過(guò)程中只有一只天牛,即只有一個(gè)“粒子”就可以實(shí)現(xiàn)多維的尋優(yōu),運(yùn)算過(guò)程簡(jiǎn)單,運(yùn)算量小,速度快。在運(yùn)算過(guò)程中只利用左、右觸角的食物氣味強(qiáng)度來(lái)判斷方向,也就是只依賴于2個(gè)不同方向的函數(shù)值即可獲得下一步尋優(yōu)的方向,可以不依賴目標(biāo)函數(shù)的具體形式和梯度信息即可實(shí)現(xiàn)尋優(yōu)計(jì)算,而且在多維目標(biāo)的優(yōu)化計(jì)算中各維度也不會(huì)互相干擾而影響結(jié)果。在尋優(yōu)的過(guò)程中,天牛每移動(dòng)一步頭的朝向是隨機(jī)的,只要初始步長(zhǎng)設(shè)定的足夠大,就可以避免陷入局部最優(yōu)解[19]。
根據(jù)BAS算法的仿生學(xué)思想,可以抽象出BAS算法的策略模型如下:
1)把天牛抽象為一個(gè)質(zhì)心,左、右2個(gè)觸角抽象為質(zhì)心兩側(cè)的2個(gè)相反方向,且尖端距離質(zhì)心的長(zhǎng)度相等。
2)質(zhì)心每一次跳躍的距離與2個(gè)觸角尖端的距離成一定比例,也就是步長(zhǎng)與觸角尖端之間的距離成一定的比例。
3)質(zhì)心在跳躍到新的一點(diǎn)時(shí)頭部的朝向是隨機(jī)的。
依照這個(gè)策略模型,可以進(jìn)一步建立BAS算法的數(shù)學(xué)模型,并推廣到n維空間:
1)該目標(biāo)函數(shù)是一個(gè)n維空間的尋優(yōu)問(wèn)題,質(zhì)心的初始位置是一個(gè)n維向量 ,左、右觸角尖端的位置分別為xl、xr,2個(gè)尖端之間的距離為d0。
2)質(zhì)心每一步的朝向是隨機(jī)的,因此生成一個(gè)隨機(jī)的n維向量來(lái)表示這個(gè)方向,并歸一化,即
3)寫出xl、xr的表達(dá)式,即
式中x為相機(jī)標(biāo)定的初始值。
進(jìn)而得到左、右兩觸角尖端對(duì)應(yīng)的函數(shù)值y(xl)、y(xr)。
4)比較y(xl)、y(xr)的大小。如果y(xl) x=x+s(xl-xr) ; 如果y(xl)>y(xr),則尋找y的最小值,質(zhì)心需要向左觸角的方向跳躍步長(zhǎng)s,得到下一步質(zhì)心的位置 x=x-s(xl-xr) 。 5)設(shè)定每一步迭代的步長(zhǎng)為 s=ηs, 式中η為變步長(zhǎng)系數(shù),取值為0~1之間的任意數(shù)。通常,為了避免陷入局部最優(yōu)解,該系數(shù)的選取盡量接近1。 基于BAS算法的相機(jī)參數(shù)優(yōu)化的第一步是應(yīng)用MATLAB軟件自帶的相機(jī)標(biāo)定工具箱計(jì)算相機(jī)參數(shù),結(jié)果設(shè)置為初始參數(shù),然后結(jié)合BAS算法使用Python編程語(yǔ)言進(jìn)行計(jì)算機(jī)編程,通過(guò)反投影重建標(biāo)定角點(diǎn),再以反投影重建出的標(biāo)定角點(diǎn)與檢測(cè)到的真實(shí)角點(diǎn)坐標(biāo)之間的誤差作為目標(biāo),進(jìn)而對(duì)相機(jī)的內(nèi)參數(shù)和畸變系數(shù)進(jìn)行優(yōu)化迭代。 1)使用OpenCV計(jì)算機(jī)視覺(jué)庫(kù)中的FindCornerSubPix函數(shù),可以直接檢測(cè)圖像中的標(biāo)定角點(diǎn)亞像素坐標(biāo)。 2)利用MATLAB軟件自帶的相機(jī)標(biāo)定工具箱計(jì)算出相機(jī)的內(nèi)部參數(shù)、外部參數(shù)和畸變系數(shù)。其中包括4個(gè)內(nèi)部參數(shù)fx、fy、u0、v0,2個(gè)外部參數(shù)以及5個(gè)畸變系數(shù)k1、k2、p1、p2、k3,將這些參數(shù)作為優(yōu)化迭代的初始值,該初始值是一個(gè)九維向量x0=(fx,fy,u0,v0,k1,k2,p1,p2,k3),用實(shí)際識(shí)別到的標(biāo)定角點(diǎn)的圖像坐標(biāo)系亞像素坐標(biāo)(x,y),結(jié)合BAS算法計(jì)算出的內(nèi)部參數(shù)以及畸變系數(shù)得到標(biāo)定角點(diǎn)的反投影坐標(biāo)(x′,y′)之間的平均誤差作為目標(biāo)函數(shù), 3)設(shè)2個(gè)觸角尖端距離d0=5,初始步長(zhǎng)s=1,變步長(zhǎng)系數(shù)η=0.95。 4)隨機(jī)生成一個(gè)9維向量并對(duì)其歸一化作為當(dāng)前朝向,計(jì)算當(dāng)前前進(jìn)步長(zhǎng),根據(jù)y(xl)、y(xr)的值確定前進(jìn)方向,然后計(jì)算跳躍步長(zhǎng),更新y(xl)、y(xr)的值。 5)比較當(dāng)前目標(biāo)函數(shù)值和全局最優(yōu)值。如果當(dāng)前目標(biāo)函數(shù)值小于全局最優(yōu)值,則更新全局最優(yōu)值并繼續(xù)運(yùn)行;否則直接進(jìn)入下一步。 6)返回步驟4)繼續(xù)運(yùn)行,直到迭代次數(shù)達(dá)到預(yù)設(shè)次數(shù)。 7)輸出最終的全局最優(yōu)值。 實(shí)驗(yàn)采用德國(guó)AVT公司生產(chǎn)的一款工業(yè)數(shù)字相機(jī)來(lái)拍攝標(biāo)定圖像,采用Sony ICX274型傳感器,使用千兆以太網(wǎng)口作為數(shù)據(jù)傳輸接口,拍攝的圖像分辨率為4 032像素×3 024像素。棋盤格標(biāo)定板使用激光打印的9行、12列的棋盤格,每個(gè)格子的尺寸為25 mm×25 mm(長(zhǎng)度×寬度),以棋盤格角點(diǎn)作為標(biāo)定點(diǎn),每幅圖像共有88個(gè)標(biāo)定點(diǎn),共拍攝20張圖像,如圖2所示。 圖2 相機(jī)拍攝的標(biāo)定圖像 首先采用軟件對(duì)相機(jī)參數(shù)進(jìn)行標(biāo)定,得到相機(jī)的外部參數(shù)(R,T)、內(nèi)部參數(shù)(fx,fy,u0,v0)以及畸變系數(shù)(k1,k2),并假設(shè)p1=0,p2=0,p3=0,以此為初始值然后隨機(jī)生成一個(gè)9維向量作為初始朝向。根據(jù)每張標(biāo)定圖像對(duì)應(yīng)的參數(shù),利用OpenCV庫(kù)中的反投影函數(shù)ProjectPoints求出標(biāo)定角點(diǎn)的反投影坐標(biāo),計(jì)算檢測(cè)到的實(shí)際像素坐標(biāo)與反投影坐標(biāo)的歐氏距離。實(shí)驗(yàn)中采用全部20幅圖像中所有的角點(diǎn)參與優(yōu)化計(jì)算,最高迭代次數(shù)設(shè)置為500。 圖3所示分別為基于BAS的優(yōu)化標(biāo)定算法和文獻(xiàn)[12]中基于改進(jìn)粒子群的優(yōu)化標(biāo)定算法在500次循環(huán)迭代過(guò)程中目標(biāo)函數(shù)值的變化情況。從圖中可以看出,基于BAS的標(biāo)定方法在迭代開(kāi)始的階段函數(shù)值一直沒(méi)有改變,原因是為了防止陷入局部最優(yōu)解,初始步長(zhǎng)設(shè)置較大,導(dǎo)致在迭代開(kāi)始階段沒(méi)有找到更優(yōu)解,最優(yōu)解一直沒(méi)有得到更新,所以目標(biāo)函數(shù)值也一直沒(méi)有得到優(yōu)化。當(dāng)?shù)M(jìn)行到40次后,目標(biāo)函數(shù)函數(shù)值開(kāi)始快速收斂,到80次后函數(shù)值趨于平穩(wěn)。而基于改進(jìn)粒子群算法的標(biāo)定方法的函數(shù)值經(jīng)過(guò)380次迭代以后才趨于穩(wěn)定,收斂速度明顯慢于基于BAS的標(biāo)定方法的收斂速度。 表1所示為基于BAS的優(yōu)化標(biāo)定算法求解出的相機(jī)標(biāo)定內(nèi)部參數(shù)和畸變系數(shù)以及目標(biāo)函數(shù)值,分別給出第40、60、80、100、500次迭代后優(yōu)化的結(jié)果。從圖3和表1可以看出,由于初始步長(zhǎng)設(shè)置較大,因此在最初階段各個(gè)參數(shù)值都沒(méi)有得到更新。隨著迭代次數(shù)的增加,當(dāng)?shù)螖?shù)達(dá)到40后,目標(biāo)函數(shù)值開(kāi)始快速收斂; 當(dāng)?shù)螖?shù)大于80時(shí),目標(biāo)函數(shù)值基本趨于穩(wěn)定; 經(jīng)過(guò)100次迭代后,求解的各個(gè)參數(shù)都趨于穩(wěn)定; 當(dāng)?shù)螖?shù)為500時(shí),最終目標(biāo)函數(shù)值即標(biāo)定的平均反投影誤差為0.07像素,優(yōu)化計(jì)算得到的值即為相機(jī)的內(nèi)參數(shù)和畸變系數(shù)。 (a)基于天牛須搜索(BAS)優(yōu)化標(biāo)定算法(b)基于粒子群優(yōu)化標(biāo)定算法圖3 不同相機(jī)優(yōu)化標(biāo)定算法得到的收斂曲線 表1 基于天牛須搜索(BAS)的相機(jī)優(yōu)化標(biāo)定算法的結(jié)果 圖4所示為根據(jù)最終優(yōu)化結(jié)果進(jìn)行反投影所有標(biāo)定點(diǎn)的結(jié)果,每幅標(biāo)定圖像用不同顏色顯示,圖中每個(gè)編號(hào)對(duì)應(yīng)的平面即為20張不同的標(biāo)定圖像在空間中的反投影,圖4中坐標(biāo)系原點(diǎn)為相機(jī)所在位置。為了證明基于BAS的優(yōu)化標(biāo)定算法計(jì)算出的相機(jī)內(nèi)參和畸變系數(shù)的可靠性,提取出實(shí)際檢測(cè)到的角點(diǎn)亞像素坐標(biāo)(x,y)和迭代500次之后的反投影角點(diǎn)像素坐標(biāo)(x′,y′)。為了驗(yàn)證算法的有效性,同時(shí)給出張正友標(biāo)定法和文獻(xiàn)[12]中的基于改進(jìn)粒子群標(biāo)定法得到的反投影像素坐標(biāo),分別計(jì)算不同算法的誤差和平均誤差。由于標(biāo)定點(diǎn)數(shù)量巨大,在此只給出第1幅圖像中前11個(gè)標(biāo)定點(diǎn)(第1行)的數(shù)據(jù)和所有標(biāo)定點(diǎn)的總體平均誤差,如表2、3所示。 (xc, yc, zc)—三維世界中的點(diǎn)在相機(jī)坐標(biāo)系下的坐標(biāo); 1—20—平面編號(hào)。圖4 相機(jī)標(biāo)定點(diǎn)反投影重建結(jié)果 表2 不同相機(jī)優(yōu)化標(biāo)定算法的反投影坐標(biāo)及對(duì)應(yīng)誤差 表3 不同相機(jī)優(yōu)化標(biāo)定算法的總體平均誤差 從表2、3中可以看出,對(duì)于第1幅圖像的前11個(gè)標(biāo)定點(diǎn),張正友標(biāo)定法得到的x、y軸方向上的平均誤差分別為1.73、0.74像素,整體的平均誤差約為1.88像素; 基于改進(jìn)粒子群的優(yōu)化標(biāo)定算法得到的x、y軸方向上的平均誤差分別為0.55、0.45像素,整體的平均誤差約為0.71像素; 本文中提出的基于BAS的優(yōu)化標(biāo)定算法得到的x、y軸方向上的平均誤差分別為0.05、0.07像素,整體的平均誤差為0.08像素。對(duì)于本實(shí)驗(yàn)中用到的所有標(biāo)定點(diǎn),張正友標(biāo)定法總體平均誤差為1.18像素,總體平均誤差為0.39像素;基于BAS的優(yōu)化標(biāo)定算法的總體平均誤差為0.07像素,說(shuō)明本文中提出的基于BAS的優(yōu)化標(biāo)定算法可以有效地提高標(biāo)定精度。 本文中提出了基于BAS算法的相機(jī)優(yōu)化標(biāo)定方法,通過(guò)MATLAB軟件的相機(jī)標(biāo)定工具箱獲得了相機(jī)的內(nèi)部、外部參數(shù),將其作為優(yōu)化算法的初始值,然后基于BAS算法對(duì)相機(jī)的所有參數(shù)進(jìn)行迭代優(yōu)化。該算法是一個(gè)非常復(fù)雜的多維度非線性目標(biāo)優(yōu)化求解問(wèn)題,使用的BAS算法具有收斂快、不容易陷入局部最優(yōu)解等優(yōu)點(diǎn)。研究結(jié)果表明,本文中采用的BAS算法可以快速、有效地提高相機(jī)標(biāo)定的精度,算法簡(jiǎn)單,易于實(shí)現(xiàn),求解多維度問(wèn)題時(shí)各參數(shù)不會(huì)互相影響,且穩(wěn)定成熟,收斂快,適用于工程實(shí)踐。3 基于BAS算法的相機(jī)參數(shù)優(yōu)化
4 結(jié)果與討論
5 結(jié)論