3D 相機這麼多,雷射輪廓掃描器 ? 雷射光斑掃描器? 結構光掃描器? 傻傻分不清楚 . . .
在討論這個議題之前,應該要先闢謠,或者說是正名也好,其實,我們在討論的這些東西,通通都是結構光 3D 相機。
結構光的定義
什麼是結構光? 泛指主動投射一指向性的光源,在物體表面留下漫射斑紋,然後再透過相機去定位這個斑紋。它關鍵在於【指向】這兩個字,因為,如果沒有指向性,我們難以單純使用相機去量測物體上指定的位置,因此,必須有指向性這個因,才有了【結構】這個果。
雖然大家都知道光是走直線的,但是一般的光源發光是擴散的,頂多把物體打亮,卻不能在物體表面形成清晰的斑紋。能夠成為結構光的光源,必須具備指向性這個特色,所以,通常都是點狀、直線、格紋等等,能夠具體的告知相機指哪裡打哪裡。雷射是一種最常見用於製作結構光的發光源裝置。
延伸閱讀: 了解什麼是漫射什麼是全反射
最簡單的結構光測距 – 點雷射三角測距
最簡單的光學式 3D 量測就屬單點雷射三角測距了,那麼它是怎麼量測得到距離數值的呢?
我們剛才已經知道,雷射光的作用用於在物體表面形成漫射痕跡。
假設雷射光已經打在了物體上,Sensor 透過鏡頭也看到了光點,於是,我們可以從 Sensor 的觀點出發,【倒回去】來還原這個過程。
首先,如上圖 1,因為只有光點處有強度,其餘位置是黯淡的,所以 Senor 很輕易地定位到這個光點的所在 Pixel,然後依照成像投影原理,把影像中的光點逆推回真實世界的空間,但是這個投影射線是無限延伸的,尚不能定位真實世界的物體位置。
接下來,如上圖 2,已知這個光點來自於一支雷射光束,雷射光與相機之間的關係事先已經校正好,相機投影的射線與雷射光的射線必然交叉於真實世界的特定位置上,於是就可以回推出光點與雷射的距離了 (如圖 2 綠色箭頭)。
接下來就重要了,如圖 3,其實,經過如圖 2 的校正過程,Sensor 的每個 Pixel 都可以對應一個距離值。
所以一旦偵測到光點,從光點的 Pixel 位置根據校正關係馬上就可以反推雷射與物體的距離,也就可以察覺物體的高度有所變化,也就是結構光式 3D 量測的基礎原理。
我們從這個最簡單的案例就可以得知,結構光的指向性、在物體表面形成斑紋的痕跡有多麼的重要 !
如果要量測很多點怎麼辦? 進化,從單點變成曲線 !
從剛才的基礎原理已經知道,單點雷射測距的 Sensor 只需要知道亮點的 Pixel 位置,就可以立即反推物體距離,其中,它的 Sensor 只需要一維的,是線型的 Sensor。如上圖 1,由於它一次只能量測一個點的距離,如果要量測很多個位置,比如說曲線,則需要移動量測位置,在不同位置上取樣並記錄量測結果。
這樣的量測方式很費工,尤其是當需要很密集、點距很細小的時候,多點取樣顯得相當沒有效率。
於是,解決辦法就是改用線型雷射,這是一種將單點雷射發光源前方,加裝可以將光束投影成線狀的鏡頭的雷射模組,它能在空間中投射出一面虛擬的牆,被這面牆照到的地方會沿著物體的輪廓呈現直線或曲線狀的漫射光痕跡,如上圖 2 最右側。
接下來,如上圖 2 左側,相機改用二維的面陣 Sensor,雷射光痕跡透過鏡頭投影成像在 Sensor 上,此時,一行 Pixel Column 其實就是一組點雷射測距,每一行都可以偵測光點位置量出距離高度;若這顆 Sensor 寬度有 1280 個 Column,就相當於 1280 台點雷射測距的效果,所以量測曲線 Profile 的時候比點雷測效率提高數百到數千倍以上。
因為一次可以量測一整條 Profile,所以這種類型的結構光 3D 相機就是我們俗稱的 Laser Profiler,或是叫做雷射輪廓掃描器。
再進一步思考,如果要量測很多條輪廓怎麼辦?
由於雷射輪廓掃描器一次僅能量測一條輪廓線,假如想要還原整面的物體 3D 表面形貌時,我們必須移動整個量測模組或是移動待測物的相對位置,如上圖。透過相對運動的方式,取樣多次輪廓,始能拼湊出整面的 3D 表面形貌。
如果不想要相對移動怎麼辦?
因為我們有時候會有靜態拍攝的需求,想要在定點一次取像,能夠量測出視野中整個 3D 表面的形貌。
可以一次打很多條雷測線嗎 ? 這樣就不用移動了。
想得美,問題在於識別影像 Column 上的取樣點很麻煩 ! 怎麼說呢,請繼續看下去。
如上圖 1,這是單條的線雷射,無論在物體表面產生的痕跡輪廓為何,無論是視角被遮擋或是有雜散光干擾也罷,我們總是能在指定的 Column 上判斷出個結果來,說找得到,或者說找不到,總之能相當乾脆的給一個唯一的答案。
如上圖 2,變成多線雷射以後,在二維 Sensor 影像的一個 Column 上可能會出現好多個亮點,這個亮點是雜散光嗎 ? 是真實的雷射亮點嗎 ? 那到底是第幾條雷射的亮點 ? 已經混淆不清了。
前面已經提過,三角測距能夠實現的關鍵在於,光束必須先跟相機經過校正,它們兩者之間必須滿足一對一確定的關係。如果有多個光束,那每一條光束跟相機也都要是確定的關係,此時的問題在於,無法有效的分辨 Column 上的哪一個亮點來自於哪一道光束,所以這個多光束線雷射 3D 量測的 Idea 要實現是相當困難的。
何不改用多種波長試試看?
也就是說,改用投影機,將不同的光束改用不同的顏色投影出來,然後用彩色相機來取像,透過抓取不同顏色來分辨 Pixel 上的亮點到底來自於哪一條光束,嗯,看起來又是個好主意。
看起來可以解決前面難以分辨的光束的問題,但這個方法有太多的副作用。
第一,顏色是不可靠的,在像素上呈現的 RGB 值,就是原本的顏色嗎? 如果這麼簡單,在彩色攝影就不會有白平衡校驗這件事了。因此,為了克服色差問題,分辨顏色的演算法相對於原本單純的亮度判斷而言,複雜太多了。於是這招的副作用就是在考驗運算速度,大大降低了這種掃描器做出來以後的實際運作效率。
第二,取樣解析度。假如為了降低辨色演算法的複雜度,我們可以故意讓投影的時候相鄰的光束用差異比較明顯的顏色,例如紅色最好在綠色的隔壁,不要在橘色的隔壁。甚至,我們也可以考慮用加裝光譜濾鏡,把不同波長分離出來,分光給專門負責不同波長的 Sensor,這樣不就單純許多? 但問題又來了,你能分多少種波長? 一個小小的掃描器能塞下這麼複雜的光學結構嗎?
好吧,那只分 R、G、B 三條線就好了,但這又大大降低了取樣的解析度,實用價值不高,還不如拿單線雷射移動掃一下比較快呢。
休息一下,我們先暫時忘記結構光掃描器 . . .
因為,這些副作用其實被信號通訊領域的編碼學巧妙的解決了 !
這時候就不得不提最經典的編碼方式,格雷碼 (Gray code),這是一種在 1940 年代就被提出的技術。
我們先暫時忘記結構光掃描器,先來看格雷碼吧,來科普一下 !
參考資料在這邊,有興趣可以跳轉瀏覽。
https://zh.wikipedia.org/wiki/%E6%A0%BC%E9%9B%B7%E7%A0%81
https://kknews.cc/news/x869qo9.html
大家都知道,我們生活中慣用十進位,例如 0, 1, 2, 3, 4 …
但是呢,在做信號傳遞的時候,通常要將十進位轉換成 0 1 0 1 0 1 那樣的二元 (Binary) 表示,第一,畢竟電路都是 ON (1) 或 OFF (0) 的嘛 !
第二,二元表示能方便分辨信號,因為 0 就是沒有,1 就是有,沒有模稜兩可的答案。
那怎麼將十進位轉成二元呢,一般就是直接用二進位去編碼,如上圖左,而右側則是格雷碼的編碼結果。
格雷碼與二進位編碼的差異比較網路上很多資訊,其中一項就是,例如上圖紅框處,二進位在相鄰的數值變化時,例如從數值 7 變成 8 時,可能會需要辨識 2 個 bit 以上的變化,但是格雷編碼每個相鄰的數值,都只需要關切一個 bit 的變化即可,所以容錯性較高。
未完,待續 . . .