葛雯斐,牛小驥,蔣郡祥,吳宜斌
(武漢大學衛星導航定位技術研究中心,武漢 430079)
隨著城市的發展和建設,建筑物越來越多,建筑物的室內環境也越來越復雜。由于人們的工作和生活的大部分時間是在室內環境中度過,因此人們對室內位置服務有著非常迫切的需求。目前主流的室內定位技術主要是基于藍牙[1]、WiFi[2]、UWB[3]、地磁[4]、Zigbee[5]、和視覺[6]等方式。每種定位技術都有各自的優缺點,加之成本、技術復雜性等因素,室內定位技術并沒有在國內得到廣泛應用[7]。
受益于智能手機的普及,相機作為智能手機的基礎傳感器,為視覺定位的發展提供了硬件基礎。同時,由于用二維碼作為視覺標志物具有成本低、易于布設、可靠性高等特點,在目前的技術條件下,采用二維碼作為視覺標志物進行室內定位成為了研究的熱點。
在應用二維碼作為視覺標志物的研究中,文獻[8-10]在QR Code內儲存位置等信息,用戶通過移動設備掃碼得到QR Code的位置等信息之后直接用于導航、規劃等,沒有進一步解算拍攝設備的位置和姿態。文獻[11]將QR Code作為視覺標志物應用于機器人的室內定位中,文獻[12]將2D Bar Codes應用在機器人室內定位中。QR Code和2D Bar Codes均為日常生活中廣泛使用的二維碼類型,在機器人應用場景中,干擾二維碼較少;但是在行人通過智能手機進行室內定位的場景中,如地下車庫,大型商場等,環境中存在較多QR Code和2D Bar Codes等類型的二維碼,將會對定位造成干擾。文獻[13]使用AR tag標記碼輔助機器人進行視覺SLAM定位,文獻[14]設計了一種張貼在天花板上的二維碼標志物用于機器人的室內定位,但是這兩種碼都只有一種編碼模式,其數據儲存單元的大小固定,無法應對拍攝距離差異大的場景。
行人通過智能手機相機拍攝得到的包含二維碼路標在內的圖像由于受到距離、角度、光線、雜亂背景等情況的干擾,如何確定圖像中二維碼的位置是后續解碼和定位定姿解算的關鍵。文獻[15]根據二維碼中符合深色-淺色-深色-淺色-深色相應元素所占的比例為1∶1∶3∶1∶1的規律檢測出二維碼定位符點的位置,從而確定二維碼在圖像中的位置。但是當拍攝到的二維碼圖像有較大的形變時,該比例關系被破壞,檢測失誤率較高。文獻[16]提出一種基于邊緣增強的二維碼區域快速檢測定位算法,對工業中的二維碼區域能夠快速檢測。文獻[17]利用卷積神經網絡進行二維碼的檢測,該方法可以應對復雜的環境,但是由于神經網絡參數多,計算量大,不適合智能手機平臺。文獻[18-19]在研究中使用Zxing庫實現二維碼的生成和檢測,Zxing是由Google開源并持續維護的1D/2D條碼處理庫,是目前應用最廣泛的二維碼開源類庫之一,在很多研究中被作為工具進行擴展和使用。由于Zxing庫主要是在產品識別、工業生產等領域用來讀取信息,它的主要應用場景具有拍攝距離較近,拍攝角度變化范圍較小等特點,因此并不適用于手機用戶進行室內定位這種拍攝距離和角度變化都較大的場景。
據此,本文設計一種專門用于定位定姿的二維碼路標,該二維碼路標具有粗碼、細碼兩種編碼結構,與現有的二維碼具有很強的區分度,且具有易于識別、工作距離遠、范圍廣等特點。同時針對該二維碼路標提出一種檢測算法,能夠穩健、準確地從圖像中檢測到二維碼路標。檢測到二維碼路標后,提取二維碼頂點的圖像坐標并解碼獲得頂點對應的世界坐標,利用EPnP算法[20]解算手機相機中心的位置和姿態。
本文設計一種專門用于定位定姿的二維碼路標,如圖1所示,二維碼路標為正方形,由隔離區、標志區、數據區三部分組成,其中,數據區由粗碼和細碼兩種編碼結構組成。

