一 單目結構光編碼目的
類似於雙目,如果把投影儀看成一個逆相機,直到空間中的一點成像平面的位置,就可以知道空間中一點的座標。
編碼的目的:知道打在物體物體表面的光是從投影儀的那個畫素髮出來的,就知道在投影儀的虛擬成像位置。
二 格雷碼的編碼與解碼
2.1 格雷碼vs二進位制碼
格雷碼是一種二進位制碼,最大的特點是相鄰格雷碼編碼只有一位不同。
所以格雷碼解碼更穩定,相對不容易出錯。
體現在
- 明暗交接處變換更少:
對於格雷碼來說,明暗交接處變換更少,如圖所示二進位制下部有7次變換,而格雷碼只有4次。黑白交接的影響主要是在解碼上,解碼很重要的環節就是二值化,一般情況下全黑和全亮是不容易出錯的,因為在實際應用中投影交界處是漸變的,閾值很難確定(還有物體邊緣的影響)。
- 最細的條紋寬度更寬
在相機對焦外,可能投影會糊掉,所以條紋越寬越不容易糊掉。
2.2 編解格雷碼
如果單純的編制一張圖片的話很簡單,如上一節圖所示,最低一行(最後一位)變化為0110週期,第二行為0011100週期,第三行為0000111111110000週期(2的指數級增長)。
二進位制碼->格雷碼
1.對n位二進位制的碼字,從右到左,以0到 n-1編號
2.如果二進位制碼字的第i位和i+1位相同,則對應的格雷碼的第i位為0,否則為1
格雷碼->二進位制碼
從左邊第二位起,將每位與左邊一位解碼後的值異或,作為該位解碼後的值(最左邊一位依然不變)。依次異或,直到最低位。依次異或轉換後的值就是格雷碼轉換 後的二進位制值。
以十進位制數6為例,格雷碼->二進位制碼
第一位不變: 1
第二位(0)與第一位解碼後的值(1)異或:1
第三位(1)與第二位解碼後的值(1)異或:0
三 圖片二值化方法
前提條件:每個在投影儀照射範圍的點都至少需要經歷一次明暗變換,即總要能找到一張圖該位置為 0,另一張圖該位置是1
實現方法:
方法一: 增加兩張圖, 一張全黑圖,一張全亮圖
方法二: 去除全0和全1的編碼 ,讓每個編碼至少含有一個0和一個1(不建議,可能會破壞格雷碼穩定性)
二值化方法:
對於每個畫素,計算其在整個時間序列(一組)下的最大值和最小值,然後對當前圖片畫素二值化就 是計算出一個如上式所示的閾值,閾值大於0.5的時候則為1,小於0.5則為0。
四 其他離散型編碼
在某些場景下,由於物體材質的原因,格雷碼效果不好;物體受到全域性光照影響特別大;
Global illumination 全域性光照:
1 inter-reflection 內反射 -- long range effect
2 diffusion 漫反射 – long range effect
3 sub-surface scatter 下表面散射 – short range effect
全域性光照對解碼影響:解碼錯誤
解決思路:
不同的全域性光,對不同頻率的編碼光影響不同。
1 高頻光適合 (long range effect): 內反射, 漫反射
有可能第一行右邊亮的地方點亮左邊暗的地方,所以需要更密集的投射如下:
2 低頻光適合 (short range effect): 下表面反射(影響臨近的點)
低頻光因為影響臨近,所以最好是越低頻越好,如下:
其實相對來說格雷碼最穩定,而上面這種方法會生成過多的圖片,會對點雲幀率有所影響。
參考論文: Structured Light 3D Scanning in the Presence of Global Illumination
五 總結
格雷碼編解碼流程:
特殊應用場景: