天天看點

格雷碼結構光(用于立體視覺)原理詳解+結構光編碼實作

最近疫情鬧得厲害,在家看劇看膩了,開始看論文換換腦子。

前段時間在研究格雷碼結構光。但是部落格上講格雷碼原理的文章幾乎沒有。最近看文獻,總結了一下。如果讀者朋友有更好的格雷碼文章,請發給我,不勝感激。

格雷碼結構光(用于立體視覺)原理詳解+結構光編碼實作

一、時域編碼

即編碼一系列的結構光圖案,依次投射到目标物體上。首先需要生成一系列編碼圖案。編碼圖案随着投射時間的推進而變化,并且這一系列的圖案需要全部依次投影,以確定每一個像素對應的碼是唯一的。

時域圖案編碼資訊的方式有很多,常見的包括二進制碼(binary code)和格雷碼(gray code)。兩種方法都需要分别編碼X軸、Y軸方向。

二、二進制碼(Binary Code)

上面說到時域結構光編碼需要對行、列分别進行。對某一個像素點來說,二進制碼即,将該像素點所在的行數m,列數n轉換成二進制,二進制的每一位編碼到每一幅pattern中該像素點對應的位置。(即,m轉換成二進制數,該二進制數最終的位數等于行的pattern數)。以像素點(209,660)為例,其轉換成二進制為(0011010001,1010010100)

該像素點的編碼為:圖表示在一系列的pattern中,該像素點處的值。

格雷碼結構光(用于立體視覺)原理詳解+結構光編碼實作

上面的是以單個像素點舉例,整個pattern系列長什麼樣呢,以分辨率為32*32的投影儀為例,按照上述編碼方式,得到一系列pattern:

格雷碼結構光(用于立體視覺)原理詳解+結構光編碼實作

将以上編碼圖案依次投射到被測物體上,使得每一個像素點最終的碼值都是唯一的。

三、格雷碼(Gray Code)

格雷碼與二進制碼最大的不同是:格雷碼相鄰的兩個像素點的碼值,隻有一位是不同的。以8*8分辨率為例,以列為例:(a)代表二進制碼(b)代表格雷碼

格雷碼結構光(用于立體視覺)原理詳解+結構光編碼實作
格雷碼結構光(用于立體視覺)原理詳解+結構光編碼實作

格雷碼可以通過下述方法得到:首先通過之前的辦法得到二進制碼,後根據下圖的異或運算得到:

格雷碼結構光(用于立體視覺)原理詳解+結構光編碼實作

格雷碼相對于二進制碼的優勢在于:在最後的pattern中,二進制碼的最大頻率(或者說是最小顔色變化間隔)是每一個像素,而格雷碼的頻率是每兩個像素,我們希望最大頻率時,最小顔色變化間隔盡可能大一些,這對投影和采圖都是有好處的。

四、雙目比對

本文以介紹格雷碼為主,故不在此詳細講述雙目原理。
           

比對原則:根據雙目視差法,找到左右目拍攝到的同一個點,即可獲得深度資訊。

我們通過投射結構光,對于每一個投影儀像素點,其最終的碼值是唯一的。這便使得雙目比對成為可能。

格雷碼結構光(用于立體視覺)原理詳解+結構光編碼實作

五、結構光解碼

投影儀編碼結構光,使得每個像素具有獨特的碼值,兩相機拍攝,需要解碼,确定每個像素的資訊,進而完成比對。

解碼是編碼的逆序。包括三步:

  1. 根據灰階值得到目前像素點的格雷碼;
               
  2. 格雷碼轉換成二進制碼;
               
  3. 二進制碼轉換成十進制碼(即目前像素所在的行數或者列數)。
               

六、結構光編碼實驗

投影儀分辨率:2014*768

NpatternsCol=ceilf(log1024/log2)=10;

NpatternsRow=ceilf(log768/log2)=10;

水準、垂直各生成十張pattern。

其中pattern0、pattern1是全黑、全白,用作參考

格雷碼結構光(用于立體視覺)原理詳解+結構光編碼實作
格雷碼結構光(用于立體視覺)原理詳解+結構光編碼實作

繼續閱讀