圖1 二維碼路標
隔離區:由于二維碼多布設在淺色墻面等環境中,因此設置黑色隔離區用于將二維碼路標與環境區分開,便于二維碼的檢測。
標志區:標志區由圖1中所示左上角標志區、右上角標志區、右下角標志區、左下角標志區四個正方形區域組成,用來區分二維碼路標的上下左右方向,便于在環境中檢測到二維碼之后將二維碼旋轉到正確的方向進行解碼。
粗碼:在數據區內,有一些較大的黑白格,如圖1中綠色格網框出的12個區域。黑色方塊表示二進制0,白色方塊表示二進制1,圖1中所示二維碼路標的粗碼的編碼內容用二進制表示為010011010010,即10進制數字1234。粗碼用于儲存該二維碼路標在編碼庫中對應的編號。在實際使用時,算法先根據用戶的粗略位置查找對應的編碼庫,在每一個編碼庫中,粗碼的編號對應此二維碼路標的四個頂點的實際位置等信息。
細碼:在每一個粗碼方塊內,有5×5共25個小的黑白方塊,12個粗碼格子內一共300個小方格。黑色小方格表示二進制0,白色表示1,細碼內直接儲存該二維碼路標中心點的位置、姿態以及該正方形二維碼路標的實際寬度,單位為m。
該二維碼路標作為專門用于定位定姿的視覺標志物具有以下優勢:①具有獨立的編碼和解碼機制,與生活中其他功能的二維碼具有很強的區分性,用戶能夠輕松從環境中辨識出該二維碼路標,并用于定位定姿。②具有粗碼和細碼兩種編碼結構,細碼儲存定位定姿所需的所有信息,包括二維碼路標中心點的位置、二維碼路標的姿態及其實際寬度。當用戶的拍攝距離不是很遠的情況下,可以直接正確解碼細碼得到這些定位信息。而當拍攝距離較遠時,如圖2所示,由于攝像頭的分辨率有限,此時細碼已經無法正確解碼。因此,在細碼工作的基礎上,本文設計的二維碼路標中引入粗碼的設計:粗碼對應較大的黑白格,當拍攝距離較遠時,依然能夠對粗碼進行正確解碼,進一步從編碼庫中獲取二維碼路標對應的位置信息,為后續的定位服務。

拍攝設備:三星S6;二維碼路標尺寸:20 cm×20 cm圖2 拍攝距離為10 m時依然能夠依靠粗碼進行正確解碼
對于布設了二維碼路標的室內場景,為了保障用戶體驗,不應該對用戶的拍攝行為有過多要求,如走過去近距離掃一掃或者必須端正手機拍攝等。理想的情況下,用戶在任意距離、以任意角度拍攝一張包含二維碼路標的環境圖像,均可以獲取到定位定姿結果。

圖3 二維碼路標正常拍攝角度范圍
經過分析,在室內環境中,受空間大小、相機分辨率等因素限制,對于張貼在墻面上的二維碼路標,用戶拍攝二維碼的距離一般在8 m以內。記垂直拍攝角度為0°,用戶拍攝二維碼的角度范圍一般在[-75°,75°]內,如圖3所示。本文實驗采用的二維碼路標的尺寸為20 cm×20 cm,當拍攝距離超過8 m或者拍攝角度超出[-75°,75°]時得到的二維碼路標在圖像中過小或者形變過于劇烈,不再適合用于定位定姿解算,予以舍棄。
由于非垂直拍攝的情況下拍攝得到的二維碼路標不再是正方形,同時由于拍攝者的高度差異、拍攝時相機的旋轉、相機畸變等問題,智能手機拍攝得到的二維碼路標在圖像中對應的區域會發生拉伸、扭曲等變化,如圖4所示。

