OpenCV畸變校正原理以及損失有效像素原理分析


上一篇博客簡要介紹了一下常用的張正友標定法的流程,其中獲取了攝像機的內參矩陣K,和畸變系數D。

1.在普通相機cv模型中,畸變系數主要有下面幾個:(k1; k2; p1; p2[; k3[; k4; k5; k6]] ,其中最常用的是前面四個,k1,k2為徑向畸變系數,p1,p2為切向畸變系數。

2.在fisheye模型中,畸變系數主要有下面幾個(k1,k2,k3,k4).

 

因為cv和fisheye的鏡頭畸變模型不一樣,所以畸變系數也會有所不同,具體在畸變校正時的公式也不同,具體公式請參見opencv2.0和3.0的官方文檔。OpenCV中對畸變圖像進行畸變校正主要用的函數有UndistortImage()函數,以及initUndistortRectifyMap()結合remap()函數。其實UndistortImage()就是initUndistortRectifyMap()和remap()的簡單組合,效果是一樣的。

 

但是有一點是:當你有很多畸變圖像需要較正時,用UndistortImage()函數的缺點就暴露了。因為畸變坐標映射矩陣mapx和mapy只需要計算一次就足夠了,而重復調用UndistortImage()只會重復計算mapx和mapy,嚴重影響程序效率。因此當有多張圖片要畸變校正時,建議使用一次initUndistortRectifyMap(),獲取畸變坐標映射矩陣mapx和mapy后,作為remap函數的輸入,多次調用remap函數進行畸變校正。

 

今天要說的第二點就是做過畸變校正的同學都知道,畸變校正后的圖像會損失很多像素,這是為什么呢?接下來就以常見的桶形畸變為例分析一下:由於我目前手頭的相機畸變程度並不明顯(之前用廣角鏡頭的時候畸變程度相當明顯)。因此就從網上找一些圖片作為例子以便說明,這里引用一下圖片來源

http://www.developersite.org/904-45591-%E6%A0%87%E5%AE%9A。

畸變原圖如下:

 

畸變校正后的圖如下:

 

相信大家已經可以看到了,由於桶形畸變的特征是,遠離圖像中心的地方成像放大率小,因此越遠離圖像中心的位置畸程度越明顯,像點越向內移動。畸變校正后,原本擠在一起的像素點們被校正到原來的位置,就得到上面的圖像。同時由於四周的像素被拉伸,會造成四周出現模糊的情況。

得到上述圖像后很自然想到的是把四周的黑色區域裁掉,只留下中間的圖像區域。如下圖(紅色框):

 

那么問題來了,這樣做的話輸出圖像的長寬比和輸入圖像的長寬比就不一致了。因此opencv畸變校正函數內部做法是:在保證長寬比不變的情況下,對上面的圖像取中間的ROI區域出來,類似進行“裁剪”操作,那么就會得到損失更多像素的輸出圖像啦,如下圖(藍色框)!

好了,說到這里,我們就把代碼中的罪魁禍首找出來吧!先看一下initUndistortRectifyMap()函數的原型,如下圖左,默認情況下,我們通常不會求取新的CameraMatrix,這樣代碼中會默認使用標定得到的CameraMatrix。而這個攝像機矩陣是在理想情況下沒有考慮畸變得到的,所以並不准確,重要的是fx和fy的值會比考慮畸變情況下的偏大,會損失很多有效像素。我們可以通過這個函數getOptimalNewCameraMatrix ()求取一個新的攝像機內參矩陣,函數原型如下圖右,注意函數上面的備注” Return the new camera matrix based on the free scaling parameter“,通過這個函數可以自行調整縮放比例。

       

 

 

在getOptimalNewCameraMatrix ()函數中,其中的一個輸入參數為alpha∈(0,1),alpha的意義見上圖,調節alpha的值能夠控制得到的新矩陣中的fx和fy的大小,當alpha=1的時候,原圖像中的所有像素能夠得到保留,也就出現了上面校正后圖像中的那些黑色的空洞區域。【注:cv模型中為alpha,fisheye模型中為balance,意義是一樣的】

那么alpha是怎么樣改變 f 值的,主要是getOptimalNewCameraMatrix ()中又調用了一個函數undistortPoints(),這個函數會在畸變圖像中選取上下左右四個點進行畸變校正,具體請看源碼。下面圖片中我圈出的代碼就在這個函數里面,里面具體的f1,f2,f3,f4的意思就與取的上下左右四個點有關,可以去看源代碼,當然不明白了也可以問我。總之是在fmin和fmax之間進行插值計算 f,而通常balance(alpha)默認為0,f=fmax,焦距越大,視場越小,損失的有效像素越多。

 

好了,夜已深,今天就到這里。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM