Apple iPhoneX FaceID 光學原理

A structured light pattern designed for surface inspection https://en.wikipedia.org/wiki/Structured_light

從被動的 Image based stereo matching,進化到今日的 structured light,雖然在 Microsoft Kinect 早已實現多年,但真正將其發揚光大的恐怕還是 Apple 的 iPhoneX,本文就一個半吊子副職業光電工程師 Lv.1 來用猴子聽得懂的方式概述

基本上就是主動打光在物體上,這個光的圖形是經過設計的,有利於辨識比對。所以有一台投影機( 可以想做是相機 )的影像是已知的,在另外一台相機找到相同的 pattern 就可以知道深度,所以我們又回到了 stereo matching和 Epipolar geometry

等等...猴子聽得懂的概述呢?

好回過頭來,看過水滴在平靜的水面嗎,或是當我們丟一顆石頭到湖水中,可以看到一圈漣漪。

遠場繞射的神奇之處,舉個例來說,我抓了一把石頭,往湖中一撒,然後湖之女神 看似雨滴散亂的漣漪卻漸漸相消與結合,成形一個愛心圖案。Wow!

(實際上是需要坐飛機在高空,底下是平靜無浪的大海,同時撒下巨大質量的鐵球...這我們就不探討真實性了)

 

Continue reading "Apple iPhoneX FaceID 光學原理"

Stereo Matching using OpenCL

上一篇的OpenCL版本,速度快了不少,但是顯卡會 freeze ....修改 TDR Level 讓 driver可以跑久一點

 

code

Continue reading "Stereo Matching using OpenCL"

Stereo Matching using Block SAD

這裡假設左右眼兩張影像已經經過 rectification,在 epipolar line 上限制一個小範圍的search range用以加速,簡單用 SAD 計算最小的左右視差作為 disparity。

使用 middlebury 的 dataset,勉強可以看出深度,但畢竟不到 100 行的小品 code 所以品質很差XD。

 

im0

作為使用不同 window size 計算 SAD的比較,下圖左是用較大 window size 的結果,較為密實但粗略,小的 window size 則是會有較精確的但易破碎的結果;

因此才有了 coarse to fine 的演算法策略,先計算大的 window size 或低解析度的影樣匹配,然後再重複用小的 window size在鄰近 disparity 位置搜尋精確解。

但是 coarse to fine 也有無法解決的地方,太強烈的 smooth 特性反而失去細節,舉例來說,位於半島型的突出小東西或獨立的細小物體 ( 下圖綠框部分 ) ,在這些 window 中,真正要比較差異的區域其實是很少的,只在 window 正中間一小塊,越是 coarse 的範圍看到其他的部份也越多, 結果易忽略細小的目標物,而收斂成適合周邊範圍的 disparity;造成一種「穿越」或「填補」的現象。 coarse layer 定義下來的 disparity 若離目標物深度很遠,在 fine layer 相鄰深度的 refine 就會失敗 ( coarse layer 就消失的東西救不回來 );許多論文靠著定義特殊的 label 或 segment 來區分這些小區塊做特別處理。Middlebury stereo Evaluation 上目前最好的效果算是這類方法。

im00

sm

後面附上 source code,使用 openCV library讀寫圖

Continue reading "Stereo Matching using Block SAD"

OpenCL Box Filtering

一個很 tricky 的點跟 CPU 計算不一樣,這邊如果把 main.cpp 呼叫 kernel 的 devBy 全部換成 devBx,在 thread 數不超過顯卡 core 負荷時(也就是一個 round 可以跑完 kernel ),結果是不會變的。可以嘗試在大圖需要多個 round 才能跑完 kernel 時就會出錯。

其實因為所有 thread 同步 inplace filtering 寫入關係,當寫入任一點時其他點的 source 已經不會需要再用到,所以不會有 propagate 的問題

讀寫檔案使用 OpenCV,減少 memory access 次數所以 x 和 y 方向 filtering 分開

Continue reading "OpenCL Box Filtering"

OpenCL baby step using mingw

Headers & Document

Khronos OpenCL Registry

GitHub (C headers)

C++ wrapper (OpenCL 2.x)

C++ wrapper (OpenCL 1.x)

Library

Nvidia

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\lib\Win32\OpenCL.lib

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\lib\x64\OpenCL.lib

my nvidia develop pack

Compile yourself

OpenCL-ICD-Loader

Binary

Included in AMD or Nvidia Driver

Note

  1. Nvidia only support OpenCL 1.2, AMD OpenCL 2.x
  2. No useful debugger like Nvidia Nsight. Use printf.
  3. Cross paltform intermediate language SPIR.

 Example

Continue reading "OpenCL baby step using mingw"

Image Deconvolution: An Introduction

如果一張影像拍照時手振了,或是沒對好焦模糊了,通常我們會值接刪除重拍,但在某些特殊應用的場合,我們會需要如 CSI 犯罪現場中用的神奇補強手段,其實電視劇中只是稍微誇大效果 (我們也沒用這麼酷炫的UI ),但理論上是可行的,這個過程叫做 deconvolution 或稱為 deblur。

Image Deconvolution 嘗試將所有光學過程反轉,求解符合數學模型的原始射線。本文將會帶到基本的數學模型及簡單例子;並且整理分類常見的解法。

Deconvolution 做法跟把模糊照片銳化( Sharpness filtering ) 有數學模型上的根本差異,並且在某些特殊強況有著決定性的差異。知道了以後在判斷什麼影像該用什麼方法補救上會有不少幫助。

範例程式給讀者參考,有興趣的讀者可以先玩看看再開始閱讀本文,比方說將下圖變清楚 (參數為 13x13 tap 的 circle PSF )

Continue reading "Image Deconvolution: An Introduction"