最近疫情鬧得厲害,在家看劇看膩了,開始看論文換換腦子。
前段時間在研究格雷碼結構光。但是部落格上講格雷碼原理的文章幾乎沒有。最近看文獻,總結了一下。如果讀者朋友有更好的格雷碼文章,請發給我,不勝感激。

一、時域編碼
即編碼一系列的結構光圖案,依次投射到目标物體上。首先需要生成一系列編碼圖案。編碼圖案随着投射時間的推進而變化,并且這一系列的圖案需要全部依次投影,以確定每一個像素對應的碼是唯一的。
時域圖案編碼資訊的方式有很多,常見的包括二進制碼(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中,二進制碼的最大頻率(或者說是最小顔色變化間隔)是每一個像素,而格雷碼的頻率是每兩個像素,我們希望最大頻率時,最小顔色變化間隔盡可能大一些,這對投影和采圖都是有好處的。
四、雙目比對
本文以介紹格雷碼為主,故不在此詳細講述雙目原理。
比對原則:根據雙目視差法,找到左右目拍攝到的同一個點,即可獲得深度資訊。
我們通過投射結構光,對于每一個投影儀像素點,其最終的碼值是唯一的。這便使得雙目比對成為可能。
五、結構光解碼
投影儀編碼結構光,使得每個像素具有獨特的碼值,兩相機拍攝,需要解碼,确定每個像素的資訊,進而完成比對。
解碼是編碼的逆序。包括三步:
-
根據灰階值得到目前像素點的格雷碼;
-
格雷碼轉換成二進制碼;
-
二進制碼轉換成十進制碼(即目前像素所在的行數或者列數)。
六、結構光編碼實驗
投影儀分辨率:2014*768
NpatternsCol=ceilf(log1024/log2)=10;
NpatternsRow=ceilf(log768/log2)=10;
水準、垂直各生成十張pattern。
其中pattern0、pattern1是全黑、全白,用作參考