圖4 拍攝得到的二維碼路標發生了拉伸和扭曲
針對用二維碼路標進行智能手機定位定姿的應用,成功從圖像中檢測到二維碼路標是實現定位定姿的前提。上述分析表明,在不同的拍攝條件下二維碼路標在圖像中的大小、形狀、位置等會發生較大的變化,增加了在圖像中檢測二維碼路標的位置的難度。本文結合所設計的二維碼路標的特點以及拍攝范圍的限制,提出一種穩健的二維碼路標檢測算法,以滿足智能手機定位定姿需求。算法主要包括以下兩個步驟:①對獲取的圖像進行預處理,簡化并保留圖像中的有效信息,降低后續處理復雜度;②通過輪廓檢測將圖像劃分為不同的候選區,結合二維碼路標的特點以及拍攝范圍的限制對候選區進行篩選,保留二維碼路標所在的候選區并提取其頂點的圖像坐標,確定二維碼路標在圖像中的精確位置。
二維碼路標檢測算法的算法流程如圖5所示。

圖5 二維碼路標檢測算法流程圖
首先對輸入的含有二維碼路標的圖像進行預處理,依次對圖像進行灰度化、直方圖均衡化、 圖像二值化、Canny算子[21]邊緣檢測、圖像形態學運算,預處理在簡化圖像的同時改善圖像的質量,使圖像更有利于后續二維碼路標的檢測。預處理前后圖像對比如圖6所示。

圖6 圖像預處理前后對比
確定二維碼路標在圖像中精確位置就是獲得圖像中每一個二維碼路標的四個頂點的圖像坐標。由于拍攝距離和角度等的變化使得二維碼路標在圖像中的大小、位置、形狀都會發生變化,同時,圖像中的一些環境物體也會對二維碼路標的搜索造成干擾。由于二維碼路標的外形設計為正方形,其內部是由黑白結構編碼組成且編碼規則已知,因此在圖3所示的拍攝距離小于8 m、拍攝角度范圍[-75°,75°]的情況下,利用二維碼路標在圖像中可能呈現的大小、形狀等信息對二維碼路標所在的區域與其他干擾進行區分,最終確定二維碼路標在圖像中的位置。基于上述條件,獲取每一個二維碼路標的四個頂點的圖像坐標主要步驟為:
(1)劃分候選區:首先對預處理之后的圖像進行輪廓檢測,輪廓檢測利用OpenCV中的FindContours函數完成,將不同連通域的外輪廓提取出來,從而將圖像中的連通域劃分為不同的候選區。此時獲得的候選區集合表示為L_all,二維碼所在候選區的集合表示為L_code,L_code?L_all,同時可能會得到很多干擾候選區,其集合表示為L_other,L_other?L_all,且L_all=L_code∪L_other。
相機的內參矩陣為:
(1)
基于以上條件,得到二維碼路標在圖像中的大致寬度width和高度height范圍,單位為像素:
(2)
寬高比的范圍:
(3)
由于二維碼拍攝不全時無法進行解碼,因此,當某一候選區與圖像邊緣相交時,認為該候選區內即使包含二維碼路標,也無法用于后續處理,予以剔除。
將大小不符合要求、寬高比不符合要求、與圖像邊緣有交點的候選區剔除,完成第一輪篩選。將該輪篩選留下的候選區集合記為L_(round_1),如圖7所示。

圖7 第一輪篩選前后對比
雖然智能手機拍攝得到的二維碼路標在圖像中對應的區域會發生拉伸、扭曲等變化,但是其形狀依然近似四邊形,利用這一特征可以進一步剔除一些干擾區域。具體的做法為:計算每個候選區的最小面積外接矩形(Minimum Area Bounding Rectangle,MABR)。在正常拍攝角度范圍內,二維碼路標所在的候選區的面積與其最小面積外接矩形的面積的比值大于0.5,因此剔除候選區面積和它的MABR的面積的比值小于0.5的候選區,完成第二輪篩選。將該輪篩選留下的候選區集合記為L_(round_2)。圖8為圖7(b)中的四個候選區的MABR,其中(a)、(c)、(d)為三個干擾候選區及其MABR,(b)為二維碼路標所在的候選區及其MABR。

