相機內參與畸變模型

2021-08-28 13:15:02 字數 1519 閱讀 4312

相機內參包括相機矩陣引數和畸變係數。

相機內參矩陣為3*3的矩陣:m = [fx 0 ppx ; 0 fy ppy ; 0 0 1]

畸變係數:k1 k2 k3 p1 p2

使用matlab可以很方便地進行相機內參標定

首先看一下無畸變情況下,已知相機座標系內的乙個點[xc, yc, zc],通過內參矩陣求出該點在影象平面的投影點[u, v]。如下圖,其中m矩陣邊上相機的內參矩陣,x = xc / zc, y = yc / zc:

當相機存在畸變的時候,需要根據畸變模型修正(x, y)的值為(x』 , y』), 然後使 u = x』 * fx + ppx, v = y』 * fy + ppy。畸變模型如下圖,此處介紹的是brown-conrady 畸變模型:

其中k1,k2,k3稱為徑向畸變,由於不能製作出乙個理想數學模型的透鏡,光學中心畸變為0,越遠離中心,畸變效果越大;p1,p2稱為切向畸變,由於安裝透鏡過程中導致透鏡與影象平面不平行造成的畸變。

下面給出相應的**實現:

struct intrinsics

;void

project_point_to_pixel

(float pixel[2]

,const

struct intrinsics * intrin,

const

float point[3]

) pixel[0]

= x * intrin-

>fx + intrin-

>ppx;

pixel[1]

= y * intrin-

>fy + intrin-

>ppy;

}

有興趣的讀者可以檢視opencv原始碼「modules/imagproc/undistort.cpp」,  opencv矯正過程首先通過相機標定得到相機內參矩陣和畸變係數,然後對非畸變影象每個畫素計算其在畸變影象中的畫素位置,然後非畸變影象的畫素值通過雙線性插值來計算。函式cv::initundistortrectifymap就是非畸變影象每個畫素計算其在畸變影象中的畫素位置,檢視原始碼就能看出來其畸變模型使用的是上文介紹的brown-conrady 畸變模型。

參考:照相機定標和三維重建

void cv::

initundistortrectifymap

( inputarray _cameramatrix, inputarray _distcoeffs,

inputarray _matr, inputarray _newcameramatrix,

size size,

int m1type, outputarray _map1, outputarray _map2 )

;

相機的內參會改變嗎 相機內參和畸變引數進行校正程式

include using namespace std using namespace cv int test int argc,char ar videocapture capture 0 while 1 mat frame capture frame size image size image ...

相機內參外參

參考資料 說內參矩陣之前,還得再引入畫素座標系的概念。上述影象點的表示是長度單位,不是畫素,由於我們拿到的影象是以畫素來衡量的,因此還需要將影象座標系轉化為畫素座標系。在此直接給出結論 於是之前的相機矩陣又得新增一項 上述推導中有乙個假設前提,就是相機的感光元件是正方形的,感光元件的安裝也是通過光軸...

urdf中相機內參

multicamera name stereo camera 30.0 update rate left 1.3962634 horizontal fov 800 width 800 height r8g8b8 format image 0.02 near 300 far clip gaussian...