天天看點

基于格雷碼+相移方案的結構光重建解析

由于前段時間一直處在算法的應用開發階段,長時間将心思花在硬體選型、原型機設計、原型機搭建和聯調等上面,沒有抽足夠的時間來記錄相關算法的開發經曆,年底特更新一篇有關格雷碼+相移方案的三維重建算法,該文章依據相應論文,對格雷碼+相移方案的整個重建進行了較為詳細的闡述,并融入了自己對該套方案的看法,便于廣大的同仁一起研讨,文章中如有不妥之處,也請指正。

整個文章将以雙目結構光為基礎,内容包括以下幾個部分:

0.格雷碼+相移基本原理;

1.雙目相機的标定;

2.圖像校正;

3.圖像解碼;

4.圖像解包;

5.比對點計算;

6.三角計算;

7.該方案相關問題分析。

其中,針對 格雷碼+相移基本原理 做詳細介紹。

注意,雙目的格雷碼+相移方案中囊括不同的類型,例如,水準和垂直投影的雙路格雷碼+相移方案,僅水準投影或者垂直投影的格雷碼+相移方案。不同的類型,在比對點計算和三角計算方案稍有不同,但是萬變不離其宗,都是得到唯一确定的絕對相位,并依據比對法則,建立比對點對,最後計算空間三維點坐标。該文章讨論垂直投影(條紋光栅垂直)的雙目格雷碼+相移方案。

-------------------------------------------------------

0.格雷碼+相移基本原理

格雷碼+相移方案是結合了傳統格雷碼方案和光栅相移方案,将解碼和解包統一成解包(解絕對相位)。其中,格雷碼條紋主要是确定主相位,相移光栅主要是确定包裹相位,最後将二者組合在一起就完成了整個相位解包(全局絕對相位)。

該方案的一個關鍵問題是如何确定格雷碼位數和相移的周期。一般地,先确定正整數級的格雷碼位數,然後結合pattern的大小,确定相移周期的大小,至于為啥要這樣操作,下面将進行詳細闡述。

在闡述之前,先說一下傳統的格雷碼方案(該方案簡潔、直覺,便于了解),若投影儀的分辨率是1024*768,那麼如要對投影儀每個像素點鏡唯一編碼,需要1024個不同的編碼值,10bit的編碼剛好是pow(2,10)=1024,這樣每個像素點的編碼值确定後,就可以直接進行後續的比對計算,但是10bit的格雷碼需要10張的pattern,高頻pattern中編碼條紋極細,相機在捕獲投射的條紋時,極易受噪聲影響,後續解碼極易出現解碼錯誤,影響最終的重建效果!

格雷碼+相移的方案,在純格雷碼的基礎上,摒棄了高頻的pattern,取而代之的是浮點型的相移pattern,這樣做一方面,提高了pattern捕獲的穩定性,另外在一定程度上減少了pattern張數。

當然,格雷碼+相移的解相位(格雷碼解碼值可以通過*2PI轉化成相位值)跟純格雷碼解碼值是一樣的,也需要确定唯一性!這樣,如何讓該套方案能夠完成唯一性咧?這是該方案設計的核心點!通常來講,摒棄高頻段的格雷碼是無法完成整個圖像的唯一編解碼的,這樣就需要用到相移法。另外可知,相移pattern是周期性的,單頻的解相位,解出的相位是包裹相位(也是周期性),也無法得到唯一解相位。但是,将兩者合理地結合在一起,就可以完美地解決唯一性問題。

例如,投影儀的分辨率是1024*768,編碼數量需要不少于1024,如采用6格雷碼+4相移方案(pattern如下圖,pattern是1140*912大小)。格雷碼部分,pow(2,6)=64,這樣,僅通過格雷碼解碼可以确定64個不同的編碼區域(0~63),遠遠不能滿足1024個解碼問題!推想之,如能在格雷碼的不同區域内再細分編碼,那麼就可以得到不同的編碼值。當然,編碼值都是整數,無法再進行細分!但是,可以将整數範圍統一到浮點範圍,剛好相位法的解包是浮點型!現在問題已經非常明朗了,如何橋接格雷碼和相移成了下一步的關鍵。

以下是格雷碼端pattern

基于格雷碼+相移方案的結構光重建解析

以下是相移端pattern

基于格雷碼+相移方案的結構光重建解析

通過對相移法的學習(如不清楚,可先學習相關内容,此處不做介紹)可知,解相位的範圍是-PI~PI,周期是2PI。這樣,對格雷碼解碼區放大2PI,再加上相移的解相位值,即 N*2PI+(-PI~PI),其中N=0,1,2,...,63,就可以順利完成相位唯一性問題了!接下來就是相移參數(相移周期)的确定。

