一、什麼是透視變形 What's Perspective distortion?
透視變形是指一般在拍攝影片、照片的時候,你可以看到一個物體及其周圍區域與標準鏡頭中看到的相比完全不同,由於遠近特徵的相對比例變化,發生了彎曲或變形。所以通常我們在自然背景拍攝一張照片時,或多或少都會有一些透視變形存在,而透視變形是由拍攝和觀看圖像的相對距離決定的,因為成像的視角也許會比觀看物體的視角更窄或是更廣,這樣看上去的相對距離就會與所期待的不一樣。
從下圖來看,我們可以更清楚的了解透視變形的產生。 二、如何校正 How to correct this?
一般我們在做透視變形校正,會希望將在圖像中變形的物體,如:大樓、門牌、石碑、佈告欄、公文等等的東西,把它們校正到"正視"該物體時的樣子,如下示意圖:
[ 一般來說在矩形的應用較多,也較為簡單;當然其他的幾何圖形也可以做,但就不在此做討論。]
在數學上,這樣的變形我們可以用下列的聯立方程式來表示: x = ax' + by' + cx'y' + d y = ex' + fy' + gx'y' + h 其中x、y為你原始影像的座標系,x'、y'為校正後的座標系, a、b、c、d、e、f、g、h為常數,表示變形關係。 而這個時候我們只要找出變形區域的四個角點(Corner),再把這個四點代入解聯立方程式,即可得出 a~h 八個參數,也代表你就知道他們彼此之間的變形關係了!就可以進行 Correction 了! 三、解多元一次方程組,求得變形參數。
如果有學過"線性代數",其實它就是一個很經典的 Ax=b 問題,我們可以把它寫成下列矩陣。
至於沒有學習過線性代數的朋友..
其實你也可以用任何你會的數學工具來解這個方程組,今天你有四個點A(x1,y1)、B(x2,y2)、C(x3,y3)、D(x4,y4),代入 x = ax' + by' + cx'y' +d 、y = ex' + fy' +gx'y' +h,你應該有辦法列出八個聯立方程式來解a~h八個參數,這應該國中數學就有教過了,不會太難才是。 最後其實只要你把這八個參數算出來,這個問題就解完了!你就可以套公式把變形區的每一個點還原校正過去,但是如果你有點概念的話,應該不難想像這樣做Source-to-target Mapping 過去Result Image 蠻有可能會有缺點、破圖的問題,這時候就可以用我們上一篇在【影像】Nearest neighbor and Bilinear Interpolation 提到的Invert mapping + bilinear interpolation 的方式來解決。 四、實作 Implement
實作環境的部分,一樣請參考這篇:【教學】Install Visual Studio 2017 with OpenCV on Win10
Ok,再來要做的是從電腦本機端 load一張圖檔進來,至於找角點的部分可以利用小畫家之類的軟體,手動先將那四個點找出來然後再key in 到程式那就好了,如果想進階一點能夠automatic 找 Corner 的話,其實像OpenCV 裡面有人家寫好的function 可以直接 call ,當然啦~ 不論你要做所謂的影像放大還是透視變形OpenCV 裡面也都有function能直接call來用,而且效果可能比你自己做的還要好很多。自己寫主要的目的還是幫助自己練習、驗證自己懂不懂這個函式背後的原理,對於自己未來開發相關的演算法,或者應用在其他軟體上時還是很有幫助的。 【程式碼下載】 【程式執行結果】
7 評論
dl
6/11/2019 15:24:16
Dear Sir:
回覆
Jason Chen
6/11/2019 16:03:17
Hi dl,
回覆
Phoenix
7/12/2019 01:23:56
您好,想問要怎麼知道在數學裡怎樣的形變適用怎樣的數學式子?
回覆
Jason Chen
7/12/2019 18:54:12
Hi Phoenix,
回覆
Lucas
2/26/2020 10:31:40
您好, 程式碼的部分,我使用7-zip解壓縮,
回覆
Jason Chen
2/26/2020 12:22:44
Hi Lucas,
回覆
Lucas
2/27/2020 10:33:24
換了台同為Win7 x86電腦後, 下載解壓縮正常; 發表回覆。 |
Jason Chen人不光是生來就擁有一切,而是靠他從學習中得到的一切來造就自己。- 歌德 文章分類
全部
封存檔
九月 2023
|