圖8 4個不同候選區的MABR
(3)確定二維碼路標的精確位置:通過上一步的兩輪篩選,僅留下少量候選區,從候選區集合L_(round_2)中取出一個候選區,假設該候選區是二維碼所在的候選區,尋找該區域的四個頂點。具體的做法為:
依次計算該候選區外輪廓上距離下面四條直線最近的點:①過圖像左上角點(0,0)且斜率為-1的直線;②過圖像右上角點(m,0)且斜率為1的直線;③過圖像右下角點(m,n)且斜率為-1的直線;④過圖像左下角點(0,n)且斜率為1的直線。
1.4 統計學方法 采用SPSS 22.0統計學軟件對數據進行處理。計量資料以均數±標準差表示,組間比較采用t檢驗;計數資料以例(百分率)表示,組間比較采用χ2檢驗。以P<0.05為差異有統計學意義。
一般情況下,依次得到的四個點就是該候選區的四個頂點,如圖9(a)所示。但是一些特殊情況下,如候選區的外輪廓的某條邊平行于上述四條直線之一時,此時并不能得到候選區真正的頂點,如圖9(b)所示。
判斷得到的四個點是否為候選區真實頂點的原則為:當計算得到的四個點是候選區真正頂點的情況下,由該四個點為頂點構成的四邊形的面積與候選區的面積的比值接近于1;當計算得到的四個點不是候選區真正頂點時,由該四個點為頂點構成的四邊形的面積與候選區的面積的比值顯著小于1,以此判斷頂點提取失敗。此時繼續分別計算候選區外輪廓上距離圖像上邊沿、右邊沿、下邊沿、左邊沿最近的四個點作為候選區的頂點,如圖9中(c)。

圖9 提取候選區頂點

圖10 將候選區投影變換為正方形
得到候選區的四個頂點之后,將其進行投影變換轉為正方形,如圖10所示。由于二維碼路標內部的編碼規則已知,根據轉換為正方形的區域內部的像素分布是否符合二維碼路標編碼規則判斷該區域是否為二維碼路標區域,將不是二維碼路標的候選區剔除。
經過該輪篩選得到的候選區集合為L_(round_3),由于拍攝得到的照片中可能不止一個二維碼路標,此時獲得了L_(round_3)中每一個二維碼路標所在的候選區的頂點的圖像坐標,即確定了每一個二維碼路標在圖像中的精確位置。
根據二維碼路標粗碼、細碼的編碼規則,對上一步驟獲得的每一個二維碼路標進行解碼獲得該二維碼路標四個頂點在世界坐標系下的三維坐標,與其在圖像坐標系的像素坐標形成4對3D-2D坐標點對。當檢測到N個二維碼路標時,一共可以獲得4N個3D-2D坐標點對。
對于三維物點和二維圖像點之間的對應關系已知的情況,位姿估計經常被稱為n點透視(PnP)問題[23]。PnP問題有很多種求解方法,如用三對點估計位姿的P3P[24]、直接線性變換(DLT)、EPnP(Efficient PnP)、UPnP[25]等。其中EPnP作為目前公認的最高效的解析算法,得到了廣泛的應用。同時,當圖像點被精確提取時,EPnP的計算精度很高。因此本文采用EPnP算法進行相機位姿的解算。
由于二維碼的設計與其檢測算法緊密相關,無法用其他算法檢測本文設計的二維碼路標,也無法用本文的檢測算法檢測其他類型的二維碼,因此,為了驗證本文設計的二維碼路標及其檢測算法的性能,將其與Zxing庫檢測QR Code的性能進行對比。實驗中使用的Zxing庫版本為3.4.0。
設計并實施以下實驗:
實驗平臺:Inter? CoreTMi5-7200 CPU,主頻:2.50 GHz,內存:8.00 GB;

圖11 實驗環境
圖像采集設備:三星s6智能手機(分辨率5 312×2 988像素,相機內參由張正友標定法標定);
其他設備:全站儀(GEOMAX ZT20Pro系列無棱鏡型全站儀)、激光測距儀、量角器、皮尺、三腳架等。
二維碼尺寸:20 cm×20 cm,張貼于白色泡沫板上并固定在三腳架上;
實驗環境:由于室內場地限制,實驗現場環境如圖11所示,實驗前將手機、二維碼、全站儀均用三腳架固定。為了更加直觀,將世界坐標系原點建立在二維碼路標中心點,世界坐標系W系,相機坐標系C系如圖12所示。