已經确定了格雷碼+相移是可行的,且确定了格雷碼的位數(該處選取格雷碼位數是6,當然可取其它值)。相移的周期隻需要在不少于一個格雷碼區域内滿足唯一性就行,如剛好在一個周期内,那麼相移的周期T就是格雷碼一個編碼區域内的像素數量。還是針對上述說的1024*768的分辨率,如采用 6格雷碼+4相移的方案,格雷碼的編碼區域數量是pow(2,6)=64,那麼每個區域内像素數量就是num=1024/64=16,也就是相移周期T>=16就行,這樣就可以設計好相移參數。為何這樣就可以完成唯一性問題咧?請看以下圖表:

基于格雷碼+相移方案的結構光重建解析

第一行是格雷碼在相位範疇的數值,第2到4行分别是T<num,T=num,T>num的三種情況(T是相移周期,num是格雷碼一個解碼區域内的像素數量)。可知,當T<num時,解包相位出現了重疊,無法完成相位唯一性!當T>=num時,就可以完成相位唯一性!特别說明,絕對相位都需要加上第一行的值。

到此,完成了相位唯一性問題!但是還有個小問題需要說明,通過上述的方法,投影垂直條紋僅僅确定了水準走向的相位唯一性,可是每列的解相位值卻都是一樣的,沒有完成唯一性!針對這個問題,有兩種解決方案,一種是再追加投影水準條紋,解決垂直走向的相位唯一性問題,這樣通過交叉定位,就可以完美解決整圖的位置;另一種是結合對極幾何極線限制,對圖像進行校正,達到行對齊,這樣後面僅通過行内比對就可以确定位置了!該文章所闡述的是采用第二種方案,僅投影一路,後續對圖像進行校正。

-------------------------------------------------------

1.雙目相機的标定

雙目相機的标定十分簡單,通過投射不同方位的圖檔,解算兩個相機之間的相對位置關系,以及各自的内部參數。在這裡,特别要注意的是,在立體标定完成後,需要對圖像進行校正,得到校正後的投影矩陣和深度映射矩陣,便于在應用端對采集的目标圖像進行校正操作。

标定對後面的三維重建至關重要!在标定前,要确定好相機鏡頭的畸變類型,一般普通的鏡頭都是以徑向畸變為主,最好不要忽視切向畸變,為此鏡頭畸變參數可确定為k1 k2 p1 p2 k3,k1 k2 k3表示徑向畸變系數,p1 p2表示切向畸變系數(鏡頭畸變補償公式請參見相關文獻,此處不做介紹)。此外,為了提高标定精度,一般需要從多個視角位置捕獲标靶圖像(有關論文驗證,擺放次數在10~20次為宜),且最好讓标靶上特征能夠布局在整個視場範圍。一個不成文的規定,一般标定的重投影在0.1pixel以下表示标定精度尚可,若标定的重投影過大,請檢查标定模型,标靶布局,以及标靶精度等。

-------------------------------------------------------

2.圖像校正

針對一路投影方式,由于無法确定另一個方向的解相位情況,是以需要對圖像進行校正,以便達到行對齊。

圖像的校正嚴格來說,分為兩個方面:一個是畸變的矯正,另一個是圖像方位的校正。校正後的圖像光軸是平行的,如下圖所示:

基于格雷碼+相移方案的結構光重建解析

圖像校正可以按照以下流程:

a.根據相機的内外參數,建立校正查找映射表LUT;

b.利用LUT,對原始的圖像進行校正(裡面涉及到插值)。

上述流程涉及到了兩大内容:共面和行對齊。

共面是實作圖像平面處在一個平面内(此時未能行對齊),具體做法是将相機旋轉矩陣R劃分為左右相機的合成矩陣

基于格雷碼+相移方案的結構光重建解析

基于格雷碼+相移方案的結構光重建解析

;行對齊是建立對準矩陣

基于格雷碼+相移方案的結構光重建解析

将圖像極點轉化到無窮遠處,以便達到行對齊。具體公式如下:

基于格雷碼+相移方案的結構光重建解析

,其中

基于格雷碼+相移方案的結構光重建解析

是與平移向量T同方向的極點,

基于格雷碼+相移方案的結構光重建解析

基于格雷碼+相移方案的結構光重建解析

為圖像平面方向的向量;

基于格雷碼+相移方案的結構光重建解析

是垂直于

基于格雷碼+相移方案的結構光重建解析

基于格雷碼+相移方案的結構光重建解析

所在平面的向量。

左右相機的行對準轉換矩陣

基于格雷碼+相移方案的結構光重建解析

基于格雷碼+相移方案的結構光重建解析

圖像校正後,後續的圖像比對點搜尋就可以限制在一維行内進行,大大提高了比對效率。

後續提高的圖像操作,均是校正後的圖像。

-------------------------------------------------------

3.圖像解碼

這個提到的解碼指的是格雷碼的解碼,無論是多少位的格雷碼,采用異或的方式對所有相鄰格雷碼圖像進行處理,最後将所有的異或結果擴大相應的2的位數幂次方後求和得到一個總體的解碼值。

