大家好,又见面了,我是你们的朋友全栈君。
目录
为什么需要相机标定?
相机标定可以做什么?
相机标定后可以得到什么?
什么情况下需要借助相机标定的方法?
相机标定的原理
实现相机标定的方法
- 为什么需要相机标定?
- 一个是由于每个镜头的在生产和组装过程中的畸变程度各不相同,通过相机标定可以校正这种镜头畸变,生成矫正后的图像——矫正透镜畸变;
- 另一个是根据标定后的到的相机参数建立相机成像几何模型,由获得的图像重构出三维场景。具体来说:当我们用摄像机拍照时,从照片里得到一些空间信息(比如距离,尺寸等),是要利用二维图像得到三维信息。我们拍照的时候把空间物体信息通过摄像机变成了二维图像,这个过程本来是不可逆的。但如果我们可以找到一个摄像机的数学模型,就可以 :从二维图像 模型逆推得到原来三维信息。标定就是在找这个模型。
- 相机标定可以做什么?
- 相机在出厂之前都需要进行相机标定,用软件的方法校正生成的图像,避免拍摄出的图像产生桶形和枕形畸变;
- 根据相机成像的几何模型,将世界坐标系中的3D物体映射到2D成像平面上;
- 求解多个相机对之间的映射关系。
- 相机在出厂之前都需要进行相机标定,用软件的方法校正生成的图像,避免拍摄出的图像产生桶形和枕形畸变;
- 相机标定后可以得到什么?
- 相机的内参矩阵A(dx,dy,r,u,v,f),外参矩阵[R|T]、畸变系数[k1,k2,k3,~,p1,p2,~]。
- •内参矩阵各元素意义:一个像素的物理尺寸dx和dy,焦距f,图像物理坐标的扭曲因子r,图像原点相对于光心成像点的的纵横偏移量u和v(像素为单位)。
- •外参矩阵:世界坐标系转换到相机坐标系的旋转R和平移T矩阵。 •畸变系数:包括相机的径向畸变系数k1,k2,k3,~,和相机的切向畸变系数p1,p2,~。
- 什么情况下需要借助相机标定的方法?
- 所有辅助摄像头的系统,需要根据捕获的图像重构出三维场景,如单目或双目测距,三维重建,SLAM,AR等。
- 相机标定的原理
- 四个坐标系:
- 世界坐标系(world coordinate system):用户定义的三维世界的坐标系,为了描述目标物在真实世界里的位置而被引入。单位为m。 相机坐标系(camera coordinate system):在相机上建立的坐标系,为了从相机的角度描述物体位置而定义,作为沟通世界坐标系和图像/像素坐标系的中间一环。单位为m。 图像坐标系(image coordinate system):为了描述成像过程中物体从相机坐标系到图像坐标系的投影透射关系而引入,方便进一步得到像素坐标系下的坐标。 单位为m。 像素坐标系(pixel coordinate system):为了描述物体成像后的像点在数字图像上(相片)的坐标而引入,是我们真正从相机内读取到的信息所在的坐标系。单位为个(像素数目)。
1.从世界坐标系到相机坐标系 3D->3D
其中,R为旋转矩阵,t为平移向量,因为假定在世界坐标系中物点所在平面过世界坐标系原点且与Zw轴垂直(也即棋盘平面与Xw-Yw平面重合,目的在于方便后续计算),所以zw=0,可直接转换成式1的形式。其中变换矩阵
即为前文提到的外参矩阵,之所称之为外参矩阵可以理解为只与相机外部参数有关,且外参矩阵随刚体位置的变化而变化。
2.从相机坐标系到理想图像坐标系(不考虑畸变) 3D->2D
这一过程进行了从三维坐标到二维坐标的转换,也即投影透视过程(用中心投影法将形体投射到投影面上,从而获得的一种较为接近视觉效果的单面投影图,也就是使我们人眼看到景物近大远小的一种成像方式)。
3.从理想图像坐标系到实际图像坐标系(考虑畸变):
透镜的畸变主要分为径向畸变和切向畸变(还有薄透镜畸变等等,但都没有径向和切向畸变影响显著,所以我们在这里只考虑径向和切向畸变)。
径向畸变是由于透镜形状的制造工艺导致。且越向透镜边缘移动径向畸变越严重。实际情况中我们常用r=0处的泰勒级数展开的前几项来近似描述径向畸变。矫正径向畸变前后的坐标关系为:
•xcorrected = x(1 k1r2 k2r4 k3r6)
•ycorrected = y(1 k1r2 k2r4 k3r6)
由此可知对于径向畸变,我们有3个畸变参数需要求解。
切向畸变是由于透镜和CMOS或者CCD的安装位置误差导致。切向畸变需要两个额外的畸变参数来描述,矫正前后的坐标关系为:
•xcorrected = x [ 2p1y p2 (r2 2x2) ]
•ycorrected = y [ 2p2x p1 (r2 2y2) ]
由此可知对于切向畸变,我们有2个畸变参数需要求解。
综上,我们一共需要5个畸变参数(k1、k2、k3、p1和p2 )来描述透镜畸变。
注意:
4.从实际图像坐标系到像素坐标系:
由于定义的像素坐标系原点与图像坐标系原点不重合,假设像素坐标系原点在图像坐标系下的坐标为(u0,v0),每个像素点在图像坐标系x轴、y轴方向的尺寸为:dx、dy,且像点在实际图像坐标系下的坐标为(xc,yc),于是可得到像点在像素坐标系下的坐标为:
化为齐次坐标表示形式可得:
若暂不考虑透镜畸变,则将式2与式5的转换矩阵相乘即为内参矩阵M:
之所以称之为内参矩阵可以理解为矩阵内各值只与相机内部参数有关,且不随物体位置变化而变化。
最后用一幅图来总结从世界坐标系到像素坐标系(不考虑畸变)的转换关系:
实现相机标定的方法
MATLAB(matlab calibration toolbox-Matlab标定工具箱使用(单目标定和双目标定)
OpenCV标定函数 cv::calibrateCamera(…);
具体实现方案:
棋盘是一块由黑白方块间隔组成的标定板,我们用它来作为相机标定的标定物(从真实世界映射到数字图像内的对象)。之所以我们用棋盘作为标定物是因为平面棋盘模式更容易处理(相对于复杂的三维物体),但与此同时,二维物体相对于三维物体会缺少一部分信息,于是我们会多次改变棋盘的方位来捕捉图像,以求获得更丰富的坐标信息。
下面将依次对刚体进行一系列变换,使之从世界坐标系进行仿射变换、投影透射,最终得到像素坐标系下的离散图像点,过程中会逐步引入各参数矩阵。
标定图片需要使用标定板在不同位置、不同角度、不同姿态下拍摄,最少需要3张,以10~20张为宜。标定板需要是黑白相间的矩形构成的棋盘图,制作精度要求较高,如下图所示:
常用术语
标定步骤:
1、打印一张棋盘格,把它贴在一个平面上,作为标定物。 2、通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向的照片。 3、从照片中提取棋盘格角点。 4、估算理想无畸变的情况下,五个内参和六个外参。 5、应用最小二乘法估算实际存在径向畸变下的畸变系数。 6、极大似然法,优化估计,提升估计精度。
图片大小要一致,最好加入20张左右为佳,加入完成后点击Calibrate
返回到命令窗口,即可看到相机参数,在命令行输入cameraParams.IntrinsicMatrix
可得到内参矩阵和径向畸变
查看标定结果和程序
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/140258.html原文链接:https://javaforall.cn