-
一、魚眼相機概述
魚眼鏡頭是定焦鏡頭中的一種視野范圍很大的鏡頭,它視角范圍通常大于等于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博客
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/336335.html
標籤:其他
上一篇:Ubuntu下編譯OpenCV
