相機內參包括相機矩陣引數和畸變係數。
相機內參矩陣為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...