圖12 世界坐標系(W系)和相機坐標系(C系)示意圖
實驗1 如圖13所示,借助激光測距儀和量角器,使手機相機大致在0°、30°、45°、60°、75°方向上依次在距離二維碼中心1,2,3,…,8 m位置處采集圖像,每個位置采集5張圖像,二維碼路標和QR Code分別采集200張圖像。在每個位置用全站儀測量出手機相機在世界坐標系下的真實位置和姿態。

圖13 實驗一示意圖

圖14 實驗二示意圖
實驗2 如圖14所示,將手機相機放置在0°方向上,手機繞Z軸依次逆時針旋轉0°、15°、30°、45°,在距離二維碼中心1,2,3,…,8 m位置處采集圖像,
每個位置采集5張圖像,二維碼路標和QR Code分別采集160張圖像,在每個位置用全站儀測量出手機相機在世界坐標系下的真實位置和姿態。
實驗一模擬實際應用中在不同距離、不同角度拍攝對算法性能的影響;實驗二模擬在實際使用中由于相機繞Z軸旋轉對算法性能的影響。用本文算法處理采集到的二維碼路標圖像,用Zxing庫處理得到的QR Code圖像,統計兩種算法在不同拍攝條件下對二維碼的檢測準確率情況,實驗結果如表1所示。

表1 Zxing庫和本文算法在不同拍攝條件下對二維碼的檢測準確率情況對比
該結果表明,在拍攝距離小于8 m、拍攝角度范圍[-75°,75°]、拍攝時相機發生旋轉的情況下,本文設計的二維碼路標都能夠正常工作,二維碼路標檢測算法能夠準確地檢測到二維碼路標,檢測準確率100%。而Zxing庫對QR Code的檢測在拍攝距離大于5 m時檢測成功率為0;當拍攝時發生傾斜或者旋轉時,也會大幅度降低解碼成功率。實驗一和實驗二中Zxing庫對QR Code的檢測準確率為48.5%。因此,相比于Zxing解碼庫,本文設計的二維碼路標以及檢測算法的工作范圍更廣、識別的準確率更高,滿足手機用戶室內定位的需求。
PnP問題的解算精度與點對個數、特征點的圖像坐標精度、特征點之間的幾何條件、PnP算法的性能等因素有關。對于實驗中采用的20 cm×20 cm的單個二維碼,共得到4對3D-2D點對,圖15顯示不同拍攝條件下由該位置拍攝得到的圖像用EPnP算法解算得到的相機位置和姿態與真實位置和姿態的差值的絕對值。實驗結果表明,拍攝距離小于6 m、拍攝角度小于60°的情況下,利用該方法可以得到 1 m 以內的位置誤差,10°以內的姿態誤差;當拍攝角度大于60°,拍攝距離大于6 m時,位置誤差和姿態誤差明顯增大。同時,手機繞Z軸旋轉對定位定姿性能幾乎沒有影響。

圖15 不同拍攝條件下利用單張二維碼進行智能手機定位定姿的精度
本文設計了一種專門用于定位定姿的二維碼路標,該二維碼路標具有粗碼、細碼兩種編碼結構,具有易于識別、工作距離遠、范圍廣等特點。同時,提出一種二維碼路標檢測算法,能夠穩健、準確地從圖像中檢測到二維碼路標。最后,利用二維碼頂點的圖像坐標及其世界坐標,使用EPnP算法解算手機相機中心的位置和姿態。實驗結果表明,對于張貼在淺色背景中且無遮擋的二維碼路標,在拍攝距離小于8 m、拍攝角度范圍[-75°,75°]以內且拍攝時相機發生一定程度旋轉的情況下,本文設計的二維碼路標都能夠正常工作,二維碼路標檢測算法能夠準確地檢測到二維碼路標。因此該方法符合手機用戶室內定位的需求,具有很高的實用價值。