基于OpenCV的立体相机标定StereoCalibration与目标三维坐标定位

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013626386/article/details/51939952

说明:以下涉及到的一些公式以及图片来自于Learning OpenCV。

做了快2个月的立体相机标定,遇到了一些问题,也有了一些体会,在这里记下来。

1.在做立体相机标定的时候,标定板的规范与否直接影响到最后标定的结果,进而会影响目标3D坐标重建。

这里说的规范指的是,打印的棋盘格(或者圆点)需要保证每个square都是严格大小一致的,即打印出来后每个棋盘格大小应一样;打印出来的棋盘格要尽量平整的附在某一平面或者玻璃板上,然后才能用来拍摄标定图像;测量squareSize的时候,要尽可能的精确,也就是说,棋盘格的实际物理尺寸对标定结果影响很大。

对左右相机出来图像要有深刻的理解,左图的目标处于相对偏右的位置,左右相机出来的图像千万不要弄反了,建议选取10对以上的图像对做标定。

2.立体相机标定的一些概念

2.1.相机投影

像素平面上的点q(x,y)与世界中的点Q(X,Y,Z)的变换对应关系为:

x = fx(X/Z)+cx,y = fy(Y/Z) + cy;

写成矩阵的形式:

2.2.透镜畸变

理论上面可能定义一种透镜而不引入任何畸变,但是在实际制造中会引入透镜畸变。径向畸变来自于透镜的形状,切向畸变则来自于整个摄像机的组装过程。 其他形式的畸变基本可以忽略,在OpenCV标定的过程中,也只针对这两种畸变做处理。

径向畸变示意图如上,其畸变矫正建模如下:

x_corrected = x(1+k1*r²+k2*r^4+k3*r^6);

y_corrected = y(1+k1*r²+k2*r^4+k3*r^6).

(x,y)为畸变点在成像仪上的原始位置,(x_corrected,y_corrected)为矫正后的新位置,标定中,k1,k2,k3为畸变内参。


切向畸变示意图如上,其畸变矫正建模如下所示:

x_corrected = x + [2*p1*y+p2*(r^2+2x^2)]

y_corrected = y + [p1*(r^2+2*y^2)+2*p2*x]

标定中,p1,p2为畸变内参。

2.3.立体成像stereo imaging

通过上面的三角关系,利用简单的相似三角形知识,就可以得到

T-(xl-xr) : (Z-f) = T : Z ==> Z = f*T/(xl - xr)

f为焦距,T为baseline,(xl - xr)为视差,可知求取深度信息只与这三个值有关。

深度与视差成反比例关系,当视差接近0时,微小的视差变化会导致很大的深度变化,当视差较大时,微小的视差变化几乎不会引起很大的深度变化。

通过相机标定,我们最终要将摄像机在数学上对准到同一个观察平面上,从而使得摄像机之间的像素行是严格平行的。

2.4.对极几何

立体成像的基本几何就是对极几何,运用对极几何的最终目的是为了尽可能的缩小两台立体摄像机上匹配点出现的可能范围。

说明几点:

1.摄像机视图内的每个3D点都包含在极面内,极面与每幅图像相交的直线是极线,

2.指定一个图像上面的特征,它在另一幅图像上的匹配视图一定在对应的极线上,这就是“对极约束”,

3.有了对极约束之后,意味着对二幅图像间特征匹配的二维搜索转变成了沿着极线的一维搜索,这不仅节约了时间,还可排除大量的虚假匹配,

4.不同特征的次序时保留的,如果A,B在两成像仪中都可见,按顺序水平出现,那么在另一成像仪上也是水平出现。

2.5.本征矩阵E与基础矩阵F

本征矩阵E是单几何意义上的,与成像仪无关,它将左摄像机观测到的点P的物理坐标与右摄像机观测到的相同位置的点关联起来。

基础矩阵F则是将一台摄像机的像平面上的点的像素坐标和另一台摄像机像平面上的点关联起来。

2.6.重投影矩阵

给定屏幕坐标以及内参矩阵,二维点同样可以重投影到三维世界中,

三维坐标就是(X / W , Y / W , Z / W).

3.立体标定stereo calibration

具体参照OpenCV自带的stereo_calib demo;

在对标定板进行拍摄时,目标棋盘要尽可能清晰,设备分辨率越高对检测棋盘格角度越精确,棋盘格要以不同姿态摆放,且棋盘格的运动范围要覆盖所有图像区域,这样才能够保证标定的参数结果是针对几乎所有位置的像素进行标定得到的。

3.1.输入立体图像对文件:stereo_images.xml

<?xml version="1.0"?>

<opencv_storage>

<imagelist>

"left01.bmp" "left02.bmp" ...

</imagelist>

</opencv_storage>

注意:"left01.bmp" "left02.bmp" 两个文件名中间要有空格

3.2.输入squareSize:实际的棋盘格大小mm

测量要精确,毕竟网上卖的玻璃棋盘板都是号称准确度为0.001mm。

3.3输出文件:intrinsic.yml, extrinsic.yml

4.参数解释

intrinsic params内参

M1,M2--内参矩阵

       [fx  0  cx;

M = 0  fy   cy;

       0  0   1]

D1,D2--畸变向量

D = (k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])

k为径向畸变,p为切向畸变.

extrinsic params外参

R--右相机相对左相机的旋转矩阵

T--右相机相对左相机的平移矩阵

R1,R2--左右相机校准变换(旋转)矩阵

P1,P2--左右相机在校准后坐标系中的投影矩阵

Q--视差-深度映射矩阵,我利用它来计算单个目标点的三维坐标

5.三维坐标计算

step1. 立体相机标定,获取相机系统内外参数

step2. 获取目标点在左右成像平面上的像素坐标

step3. 利用标定参数对像素坐标进行校准undistortPoints

step4. 利用重投影矩阵计算目标三维坐标

三角关系计算坐标原理图示:




展开阅读全文

没有更多推荐了,返回首页