利用相機的焦點(Focus)測量景物深度(Depth)的技術,除了3D雙目相機(Stereo Cameras)的立體視覺(Stereo Vision)以外,還包含聚焦測距(Depth from Focus, DfF)和失焦測距(Depth from Defocus, DfD)。這兩者都不需要投射光源,所以是屬於被動式的深度感測技術。不過,和立體視覺不同的是,它們所測得的深度是相對距離,不是絕對距離。
聚焦測距
如附圖1,調整相機的光圈(Aperture)大小能拍攝到聚焦(I n F o c u s) 和失焦(Out of Focus)照片。光圈越小,景深(Depth Of Field, DOF)越寬(圖2 ) 。在最佳焦點上的圖像是最清晰(Sharpness),解析度是最高,明暗對比度(Contrast)也是最佳的。在最佳焦點附近,圖像較清晰的範圍稱為景深,是聚焦的區域。而超出這個範圍,或未達這個範圍的圖像就比較模糊,是失焦的區域。影響景深的因素包含光圈大小或光圈值(F-stop)、焦距(Focal Length)、相機鏡頭與景物之間的距離。
使用相機對相同場景在不同焦點處,拍攝許多張圖像,再將這些圖像對齊(Alignment),以避免任何因未對齊所造成的加工痕跡(Artifact),然後,使用拉普拉斯運算子(Laplacian Operator)從這些圖像中,找出邊緣(Edge)或明暗對比較高的部分,這些部分通常都是最清晰的地方。最後將這些最清晰的部分組合成一張所有景物都聚焦的圖像,這就稱為焦點堆疊(Focus Stack)(圖3),這是微距攝影(Macro Photography)或特寫(Close-Up)鏡頭常用的方法。通常,在相機的景深不夠寬時,可以使用焦點堆疊來得到較寬的景深。
聚焦測距也使用焦點堆疊,不過,聚焦測距更進一步分析每一張圖像的清晰度,越清晰者就代表越靠近最佳焦點。這種分析步驟稱為焦點測量(FocusMeasure),其方法有:拉普拉斯運算子(Laplacian Operator)或拉普拉斯濾波器、索伯算子(Sobel Operator)或索伯濾波器、估測梯度強度(GradientMagnitude)或梯度濾波器、小波轉換(Wavelet Transform)或小波濾波器等。
最後,依據圖像的清晰度和設定的焦點,決定景物的深度。圖4是使用Python加OpenCV軟體設計一個簡單的聚焦測距程式,輸入五張拍攝焦點不同的圖像,使用拉普拉斯運算子分析這些圖像的清晰度,最後根據清晰度最高的像素數據,產出一張景物距離是相對的深度圖。在圖像中的一個像素經拉普拉斯運算子計算得出的值越大,就表示在這像素或它附近的光強度有很大的變化,也表示這像素是這圖像的邊緣,或是清晰的部份。

