5.22. 鏡頭與透視校正¶
有兩類幾何校正會以矩形對矩形映射所無法達成的方式對影像進行扭曲。鏡頭校正(lens correction)可消除真實廣角鏡頭所引入的徑向畸變——也就是會讓場景中的直線在影格角落附近彎成可見曲線的魚眼凸起效應。透視校正(perspective correction)則可消除鏡頭未垂直對準場景時所產生的梯形效應——這種梯形扭曲會使世界中已知的矩形在影像中變成非矩形的色塊。這兩種校正都是在拍攝完成之後,消除源自光學的效應。
5.22.1. 徑向鏡頭畸變¶
真實鏡頭效應 一節說明了廉價廣角鏡頭所引入的桶形(barrel)畸變。位於影格中央附近的像素大致落在針孔模型所預測的位置;而邊緣附近的像素則向外彎曲,彎曲量會隨著與光軸之間徑向距離的平方而增大。場景中靠近影格邊緣延伸的直線,在拍攝到的影像中會明顯彎曲,而任何假設直線維持為直線的傳統機器視覺演算法——AprilTag 角點偵測、邊緣追蹤、循線導航——在角落附近都會得到錯誤的結果。
lens_corr() 可消除此畸變。此方法執行逆向映射:每個輸出像素都是從鏡頭原本會將其向外彎曲的輸入位置取樣而來,結果便是一張幾何上筆直的影像。
img.lens_corr(strength=1.8)
strength 參數是此校正的核心。它是一個用以描述鏡頭彎曲強度的單一數值;接近 1.0 的值適用於中度廣角鏡頭的輕微校正,而高達約 2.0 的值則適合強烈的魚眼鏡頭。預設值 1.8 對於 OpenMV Cam 原廠鏡頭而言是合理的起始點;任何特定鏡頭的正確值則須多試幾個並觀察影像來決定。
另外兩個輔助參數通常維持預設值即可。zoom(預設 1.0)會縮放輸出——大於一的值會向外裁切,以補償鏡頭校正將角落進一步向外推的方式;較小的值則會保留更多校正後的場景可見範圍,代價是影像邊緣會包含空白像素。x_corr 與 y_corr 會將校正中心從影像的幾何中心移開,這在鏡頭光學上未對準感測器中央時很有用(雖屬罕見情況,但值得了解)。
典型的處理流程為:拍攝、執行一次 lens_corr() 以拉直幾何形狀,接著再對結果執行應用程式實際所需的任何處理。
5.22.2. 3D 旋轉校正¶
另一類幾何畸變是透視(perspective)扭曲,發生於感測器平面與場景平面不平行時。典型的情況是從下方觀看一個招牌或車牌:招牌頂部距離鏡頭比底部遠,因此投影較小,於是拍攝到的影像會將該矩形顯示為頂邊比底邊短的梯形。
解決方法是對拍攝到的影格套用一個 3D 旋轉,以虛擬方式重新定向感測器平面,使其與場景平面平行。此處的數學運算與 AprilTag 偵測用以從標籤四個角點還原其姿態時所用的透視映射相同,只是反向執行:給定一個旋轉,此運算會將每個輸出像素映射回該旋轉原本會來自的輸入位置。
rotation_corr() 即執行該項校正:
img.rotation_corr(x_rotation=10.0, y_rotation=0.0, z_rotation=0.0)
這三個旋轉參數以度為單位,描述繞著以影像為中心的虛擬相機的 x、y、z 軸所進行的旋轉。x_rotation 會將相機向上或向下傾斜(拍攝牆面地面視角時的自然校正);y_rotation 會將相機向左或向右平移視角;z_rotation 則會讓相機繞其光軸旋轉(安裝未水平時的自然校正)。
x_translation 與 y_translation 會橫向移動虛擬相機而不旋轉它。zoom(預設 1.0)會縮放輸出。fov(預設 60.0)描述相機的垂直視野,用以計算投影——此值應與實際鏡頭相符,以保持幾何一致性。
對於任意的傾斜與平移組合,可在一次呼叫中合成多個非零旋轉。運算順序在實作內部已固定;應用程式只需提供角度,結果便會輸出。
5.22.3. 校正已知矩形¶
rotation_corr() 最常用且實用的形式是 corners= 關鍵字,它接受一個由四個 (x, y) 元組組成的列表,描述輸入影像中某個已知矩形的角點。此方法會計算出能將真正的矩形映射到那四個特定點的 3D 旋轉,對整張影像套用該旋轉的逆運算,並回傳一個讓該已知矩形重新成為矩形的結果:
plate_corners = [(45, 80), (300, 60), (310, 180), (40, 200)]
img.rotation_corr(corners=plate_corners)
其典型用途正如名稱所示:從斜角拍攝的車牌(或任何其他矩形特徵)。上游階段偵測到車牌並回報其在拍攝影像中的四個角點位置;將這些角點傳給 rotation_corr() 便會產生一張車牌呈現為真正矩形的影像,可供後續的字元辨識或樣板比對階段使用。
當四角點形式能解決應用程式試圖解決的問題時,它會比六參數形式實用得多。應用程式不必估算任何旋轉角度;它只需將四個點交給此方法,讓方法自行推算其餘部分。六參數形式則適用於場景中沒有可辨識矩形可見、且須根據外部知識(例如已校準的安裝角度)手動調整旋轉的情況。