穆莉莉, 李訓(xùn)杰, 楊洪濤, 史 程
(安徽理工大學(xué)機(jī)械工程學(xué)院,安徽 淮南 232001)
在相機(jī)運(yùn)動(dòng)的過(guò)程中,不同的相機(jī)幀數(shù)使得圖像相鄰幀像素發(fā)生不同程度的位移。當(dāng)相機(jī)抖動(dòng)過(guò)大時(shí),幀數(shù)較少的相機(jī)所拍攝的相鄰幀畫(huà)面可能無(wú)任何重疊區(qū)域[1-3],即可能會(huì)出現(xiàn)不存在任何相關(guān)特征點(diǎn)的情況,此時(shí)視覺(jué)里程計(jì)中將會(huì)出現(xiàn)特征點(diǎn)追蹤匹配失敗的情況[4],從而導(dǎo)致視覺(jué)SLAM的位姿估計(jì)和局部建圖出現(xiàn)嚴(yán)重偏差[5]。目前對(duì)圖像消抖的方法主要分為兩種:硬件消抖與軟件消抖。硬件消抖主要是通過(guò)電子水平儀補(bǔ)償相機(jī)抖動(dòng)時(shí)所產(chǎn)生的位移。Zhou等[6]使用電子水平儀對(duì)雙目模塊進(jìn)行穩(wěn)定,從而從硬件層面上穩(wěn)定畫(huà)面,達(dá)到雙目特征點(diǎn)匹配穩(wěn)定的目的。軟件消抖則是通過(guò)計(jì)算處理視頻畫(huà)面數(shù)據(jù)進(jìn)行預(yù)測(cè)或補(bǔ)償。Han等[7]針對(duì)相機(jī)拍攝過(guò)程中的突然抖動(dòng)從而導(dǎo)致的視頻質(zhì)量下降的問(wèn)題,提出一種基于慣性視覺(jué)狀態(tài)跟蹤的移動(dòng)設(shè)備視頻穩(wěn)定方案,使用圖像幀之間的運(yùn)動(dòng)結(jié)構(gòu)來(lái)估計(jì)攝像機(jī)的平移。Pu等[8]引入運(yùn)動(dòng)熵來(lái)檢測(cè)抖動(dòng)噪聲較大的視頻,并提取紋理變化分?jǐn)?shù)的穩(wěn)定特征進(jìn)行雙重檢測(cè)。為了解決視覺(jué)里程計(jì)工作時(shí)因數(shù)據(jù)幀的抖動(dòng)所產(chǎn)生的特征點(diǎn)追蹤匹配失敗的問(wèn)題,創(chuàng)新提出一種面向視覺(jué)里程計(jì)的光流消抖算法。以一段含有抖動(dòng)幀的視頻數(shù)據(jù)為研究對(duì)象,對(duì)比分析原數(shù)據(jù)與算法處理后的數(shù)據(jù)幀的平均光流,驗(yàn)證該算法的優(yōu)越性,為視覺(jué)SLAM的軟件消抖提供一種新思路。
目前的視覺(jué)里程計(jì)主要采用特征點(diǎn)法估計(jì)相機(jī)運(yùn)動(dòng),如SIFT[9],SURF[10],ORB[11]等。其中ORB(oriented FAST and rotated BRIEF)特征基于FAST特征[12],具有良好的質(zhì)量與性能,主要檢測(cè)局部像素灰度變化明顯的地方,其檢測(cè)過(guò)程為:在圖像中選取像素p,設(shè)其亮度為Ip;以該像素為中心,選取半徑為3的圓上的16個(gè)像素點(diǎn);設(shè)置一個(gè)閾值T,假如選取的圓上有連續(xù)的N個(gè)點(diǎn)的亮度大于Ip+T或Ip-T,那么該像素則為特征點(diǎn)。與FAST不同的是,ORB特征點(diǎn)提取添加尺度和旋轉(zhuǎn)的描述。尺度不變性由構(gòu)建圖像金字塔并在金字塔的每一層上檢測(cè)角點(diǎn)來(lái)實(shí)現(xiàn)。金字塔底層為原始圖像,每往上一層,對(duì)圖像進(jìn)行固定倍率的縮放。在特征匹配算法中,匹配不同層的圖像,從而實(shí)現(xiàn)尺度不變性。在旋轉(zhuǎn)方面[13],計(jì)算特征點(diǎn)附近的圖像灰度質(zhì)心,定義圖像塊B中像素坐標(biāo)為(x,y),則圖像塊的矩mpq為:
(1)
通過(guò)矩進(jìn)一步找到圖像塊的質(zhì)心C:
(2)
連接圖像塊到集合中心O與質(zhì)心C,得到一個(gè)方向向量OC,于是特征點(diǎn)的方向可以定義為公式(3):
θ=arctan(m01/m10)
(3)
通過(guò)以上方法,ORB特征點(diǎn)實(shí)現(xiàn)了尺度和旋轉(zhuǎn)不變性,在后續(xù)匹配過(guò)程中保證了匹配精度。調(diào)用OpenCV中已集成的“暴力匹配”方法對(duì)相鄰幀的特征點(diǎn)進(jìn)行匹配,解決視覺(jué)里程計(jì)中數(shù)據(jù)關(guān)聯(lián)問(wèn)題。
光流(Optical Flow)是一種描述像素隨時(shí)間在圖像之間運(yùn)動(dòng)的方法,隨著時(shí)間量的增加,同一個(gè)像素會(huì)在圖像中移動(dòng)[14]。在視覺(jué)SLAM中,圖像的變化來(lái)自于隨時(shí)間變化的相機(jī)運(yùn)動(dòng)。即圖像可視為時(shí)間的函數(shù):I(t)。當(dāng)t時(shí)刻時(shí),位于(x,y)處的像素的灰度函數(shù)為I(x,y,t)。當(dāng)t+ dt時(shí)刻時(shí),該像素點(diǎn)運(yùn)動(dòng)到(x+ dx,y+ dy),則有公式(4):
I(x+dx,y+dy,t+dt)=I(x,y,t)
(4)
對(duì)(4)式左邊進(jìn)行泰勒展開(kāi),保留一階項(xiàng)得公式(5):
I(x+dx,y+dy,t+dt)≈
(5)
假設(shè)同一個(gè)空間點(diǎn)的像素灰度值,在各個(gè)圖像中是固定不變的,于是下一個(gè)時(shí)刻的灰度等于之前的灰度,化簡(jiǎn)得公式(6):
(6)
其中 dx/dt為像素在x軸上運(yùn)動(dòng)速度,而 dy/dt為y軸速度,分別記為u,v。同時(shí)?I/?x為圖像在該點(diǎn)處x方向的梯度,另一項(xiàng)則是在y方向的梯度,分別記為Ix和Iy。把圖像灰度對(duì)時(shí)間的變化量記為It,寫(xiě)成矩陣形式得:
(7)
在 LK 光流中,假設(shè)一個(gè)大小為w*w的窗口內(nèi)的w2數(shù)量的像素具有同樣的運(yùn)動(dòng),則共有w2個(gè)方程(8):
(8)
記:
(9)
于是(8)式記為:
(10)
方程(10)為一個(gè)關(guān)于u,v的超定性方程,利用最小二乘解得:
(11)
此時(shí)就得到了像素在圖像間的運(yùn)動(dòng)速度u和v。當(dāng)t取離散的時(shí)刻時(shí),可以估計(jì)某塊像素在若干個(gè)圖像中出現(xiàn)的位置。由于像素梯度僅在局部有效,一次迭代不夠好的話,多次迭代此方程,便能更好的獲得像素在若干個(gè)圖像中出現(xiàn)的位置。
通過(guò)獲取相鄰兩幀畫(huà)面的全局光流,即獲取全局特征點(diǎn)的運(yùn)動(dòng)速度u和v,設(shè)分辨率為m*n的相鄰幀畫(huà)面P1和P2的相隔時(shí)間為t,則此時(shí)的光流矩陣Flow為:
(12)
將Flow矩陣轉(zhuǎn)化為m維矩陣Qm:
(13)
根據(jù)相鄰幀P1和P2的Flow矩陣,即可預(yù)測(cè)出后續(xù)的Pn幀,預(yù)測(cè)幀公式為:
Pn=dstack-1(dstack(P2)+
(n-2)Qm),n=3,4,5,…
(14)
相鄰兩幀畫(huà)面的全局特征點(diǎn)的平均光流一定程度上反映了相鄰幀的像素點(diǎn)變化情況,計(jì)算公式(15)如下:
(15)
假設(shè)一組數(shù)據(jù)的幀數(shù)為g,當(dāng)?shù)趆幀與第h+1幀的平均光流滿足公式(16),則判斷出第h+1幀為抖動(dòng)幀,需要進(jìn)行幀預(yù)測(cè)操作。
(16)
基于LK光流原理,計(jì)算全局相鄰數(shù)據(jù)幀的平均光流判斷抖動(dòng)幀位置,相鄰幀消抖過(guò)程框圖如圖1所示??紤]到視覺(jué)里程計(jì)中可能存在的ORB特征點(diǎn)誤匹配的情況,設(shè)定一個(gè)特征點(diǎn)匹配數(shù)量的閾值K,當(dāng)特征點(diǎn)匹配數(shù)量高于此閾值,則認(rèn)定兩幀畫(huà)面為有效相鄰幀,反之為無(wú)效相鄰幀,可初步判斷兩幀畫(huà)面是否為同一條件下拍攝的相鄰幀;根據(jù)相鄰幀的平均光流與全局平均光流的大小比較,得出此第h+1幀是否為抖動(dòng)幀,若是,則由幀預(yù)測(cè)算法預(yù)測(cè)出新的h+1幀,并替換原有抖動(dòng)幀,從而實(shí)現(xiàn)消抖處理。
圖1 消抖流程圖
算法對(duì)一組存在抖動(dòng)的巷道行駛視頻進(jìn)行實(shí)驗(yàn),設(shè)備硬件:GPU為GTX1650Ti,CPU為AMD R7 4800H,由單目攝像頭拍攝的含有抖動(dòng)幀的視頻相關(guān)數(shù)據(jù)如表1所示。
表1 視頻數(shù)據(jù)
對(duì)存在抖動(dòng)的116-118位置幀進(jìn)行消抖處理,實(shí)驗(yàn)結(jié)果如圖2所示。
圖2 116-118位置幀消抖
對(duì)算法處理前后相鄰幀進(jìn)行ORB特征點(diǎn)暴力匹配,ORB特征點(diǎn)匹配數(shù)如表2所示,以117-118位置幀為例,實(shí)驗(yàn)對(duì)比現(xiàn)象如圖3所示。
表2 ORB特征點(diǎn)匹配
(a) 未消抖的117-118幀
從圖3可以發(fā)現(xiàn),未消抖處理的相鄰幀的ORB特征點(diǎn)匹配存在著大量的誤匹配,嚴(yán)重影響后續(xù)視覺(jué)SLAM中的位姿估計(jì)以及局部建圖,而以所提算法處理后的相鄰幀則保持著良好的匹配性能,有效降低抖動(dòng)幀對(duì)視覺(jué)里程計(jì)工作的影響。
進(jìn)一步對(duì)原始數(shù)據(jù)和消抖后數(shù)據(jù)的平均光流進(jìn)行計(jì)算,并分別迭代算法3次、5次、7次和9次,如圖4所示。抖動(dòng)處平均光流減少幅度與耗時(shí)如表3所示。
(a) 迭代3次
表3 消抖分析
從四種迭代方式的圖和表中可以發(fā)現(xiàn):1)抖動(dòng)處的視頻幀的平均光流明顯的高于其他非抖動(dòng)幀的平均光流;2)本算法能夠顯著降低抖動(dòng)幀的平均光流,最高達(dá)到36.80%;3)隨著消抖算法迭代次數(shù)的增加,本算法能夠逐漸降低抖動(dòng)幀的平均光流,同時(shí)滿足了視覺(jué)里程計(jì)工作的實(shí)時(shí)性要求。
視覺(jué)里程計(jì)工作時(shí)因抖動(dòng)產(chǎn)生的特征點(diǎn)追蹤匹配失敗的情況,提出了一種面向視覺(jué)里程計(jì)的光流消抖算法。通過(guò)對(duì)比相鄰幀的平均光流與全局平均光流,判斷出抖動(dòng)位置,并利用光流消抖算法對(duì)抖動(dòng)幀進(jìn)行重新預(yù)測(cè)。對(duì)一組存在抖動(dòng)的視頻幀數(shù)據(jù)進(jìn)行消抖,抖動(dòng)處平均光流最高下降36.80%,實(shí)驗(yàn)結(jié)果表明了該算法對(duì)于存在抖動(dòng)的視頻幀具有良好的消抖能力,并且在ORB特征點(diǎn)暴力匹配時(shí)展現(xiàn)了良好的性能,在視覺(jué)里程計(jì)領(lǐng)域具有一定的適用性。