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

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

整個文章將以雙目結構光爲基礎,內容包括以下幾個部分:

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劃分爲左右相機的合成矩陣r_{l}r_{r};行對齊是建立對準矩陣R_{rect}將圖像極點轉化到無窮遠處,以便達到行對齊。具體公式如下:

r_{l}=R^{1/2},r_{r}=R^{-1/2},R_{rect}=[e_{1}\, e_{2}\: e_{3}]^{T},其中e_{1}=T/\left \| T \right \|是與平移向量T同方向的極點,T=[T_{x}\,T_{y}\,T_{z}]^{T}e_{2}=[-T_{y}\, T_{x}\,0]^{T}/\sqrt{T^{2}_{x}+T^{2}_{y}}爲圖像平面方向的向量;e_{3}=e_{1}\times e_{2}是垂直於e_{1}e_{2}所在平面的向量。

左右相機的行對準轉換矩陣R_{l}=R_{rect}*r_{l}R_{r}=R_{rect}*r_{r}

圖像校正後,後續的圖像匹配點搜索就可以限制在一維行內進行,大大提高了匹配效率。

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

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

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相移方式,包裹相位計算公式爲:\varphi =atan2(I_{4}(x,y)-I_2(x,y),I_3(x,y)-I_1(x,y)),該公式的計算結果在-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維空間點座標。

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

其中,M_1\,M_2是相機的投影矩陣,(x_1,y_1)\,(x_2,y_2)是一對匹配點。

SVD分解:U\Sigma V^T=A,V即爲4維齊次座標,最終的三維座標即爲:[X \,Y \,Z]=[V_{3,0}/V_{3,3}\,V_{3,1}/V_{3,3}\,V_{3,2}/V_{3,3}]

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

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

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

7.該方案相關問題分析

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

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

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

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章