VS2019+OpenCV4.5 鱼眼相机图像畸变矫正
-
一、魚眼相機概述
? ? ? ?魚眼鏡頭是定焦鏡頭中的一種視野范圍很大的鏡頭,它視角范圍通常大于等于180度。魚眼相機雖然能獲得較大的視角范圍,但是其拍攝的圖像存在較大的畸變,為了后續任務的需要,往往需要對原始圖像進行預處理,即進行圖像的畸變矯正,獲得沒有畸變的圖像。
? ? ? ?如下圖所示,魚眼相機在獲得大視角范圍的同時,產生的畸變也很大,真實場景中的直線經成像變成了曲線。
? ? ? ?日常生活中接觸到的大多數相機都可以近似用針孔相機模型來近似,在針孔相機模型中,光線沿直線傳播,在成像平面所成的像與真實物體具有相似性。像與物之間經過了透視變換,透視變換保證直線仍然成像為直線,但是不保證平行性,即平行的直線在圖像上不再平行,而相交于無窮遠處。
? ? ? ?針孔相機成像的特點帶來了相應的缺陷,光線只能沿直線傳播,這就使得鏡頭難以捕捉位于圖像邊緣的物體。如下圖所示,越靠近邊緣的物體經過直線傳播后,在成像平面上的位置就會越遠,而相機的底片尺寸有限,因此靠近邊緣的物體無法成像。
? ? ? ?為了獲得更大的視角范圍,人們希望光線不經過直線傳播,而是像光線從空氣射入水中那樣發生折射。如下圖所示便是魚眼相機的成像原理,光線的折射角小于入射角,并且入射角越大,折射角減小的程度也越大。這樣就相當于把光線集中到了一個錐形空間內,在圖像中表現為所有的畫面都集中到一個圓圈之中,類似于魚的眼睛,因此該相機得名“魚眼相機”。
-
二、魚眼相機成像模型
? ? ? ?魚眼相機采用最多的是等距投影模型,投影函數為,其中r為像高,f為焦距,θ為入射角。成像時,由于鏡頭畸變,實際的投影函數不會嚴格符合投影模型。考慮到畸變,實際的投影函數由下式給出(這里假設f=1):
? ? ? ?其中,k0約等于1,k1,k2,k3,k4稱為畸變系數。
? ? ? ? 如圖所示,坐標系Oc-XcYcZc是相機坐標系,坐標系O-XY是物理圖像坐標系。假設按照針孔相機的成像模型,世界坐標系中的一點經過直線投影到物理圖像坐標系中的點。其中,光線的入射角為。按照魚眼相機的成像模型,出射角應該小于入射角,因此實際投影點應該為。不妨假設f=1,則點坐標以及入射角如下:
? ? ? ?由于畸變的存在,實際像點為P’,像點到圖像中心的距離被壓縮為,結合魚眼相機的投影函數得:
由于,且的一次項系數約為1,因此OpenCV中使用的魚眼相機模型為:
由相似三角形原理:
因此畸變后的點坐標p’為:
最后利用相機內參將物理圖像坐標系轉換為像素坐標系,得到p’點的像素坐標:
-
三、基于OpenCV的魚眼相機圖像矯正
1.相機標定
? ? ? ?由魚眼成像模型的知識可以知道,要矯正魚眼相機圖像需要獲得相機內參及畸變系數。這兩個參數可以通過相機標定獲得。本文采用張正友標定法,拍攝了20張棋盤格圖像,用于求解相機內參以及畸變系數。
2.圖像矯正
? ? ? ?獲得相機的內參及畸變系數之后,使用OpenCV的魚眼圖像矯正函數fisheye::undistortImage()進行畸變矯正。
void Undistort::UndistortImg(const double k, bool is_save, const string& path) {//新的相機內參矩陣Mat new_intrinsic_mat;K.copyTo(new_intrinsic_mat);//調節視場大小,乘的系數越小視場越大new_intrinsic_mat.at<double>(0, 0) *= k;new_intrinsic_mat.at<double>(1, 1) *= k;cout << endl << "開始校正圖像" << endl;for (int i = 0; i < test_images.size(); i++){//調節校正圖中心,建議置于校正圖中心new_intrinsic_mat.at<double>(0, 2) = 0.5 * test_images[i].cols;new_intrinsic_mat.at<double>(1, 2) = 0.5 * test_images[i].rows;Mat undistort_img;fisheye::undistortImage(test_images[i], undistort_img, K, distortion_coeffs, new_intrinsic_mat);//保存圖像if (is_save){string filename = path + "/out" + format("%d", i + 1) + ".jpg";imwrite(filename, undistort_img);}}if (is_save)cout << endl << "校正結果已保存至:" << path << endl;cout << endl << "校正結束" << endl; }? ? ? ?fisheye::undistortImage()的第一個參數是待矯正的圖像,第二個參數是矯正后的圖像,第三個參數是相機內參,第四個參數是畸變系數,第五個參數是矯正后的相機內參,可以改變這個參數來調整矯正后圖像的中心位置和視場大小。
3.矯正結果
原圖1
?結果圖1
?
?原圖2
?結果圖2
?原圖3
結果圖3
四、本文代碼
(23條消息) fisheye_cali.zip-圖像處理文檔類資源-CSDN文庫
五、參考文獻
(23條消息) 魚眼鏡頭的成像原理到畸變矯正(完整版)_Sual-CSDN博客
總結
以上是生活随笔為你收集整理的VS2019+OpenCV4.5 鱼眼相机图像畸变矫正的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《以太坊攻略》,小白如何逆袭成为技术大咖
- 下一篇: 在canvas画布上多次绘制图形叠加的效