這裡需要注意的是首先要對圖像進行二值化,二值化的門檻值可根據實際情況標明(該門檻值不十分敏感,對于灰階圖一般取100即可)。例如,6格雷碼中對應位置的二值化結果是 0 1 1 1 0 0,異或後的結果為0 1 0 0 1 0,最後的解碼值應該是 0*32+1*16+1*8+1*4+0*2+0*1=28,該值亦是解碼區域的編号(0 1 2 ... 63),後續結合相移結果得到解包相位時,需要對此值擴大2PI(轉化到相位弧度範疇)。當然這裡的解碼方式并不是唯一的,隻要可以區分不同編碼區域即可。

-------------------------------------------------------

4.圖像解包

圖像解包主要有兩個步驟:首先是相移圖像的包裹相位計算,針對4相移方式,包裹相位計算公式為:

基于格雷碼+相移方案的結構光重建解析

,該公式的計算結果在-PI~PI範圍内,當然可以加上PI,轉化至0~2PI範圍;然後加上圖像解碼中得到的相位值(解碼值擴大2PI)。例如,某處解碼值是2,包裹相位是PI/3,那麼該處最終的解包相位是2*2PI+PI/3。

這樣,就完成了整個圖像的解相位操作,可以從解包相位圖上看出,每一行中不同位置的相位值均不相同(理論情況下),後續的對應點比對搜尋将以相位值為基礎進行。

-------------------------------------------------------

5.比對點計算

得到全局解包相位後,就可以行周遊,搜尋比對滿足門檻值的比對點。相位比對搜尋所用到的門檻值對比對效果較為敏感!在實際操作過程中,最好通過多組實驗确定不同測量距離,不同相機分辨率下該門檻值的大小。一般地,如果得到的比對點對極少,可适當增大門檻值,如果得到的比對點對非常多,且比對效果極差,可适當減小門檻值。

比對點計算部分比較耗時,可以考慮使用較為高效的比對算法,并進行高并行計算。

-------------------------------------------------------

6.三角計算

三角計算即根據比對點對,以及相機的位置關系等反向求解同名點(比對點對)在空間中的位置坐标。針對校正後圖像的三角計算,可以根據視差計算,因為校正後圖像的行是對齊的,圖像在垂直方向上沒有視差,僅僅隻有水準方向的位置移動。

以下提供兩種方式進行三角計算,一種是根據左右相機的投影矩陣,另一種是根據左右相機之間的深度映射矩陣。

根據左右相機的投影矩陣進行計算過程稍微複雜,其主要流程如下:

a.利用比對點和投影矩陣,計算4*4的中間方陣A(如下圖);

b.利用SVD對中間方陣A進行奇異值分解;

c.奇異值分解後的V向量的最後一行即為4維的空間點齊次坐标;

d.對4維齊次坐标進行歸一化處理,得到最終的3維空間點坐标。

對于通過上述操作為何就可以得到三維點空間坐标,可自行查詢相關的文獻資料,此處不做介紹。

基于格雷碼+相移方案的結構光重建解析

其中,

基于格雷碼+相移方案的結構光重建解析

是相機的投影矩陣,

基于格雷碼+相移方案的結構光重建解析

是一對比對點。

SVD分解:

基于格雷碼+相移方案的結構光重建解析

,V即為4維齊次坐标,最終的三維坐标即為:

基于格雷碼+相移方案的結構光重建解析

根據左右相機之間的深度映射矩陣來計算三維點較為簡單,例如在标定過程中立體校正得到的映射矩陣為Q,那麼其主要計算過程如下:

基于格雷碼+相移方案的結構光重建解析
基于格雷碼+相移方案的結構光重建解析

對此,整個重建計算完成,當然,也可以根據比對點位置,為每個三維點添加紋理資訊(需要彩色相機)。

-------------------------------------------------------

7.該方案相關問題分析

從上述描述可以看出,基于格雷碼+相移方案的結構光三維重建過程并不難,但是,想要得到高精度、高穩定性、高效率的三維重建效果,優化的地方還是很多,需要花費不少的功夫!

通過對該套方案的解讀,不難看出該方案的重建仍然是建立在像素級上的!因為比對點對始終是像素級的比對,在一定程度上提高相機的分辨率可以提高重建精度,但是過分提高相機分辨率會導緻相位過于細化,這樣,當整個系統的噪聲較大時,細化的相位會與噪聲交織在一起,大大降低重建效果!

另外,該方案仍然是基于立體比對的三維重建方式,其中有關點對比對計算和三角計算過程較為耗時,該方案很難做到實時處理!若想達到實時處理(每秒可以完成10個甚至更多場景的三維重建),一般要采用基于相位—高度映射的三維重建方式,目前較好的方式是單頻3相移結構光方案,該方案僅需要投射3幅相移圖像,然後利用相位—高度映射算法對解算的相位進行高度轉化,同時結合标定參數,通過LUT計算不同位置的三維坐标。

-------------------------------------------------------

繼續閱讀