目录
前言
摄像机标定:
在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像(照片)中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数(内参、外参、畸变参数)的过程就称之为摄像机标定。
如下图,世界坐标系表示的就是现实中空间某物体的真实坐标(XwYwZw),并且单位是mm,长度单位。经过摄像机拍回来的图片呢,就变成了一个个离散的像素点(u,v),单位为pixel。两个不同的表达形式,两种单位,这是怎么转换的?这里面就涉及到H这个转换关系了,这个是神秘的H,就是我们要标定的重点(内参、外参、畸变参数),后面重点就是揭开它的面纱。
一:opencv自带的相机标定函数
先简单直观的看下opencv这个数字图像处理的库是怎么对相机进行标定的。
四步骤:
1.网上下载一个标定靶图片,自己打印一个,贴起来
2.换着角度换着相机位置,拍摄多幅标定靶的图片
3.写好程序,开始标定(这里有一个,奉献出来,链接见文末)
4.输出一堆结果数据
其中程序中很重要的一块,是利用了这个一个opencv标定工具包:
cvCalibrateCamera2( object_points,
image_points,
point_counts,//指定不同视图里点的数目
cvSize(image_width,image_height),
intrinsics,
distortion_coeff,
rotation_vectors,
translation_vectors,
0);
注释:
object_points中,InitCorners3D(object_points, ChessBoardSize, NImages, SquareWidth);
1.要已知ChessBoardSize=cvSize(ChessBoardSize_w,ChessBoardSize_h); 也就是棋盘格的X方向上的角点个数和Y方向上的角点个数;
2.NImages,:所有待标定的图片数目;
3.SquareWidth = 26.1,单个黑色正方形棋盘格子的边长单位mm。(如图所示)
抛弃其中繁琐的计算,细细思考一下这个过程:已知标定靶的横纵角点数量和每个黑色方格的物理长度squarewidth,就相当于知道了该标定靶棋盘格的所有物理参数,转换着位姿拍摄标定靶;然后在图像上得到各个物理世界角点所对应的像素坐标,最后生成一堆数据(内参、外参、畸变参数),即相机标定的结果H,也就是世界坐标系和像素坐标系的转换关系。
内参:顾名思义,摄像机内部的参数,是由于摄像机自身制造等原因造成独有的参数,和外部没关系,固有的。
外参:外部引入的,由于摄像机自身发生旋转,平移等的动作,就引入了外部的一些参数,是变化的。
畸变参数:理论上也归属于内参。
有了这些参数,就可以将世界坐标系和像素坐标系建立了关系,目的就是这个,后面将详细剖析这部分关系。
二:单目相机标定关系详解
如下图,就可以简述摄像机标定的整个过程了。下面我们一步一步的分析整个过程,开始吧。
1.世界坐标系到摄像机坐标系
- Ow−XwYwZw: 世界坐标系,单位mm
- Oc−XcYcZc:相机坐标系,单位mm
- o−xy:图像坐标系,单位mm
- uv-:像素坐标系,单位pixel
注释:
- Ow---建立世界坐标系的原点位置
- Oc---摄像机的光心
- P(Xw,Yw,Zw)---世界坐标系中的一点
- p---图像中的成像点,在图像坐标系中的坐标(x,y),在像素坐标系中的坐标(u,v)
- f---相机焦距,o与Oc的距离
言归正传,上面我们说到世界坐标系到摄像机坐标系经过的是刚体变换,何为刚体变换?
刚体变换:一幅图像中的两点间的距离,经过变换到另一幅图像中后仍然保持不变;那有什么变换形式呢?旋转,平移,镜像。
这里面就说到的就是旋转和平移,在坐标转换里面被称之为旋转矩阵R和平移矩阵T,表达的是世界坐标系原点与摄像机光心之间的关系。因其与摄像机无关,所以称这两个参数为摄像机的外参数。细细思考下,世界坐标系原点抛一个球,落在了摄像机坐标系原点上,这个球会发生了什么样子的变换呢?1.两点之间,位置变了,肯定会有距离关系,平移向量T也就是从世界坐标系的原点到光心的矢量;2.应该还会旋转。
这样就总结了两点:1.距离,因为在x,y,z的坐标系中,可以用向量形式表示空间中的任意一点;2.旋转,同样的x,y,z就绕着这三个轴进行旋转,也一样能表示任何一个旋转角度。这样就是平移矩阵T和旋转矩阵R的由来。R+T是不是就可以在三维空间中随心所欲的移动了,everywhere can go。
这里贴自己的笔记图片,丑了点,望见谅。
R=r1*r2*r3,其由三个方向的旋转角度共同决定,故具有三个自由度,也就是欧拉角(Roll, Pitch, Yaw)
注释:如果对其中绕各轴旋转矩阵具有感兴趣的,为什么采用正弦和余弦这样表示,查看这里有个视频,很清楚:旋转关系
2.摄像机坐标系到图像坐标系
何为透视投影(Perspective transformation):
定义:用中心投影法将形体投射到投影面上,从而获得一种较为接近视觉效果的单面投影图;
特点:近大远小,不平行于成像平面的平行线会相较于消隐点(vanish point)
举例:皮影戏
注释:摄像机坐标系到图像坐标系转化中,图像坐标乘以Z?等于摄像机坐标,其中Z?是摄像机光心到成像平面之间的场景中真实物体之间的距离。三维世界中物体的一点,对应着二维图像坐标系中的一个坐标,而二维图像坐标系中的一个坐标,对应着Z?=N,(N为自然数)的一系列三维世界中的点。这也就是引入双面视觉,用于策略Z?,从二维图像准确对应三维空间中一点的原因。
3.图像坐标系到像素坐标系
图像坐标系和像素坐标系的转换,是已经将物体投影到了成像平面上进行的二次转换。
回顾下:
世界坐标系中的一点,单位mm,经过R,T旋转平移矩阵后,转换到了摄像机坐标系,单位mm;摄像机坐标系经过透视变换,这一点坐标被转换到了图像坐标系,焦距f单位mm,转换后单位还是mm;下一步就是图像坐标系到像素坐标系的转换,像素坐标系下的单位是离散化的,单位pixel。这是怎么发生转换的呢?
带着这个问题,发现图像坐标系乘以另一个矩阵,就得到了像素坐标系下的坐标。其中,每个像素的物理尺寸大小为 dx * dy ,表示每一列和每一行分别代表多少mm,即1pixel=dx mm ,这样就将连续的图像坐标系转换到了离散的像素坐标系(u,v),如同这样:世界坐标系中的一个矩形框,在像素坐标系下,成了这个样子,后者也就是变成相机成像后的样子。
中间的所有变换矩阵呢,统称起来叫做单应性矩阵,如下图所示:
通常令最后一个元素h33为1或者使其F范数为1,其自由度为8;
理论上,8自由度的H我们至少需要4对对应的点(世界坐标系对应像素坐标系)才能计算出单应矩阵,至少需要四个点。这个时候知道opencv自带的相机标定函数cvCalibrateCamera2为什么需要知道标定靶的信息了吧。
vs2015的opencv相机标定:链接:https://pan.baidu.com/s/1-Gjf12sMuZHYCzqmas62Mg
提取码:7ypm