日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VS2019+OpenCV4.5 鱼眼相机图像畸变矫正

發布時間:2024/1/8 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 鱼眼相机图像畸变矫正的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。