laplacian、sharpness、depth_map是大小相同的陣列,將所有圖像中的相同位置的像素的拉普拉斯運算子估算值laplacian加總,並儲存至sharpness;然後,將所有圖像中的相同位置的像素的laplacian值乘以i再加總,並儲存至depth_map。i是表示圖像的順序,也代表各焦點和相機鏡頭之間的相對距離,稱之為焦點距離,i=1時的焦點距離比i=0時的焦點距離大,i=2時的焦點距離比i=1時的焦點距離大,i大於2者以此類推。
最後,將depth_map除以sharpness,這是將depth_map中的每一個像素值正常化,能將像素值控制在0到1之間的範圍。為了能正常地在電腦螢幕中呈現深度圖,再利用自訂的函式normalize(x)將depth_map中的每一個圖像值從[0,1]變成[0,255],這是灰階(Grayscale)值,亦即depth_map不是彩色圖。
圖5是完整的聚焦測距的工作流程,它比圖4的程式複雜,但基本原理相同。在圖5中,焦點測量接收焦點堆疊的結果,不僅產出一張全部聚焦圖,還產出一張深度圖。圖6是在聚焦測距的工作流程中,所產出的圖像範例,包括:輸入焦點不同的RGB彩色圖、前後圖像的匹配、對齊圖、焦點堆疊、全部聚焦圖、深度圖。
專業的相機都有小型馬達驅動的對焦環(Focus Ring),可事先使用程式設定焦點。有些先進的相機具有焦點包括(Focus Bracketing)的功能,可以在拍照前,事先用程式設定好一連串的焦點,而且前後焦點的間距小,拍攝後經過軟體處理,可以獲得一張全部聚焦的照片。若要將這種相機連接至嵌入式作業系統,首先必須安裝它們的驅動程式,然後設計應用程式來控制它們。例如:使用式子(1)的Python加OpenCV程式,可以自動設定焦點、拍照和儲存檔案。
import cv2
cap = cv2VideoCapture(0)
for focus in range(0, 100, 10):
cap.set(cv2.CAP_PROP_FOCUS,focus)
ret, frame = cap.read( )
cv2.imwrite(f’image_{focus}.jpg’,frame)cap.release( )…………………………………(1)
或者使用Linux的v4l2-ctl命令直接控制對焦環,例如:在式子(2) 中的focus_absolute參數,就是將相機的焦點設為20。只要設計一個應用層的腳本程式呼叫式子(2),並輸入不同的焦點值至focus_absolute,就能完成自動連續設定焦點的功能。然後,此腳本程式呼叫式子(3),即可拍照,並將圖像存檔。為了提高深度估測的精確度,輸入不同焦點的圖像數目必須增加。
v412-ctl-d/dev/video0–set-ctrl=focus_absolute=20…………………………………….(2)
for i in $(seq 1 $num_images); do
filename=”./images/images_$i.raw”
v412-ctl-d/dev/video0–set-fmt-v i d e o=w i d t h=640,h e i g h t=480, pixelformat = “YUYV” – -stream-mmap–stream-count=1 –stream-to=$filenamedone………………………………………………(3)
失焦測距
失焦測距和聚焦測距相反,它主要是測量在圖像中,失焦或模糊的部份。模糊圈(Circle Of Confusion, COC)是失焦測距的重要的抽象概念。使用相機無法直接拍攝到模糊圈,因為它是相機鏡片和焦點的光學原理。但調整不同的焦點,或光圈變大、景深變窄,都能拍出在焦點以外的景物因模糊圈造成的圓形模糊點。圖7是一個典型的失焦測距模型,其中(a)表示模糊圈的形成。(b)中的長度C是模糊圈的直徑。(c)由上至下分別是:景物太靠近焦點、在焦點上、遠離焦點的模糊圈。(d)是由於模糊圈造成相機拍攝到許多模糊點,這現象也稱為背景散焦效果,簡稱散景。
與聚焦測距不同的是,失焦測距通常只需輸入少數焦點距離不同的圖像,然後,使用演算法分析每一個像素的模糊程度。最後,估算出景物的深度。進行圖像分析之前,必須先建立相機的失焦模型,模擬相機的點擴散函數(PointSpread Function, PSF),並掌握PSF與深度之間的變化關係。此外,還包含求解模糊過程的數學反函數,或稱為逆PSF。以及更妥善地處理雜訊和人工痕跡。所以,失焦測距模型通常都是使用深度學習(Deep Learning)來實現,如圖8。
首先輸入訓練用的RGB彩色圖和深度圖,這些圖像和深度相關的3D-PSF進行卷積(Convolution)。3D-PSF是由相機鏡片的表面特徵h和alpha合成或稱為透明合成組合而成。通常h參數包含鏡片的大小、形狀、曲度、焦距。b是經過編碼的圖像。在b被送至卷積神經網路(CNN)之前,先由近似逆PSF的預處理單元處理。這個預處理單元能抵銷3D-PSF所產生的模糊,這作業稱為去模糊。
藉此,CNN能讀取正確的圖像特徵,提高深度估計的精確度,並促進CNN快速收斂(Convergence),降低運算的複雜度。損失函數(Loss Function)L分別比較RGB、深度的基準真相圖(Ground Truth Map)與RGB、深度的預估圖(Predicted Map),各得出的誤差值以反向傳播(Backpropagation)方式,將誤差值傳送到CNN和相位編碼(Phase-Coded)的光圈表面特徵模組,以調整該模型的參數值。
在圖8中,相位編碼的光圈表面特徵是由數學模型模擬的,它能控制光圈大小和光的前導波像差(WavefrontAberration),以獲得精確的焦點預估和深度編碼。這個虛擬光圈能隨著深度變化產生獨特的PSF,這個光圈PSF可以對深度進行編碼,稍後再由CNN解碼。反向傳播可以調整此虛擬光圈的參數值,藉此改變深度編碼。而相機鏡片的表面特徵h則定義另一種重要的PSF。h決定光線通過鏡頭時的折射現象,而影響在相機感測器上的光點如何聚焦和擴散。
而此鏡片PSF是h的數學函數,所以鏡片的表面特徵h也是由數學模型模擬的。不同的焦點設定都有其各自的PSF,每個PSF代表不同的模糊和深度的相對應關係。同理,另外定義一個能估算鏡片PSF損失的損失函數,它能根據深度誤差,估算出PSF損失。之後,以反向傳播調整此虛擬鏡片的參數值,藉此改變鏡片PSF,最後改變光點的聚焦和擴散。在訓練此失焦測距模型時,CNN從許多個PSF中,學習模糊和深度的對應關係。當停止訓練開始推理時,CNN就利用已學到的資訊來預估輸入圖像的深度。此外,因為圖8的失焦測距模型需要基準真相的圖像資料集,所以它是屬於監督式(Supervised)學習的深度測量。
相對深度的應用
雖然聚焦測距和失焦測距只能輸出相對的深度,但仍可應用於下列場合:
自動對焦(Autofocus)系統
能改善數位相機和智慧型手機的自動對焦功能。因為它們能估算景物的相對深度,使相機和手機能更快且更正確地完成自動對焦。
擴增實境(Augmented Reality)
在AR應用中,相對深度的資訊可以協助AR將虛擬物件準確地放置在相對於真實世界的虛擬空間中,也就是物件置放(Object Placement)。
機器人(Robotics)
機器人可以利用相對深度,引導移動的方向,並避開障礙物,閃避障礙物(Obstacle Avoidance)。
機器人的手臂可以利用相對深度,正確地抓取和操控物件。
3D重建
認識場景(Scene Understanding)對使用相對的深度圖可以產生3D圖,可應用於考古、建築、虛擬實境。
醫學影像(Medical Imaging):
顯微鏡檢查(Microscopy)分析散焦模糊(Defocus Blur),可以重建生物樣本的3D圖。
不過,聚焦測距和失焦測距無法妥善支援下列應用:
絕對深度的測量
精確的測量任務需要絕對深度的應用,例如:工業檢驗工作。光學雷達或光達、結構光(Structured Light)、立體視覺比較適合這種應用。
大範圍的地圖測繪(Large-Scale
地理空間的應用需要絕對深度。攝影測量(Photogrammetry)、衛星測量比較適合這種應用。
高精確度的3D掃描(Scanning)
工程和製造:通常,這些應用需要非常精確的絕對深度。