部分参考学习OpenCV 3 1
针孔模型:
− x / f = X / Z -x/f = X/Z −x/f=X/Z 在此作等价转换,将图像平面移至右边----相机o和物体P间,便于表达
而 芯片中心通常不在光轴上,引入两个新的参数 c x 和 c y c_x和c_y cx和cy, 对投影屏幕中心可能存在的偏移进行建模。
将世界坐标点 P ( X , Y , Z ) P(X,Y,Z) P(X,Y,Z)映射到相机平面上坐标点为 q ( x , y ) q(x,y) q(x,y) 的过程称为 “ 射影变换 ”,可简单表述为:
q ⃗ = M ⋅ P ⃗ , w h e r e \vec q = M· \vec P, \quad\quad where q=M⋅P,where
径向畸变 是由于透镜的形状(筒形)造成的;
切向畸变 是由整个相机的 组装过程 造成的,使透镜与成像平面不平行。
某点的径向位置可用 r = 0 r=0 r=0附近的泰勒级数展开式的前几项来描述。
共需要求出5个畸变系数,按顺序 k 1 , k 2 , p 1 , p 2 , k 3 k_1,k_2,p_1,p_2,k_3 k1,k2,p1,p2,k3
(1)外参数6个:R 旋转3个参数;T 平移3个参数;
(2)内参数4个: f x , f y , c x , c y ; f_x,f_y,c_x,c_y; fx,fy,cx,cy;
求解上述10个参数的前提是先假设每次的畸变参数为0;
(3)5个畸变参数: k 1 , k 2 , p 1 , p 2 , k 3 ; k_1,k_2,p_1,p_2,k_3; k1,k2,p1,p2,k3;
其中(2)(3)为摄像机内参数,其中k3普通镜头不使用,鱼眼镜头要使用。
先看 R, T :
相机拍摄的一个特定物体(世界坐标系),其相对于相机坐标系统的姿态可用 旋转 和 平移 进行描述。
三维旋转可拆解为绕每个轴的二维旋转,如依次绕 x , y , z x,y,z x,y,z轴旋转角度 φ , θ 和 ξ φ,θ和ξ φ,θ和ξ,则总的旋转矩阵R是 R x ( φ ) , R y ( θ ) , R z ( ξ ) R_x(φ), R_y(θ),R_z(ξ) Rx(φ),Ry(θ),Rz(ξ)三者的乘积。
因此 R 具有其逆矩阵等于其转置矩阵的特性, R ∗ R T = R T ⋅ R = I 3 R*R^T=R^T·R=I_3 R∗RT=RT⋅R=I3。
平移向量是以物体中心为原点的坐标系到以相机中心为原点的坐标系的偏移量,因此,相应的平移向量为 T ⃗ = o r i g i n o b j e c t − o r i g i n c a m e r a \vec T=origin_{object}-origin_{camera} T=originobject−origincamera,
则,点P在世界坐标系中可表述为 P ⃗ c = R ∗ ( P ⃗ o − T ⃗ ) . \vec P_c=R*(\vec P_o-\vec T). Pc=R∗(Po−T).
vector<Point2f> corners1, corners2;
bool found_1 = cv::findChessboardCorners(src_1, board_size, corners1);
bool found_2 = cv::findChessboardCorners(src_2, board_size, corners2);
Mat gray_img1;
cv::cvtColor(src_1, gray_img1, cv::COLOR_BGR2GRAY);
cv::cornerSubPix(gray_img1, corners1,
Size(5, 5), Size(-1, -1),
TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 50, 0.1));
// 存放当前左视图平面角点
img_pts1.push_back(corners1);
cout << "correct! " << img_path.c_str() << endl;
/* 在图像上显示角点位置*/
drawChessboardCorners(src_1, board_size, corners1, true); // 用于在图片中标记角点
imshow("Camera Calibration", src_1); // 显示图片
waitKey(500); //暂停0.5S
本征矩阵 (Essential Matrix):
基本矩阵(Fundamental Mat):
标定后立体校正的理想状态:
F i g . 2. Fig. 2. Fig.2. 双目相机测距原理图
焦距 f f f, 基线 B a s e l i n e ( b ) Baseline(b) Baseline(b)
b Z = b − ( X R − X T ) Z − f \frac{b}{Z} = \frac{b-(X_R-X_T)}{Z-f} Zb=Z−fb−(XR−XT) 深度Z,视差 d d d
Z = f b d , w h e r e d = X R − X T Z=\frac{fb}{d}, \quad where \quad d=X_R-X_T Z=dfb,whered=XR−XT
注意事项:
1 2
学习OpenCV 3 清华大学出版社 ↩︎
mermaid语法说明 ↩︎