相机标定与手眼标定

1 相机标定简介

        在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的 相互关系,必须建立摄像机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通 过实验与计算才能得到,这个求解参数的过程就称之为相机标定。

        如前所述,相机标定中需要确定以下几个未知数:

        (1)内参矩阵 4 个参数:f/dx, f/dy, u0, v0;

        (2)外参矩阵 6 个参数:平移旋转各 3 个参数

        (3)畸变参数 5 个:径向畸变 3 个 k1,k2,k3,切向畸变 2 个

2 相机标定常用方法

        根据标定过程的数学模型,相机标定可以分为:

2.1 线性标定方法

        线性标定不考虑相机畸变,仅通过线性方程求解出相机的内外参数。

         使用最小二乘法求解上述矩阵。

2.2 非线性标定方法

        当镜头畸变明显时必须引入畸变模型,将线性标定模型转化为非线性标定模型,通过非线性优化方法求解相 机标定参数。

 2.3 Tsai 标定方法

        Tsai 基于 RAC 约束(RadialAlignment Constrain)提出的两步法,首先利用最小二乘法求解超定线性方程组, 求得模型外部参数;然后求解内部参数,如果摄像机无透镜畸变,可通过一个超定线性方程组解出,如果存在一 个以二次多项式近似的径向畸变,则利用一个包含三个变量的目标函数进行求解。

2.4 张正友标定法

        张正友标定法的基本原理:使用二维方格组成的标定板进行标定,采集标定板不同位姿图片,提取图片中角 点像素坐标,通过单应矩阵计算出相机的内外参数初始值,利用非线性最小二乘法估计畸变系数,最后使用极大 似然估计法优化参数。

        该方法介于摄影标定法和自标定法之间,既克服了摄影标定法需要的高精度三维标定物的缺点,又解决了自 标定法鲁棒性差的难题。标定过程仅需使用一个打印出来的棋盘格,并从不同方向拍摄几组图片即可,任何人都 可以自己制作标定图案,不仅实用灵活方便,而且精度很高,鲁棒性好。因此很快被全世界广泛采用,极大的促 进了三维计算机视觉从实验室走向真实世界的进程。

 3 坐标系转换

        在进行相机标定前,需要线了解一下四个坐标系:

                世界坐标系:Ow-XwYwZw,物理空间,单位 mm

                相机坐标系: Oc-XcYcZc,透镜光心为原点,单位 mm

                图像坐标系:o-xy,成像平面中心为坐标系原点,单位 mm

                像素坐标系:o-uv,图像左上角为坐标系原点,单位 像素

 

 3.1 像素坐标系和图像坐标系转换

        如下图所示,Ouv 为像素坐标系,Oxy 为图像坐标系,图像坐标系和像素坐标系单位不一致,但能根据传感 器处理数字信号生成图片的变换关系构建联系。

 3.2 图像坐标系和相机坐标系转换

        如下图所示,Oc 为镜头光心,Oc-XcYc 为相机坐标系。通过小孔成像原理,传感器平面可以转换到光心和物 体之间,Oxy 为图像坐标系。物体成像原理就如图所示,物体 P 在传感器上的位置及为 p(x,y)。通过三角形相 似原理,可以得出如下关系。

3.3 相机坐标系和世界坐标系转换

        相机坐标系和世界坐标系都是空间直角坐标系,如下图所示,从相机坐标系变化到相机坐标系属于刚体变换, 物体不会发生形变,只需要进行旋转和平移。

3.4 像素坐标系和世界坐标系关系

        根据前面每个坐标系之间的关系,将其串联可以得出像素坐标系和世界坐标系关系。 

dx, dy 为像元尺寸,分别表示一个像素的物理宽度和高度。

fx = f/dx, fy = f/dy,分别称为 x 轴和 y 轴上的归一化焦距。 

4 相机畸变

        根据针孔模型,物体和成像之间参数会满足相似三角形的关系。但现实中会存在装配误差和透视失真等原因, 导致这种关系无法成立,使理想成像与实际成像存在误差,这种误差即称为畸变。

         针孔相机模型是一个射线方程模型前面所诉关系是在无镜头畸变的条件下建立的,但是实际上存在镜头畸 变,可以理解成像点和物点之间的光线是弯曲的,要得到射线模型,要进行消除畸变。

        畸变主要分为:径向畸变和切向畸变

4.1 径向畸变

        径向畸变字面意思是图像坐标产生径向位置的误差,是由镜头形状缺陷造成的。 径向畸变效果可以分为枕型畸变、桶形畸变,示意图如下所示。

         r=0 处的泰勒展开公式:

        其中,Xdr,Ydr 为畸变后像素坐标,x, y 为理想坐标

        k1,k2,k3 分别为径向畸变的一阶、二阶、三阶参数。

4.2 切向畸变

        切向畸变一般是由透镜和芯片的安装位置误差引起的,导致透镜和成像平面不平行。

        切向畸变公式如下: 

        其中,Xdt, Ydt 为畸变后像素坐标,x, y 为理想坐标,p1, p2 为切向畸变参数。 

4.3 畸变矫正

        通过上面介绍的径向畸变和切向畸变模型,可以得到两个模型最终作用于真实图像后的矫正模型。

        除了径向畸变和切向畸变模型之外,还有薄棱镜畸变,该畸变是由镜头设计缺陷和加工误差导致的,随着加 工制造工艺的提升,该畸变可以忽略。 

        其中 s1,s2 为畸变参数 

5 相机标定实现

        针孔相机模型中,只要确定这 9 个参数 fx, fy, u0, v0, k1, k2, k3, p1, p2 就可以唯一的确定针孔相机模型,这 个过程就称为「相机标定」。

        其中前 4 个为相机内参,后 5 个为畸变参数,畸变参数是为了补充内参的。

        所以一旦相机结构固定,包括镜头结构固定,对焦距离固定,我们就可以用这 9 个的参数去近似这个相机。 这里说的「镜头结构固定」,除了焦距固定之外,也应当包含光圈固定,因为改变光圈的大小,除了景深之外, 是有可能改变针孔相机模型中的光心位置,这意味着标定好的相机如果改变光圈大小,会使得标定误差变大但应 该不会大到难以接受的地步。

        因此,相机标定的任务就变成了找出一大堆具有对应关系的像点和物点,求解上述参数的过程。 在此引入标定板。标定板有两大作用:第一,确定物点和像点的对应性;第二把标定板中的角点变换到相机坐标 系下的坐标。

        广泛应用的是棋盘格和圆点格,这两种之所以成为主流,不仅是因为它们的拓扑结构明确且均匀,更重要的 是检测其拓扑结构的算法简单且有效。

        棋盘格检测的是角点,只要对拍摄到的棋盘格图像横纵两个方向计算梯度就可获得;而圆点格的检测只需要 对拍摄到的圆点格图样计算质心即可。

5.1 棋盘格角点获取

        圆点格的效果应该是好于棋盘格,因为圆点质心的透视不变性要比棋盘格的角点稳定的多。但是圆点格的检 测是 Halcon 的专利,因此 OpenCV 和 Matlab 标定工具箱用的是棋盘格。

        下面以 OpenCV 和棋盘格为工具对相机进行标定。

        标定板中的每个角点,在标定板坐标系下的位置是确定并且是已知的。因此将每张标定板的左上角角点作为 世界坐标系,这样在相机拍得标定板图片时,既可以计算得到角点的世界坐标系位置,也可以得到对应角点在像 素坐标系中的位置。

        OpenCV 中提供了角点检测方法 findChessboardCorners( ) 以及亚像素精细化角点位置优化函数 cornerSubPix( ) 用于棋盘格角点坐标检测。OpenCV 也有相对应的圆点棋盘格圆心检测函数 findCirclesGrid( ) 用于 圆点棋盘格。

5.2 相机标定参数计算

        OpenCV 中提供了相机标定函数 calibrateCamera( ),输入角点对应的世界坐标系坐标和像素坐标系坐标以及 图片尺寸数据,便可以计算出相机内参矩阵、畸变系数、外参矩阵等结果。

        相机标定的外参是标定内参的副产品,它会随着标定板的摆放不同而不同。外参表示相机坐标系和世界坐标 系之间的旋转平移变换关系,这个坐标系的变换是一个线形变换,意味者标定板必须尽可能的平,如果标定板不 平,这个变换就不是线形的了,会影响标定精度。

        使用 OpenCV 进行标定,需要给出棋盘格的物理尺寸,这其实就是在建立标定板坐标系,从测量的角度讲, 标定板的精度是相机标定精度的基准,是误差传递链上的第一个环节

        所以为了使针孔相机模型更逼近真实相机,对标定板的质量有以下要求(按重要性顺序):                 (1) 标定板的平面度高,棋盘格是直角;

                (2) 标定板每个格子尺寸的高一致性;

                (3) 真实尺寸与标称尺寸的差异小。 

6 手眼标定

        手眼系统就是人眼睛看到一个东西的时候要让手去抓取,就需要大脑知道眼镜和手的坐标关系。手眼标定的 目的就是获取机器人坐标系和相机坐标系的关系,将视觉识别的结果转移到机器人坐标系下。

        在标定时,一般在工作平面设置一个世界坐标系,该坐标系与机器人坐标系不重合,在完成相机的内外参标 定后,可计算获得物体在该世界坐标系中的坐标。若需要机器人与视觉联动,需要把物体在该世界坐标系中的坐 标转化到在机器人坐标系中的坐标。

        手眼标定行业内分为两种形式,根据相机固定的地方不同,如果相机和机器人末端固定在一起,就称之为“眼 在手”(eye in hand),如果相机固定在机器人外面的底座上,则称之为“眼在外”(eye to hand)。

6.1 眼在手上

        将相机固定在机器人法兰盘上,这种关系下,每次运动,机器人底座和标定板的关系始终不变。求解的量为 相机和机器人末端坐标系的位姿关系。

        标定过程:标定板 放置在 固定位置 ,机器人变换不同的姿态,相机获取 不同姿态下的 标定板图像。 下图中描述了 闭环的坐标系空间关系 ,包含以下部分:

 6.2 眼在手外

        将相机安装在一个固定不动的位置,而标定板被固定在法兰盘上。这种关系下,每次运动,机器人法兰盘和 标定板的位姿关系始终不变。求解的量为相机和机器人底座坐标系之间的位姿关系。

        标定过程:相机 安装在机械手外的 固定位置 , 标定板 安装在 机器人末端位置 ,标定过程中机器人变换 不同的位姿,相机分别拍摄不同位姿下的标定板图像。 下图中描述了

6.3 九点标

        如果不考虑 3D 位姿,只在平面内操作,可以考虑使用九点标定法。

        九点标定法只能识别 x,y 坐标,属于 2D 平面标定,在标定过程中 z 是未知的,但也是固定的。在 2D 平面 范畴内,九点标定法的精度是优于前者的。

        九点标定法主要是利用仿射变换原理来确定图片像素坐标系和机器人工作平面坐标系之间的映射关系。

        首先了解一下图像的仿射变换原理:

        图像的几何变换包含很多变换,其中有一些基本变换,如:平移(Translation)、缩放(Scale)、旋转(Rotation)、 翻转(Flip)和错切(Shear)。而仿射变换和透视变换就是对这些基本变换进行组合实现的。

        仿射变换(Affine Transformation)是指在向量空间中进行一次线性变换(乘以一个矩阵)和一次平移(加上一个 向量),变换到另一个向量空间的过程。

        仿射变换代表的是两幅图之间的映射关系,仿射变换矩阵为 2x3 的矩阵,如下图中的矩阵 M,其中的 B 起着 平移 的作用,而 A 中的对角线决定 缩放,反对角线决定 旋转 或 错切。

        所以仿射变换可以由一个矩阵 A 和一个向量 B 给出: 

        原像素点坐标(x,y),经过仿射变换后的点的坐标是 T,则矩阵仿射变换基本算法原理 

        所以仿射变换是一种二维坐标(x, y)到二维坐标(u, v)的线性变换,其数学表达式如下:

        仿射变换保持了二维图像的“平直性”和“平行性”:

                 平直性,即: (1)直线经仿射变换后还是直线。

                                        (2)圆弧经仿射变换后还是圆弧

                平行性,即:  (1)直线之间的相对位置关系保持不变。

                                        (2)平行线经仿射变换后依然为平行线

        经过仿射变换后,直线上点的位置顺序不会发生变化,向量间夹角可能会发生变化。

        基于仿射变换的上述特性,使用仿射变换矩阵来表达像素坐标系和机器人坐标系之间的映射关系。 OpenCV 中有提供相应的函数用来计算仿射矩阵:

        (1)getAffineTransform(imgPoints, rbtPoints) 三对点

        (2)estimateAffine2D(imgPoints, rbtPoints) RANSAC

        使用时注意标定板要准确放置在工作平面上,控制机器人 tcp 依次走过标定板九个点,同时识别图片中相应 的九个点坐标,传入函数即可计算出相应的仿射变换矩阵。

7 双目相机标定

        单目相机标定得出内参、外参、畸变参数,能将三维空间坐标映射到 2D 图片中,但反之则不能恢复到三维 空间里。因为 Zc 是没法得到的。那么怎么才能获得深度信息呢,一种方法就是用两个摄像头,利用三角测量。

         三角测量理想模型如下图所示,有两个焦距都为 f 的相机,两相机拍摄图片位于同一平面且 x 轴共线,两相 机光轴方向平行。假设 Ol Or 是他们各自的光心,相距为 T,Xl Xr 为空间点 P 在左右相机拍摄图片上的 X 轴方向 像素坐标。

         根据公式可以看出,两个相机位置固定之后,距离 Z 只与 xl-xr的差值有关,该差值即为视差。 但是上述公式是在理想状态下推演出来的,相机安装后也不可能符合理论状态。安装后,相机之间一般存在着旋 转和平移误差,如下图所示。

        所以,我们想要利用视差计算 Z 值,就需要将相机调整为理想状态。在此引入双目相机标定的目标:

        (1)确定两个相机各自的内参矩阵和畸变系数矩阵。

        (2)确定两个相机之间的旋转量和平移量。

        (3)对两个相机图像进行矫正。

        在进行完上述双目相机标定的三个操作之后,便可以进行利用视差求解深度 Z。 

7.1 计算两个相机之间的旋转量和平移量

        基线:两个光心的连线称为基线;

        极平面:物点(空间点 M)与两个光心的连线构成的平面称为极平面;

        极线:极平面与成像平面的交线

        极点:极线的一端,基线与像平面的交点

        像点:极线的一端,光心与物点连线与像平面的交点; 

 7.2 双目相机图像校正

        双目相机标定后,我们得到了右相机相对于左相机的位姿关系,也就是 R、T 矩阵,下面一步即做极线校正。 校正好处是之后做立体匹配搜索的时候,只需要在同高度附近进行搜索,大幅提升效率。

        校正的方法有很多,可以左相机不动,右相机动;也可以两部相机旋转到中间等等。最常见的校正方法就是 Bouguet 极线校正方法。

        Bouguet 极线校正方法:左右相机成像平面各旋转一半,使得左右图像重投影造成的误差最小,左右视图的 共同面积最大。

        OpenCV 也有提供用于双目视觉校正函数:

         stereoRectify( )函数根据双目标定结果计算两个相机校正的旋转矩阵。

         initUndistortRectifyMap( )函数用于计算校正映射矩阵。

        remap( )函数根据映射矩阵对图像就行校正映射。

         校正后,左右两图中棋盘格已经处于统一水平高度了,棋盘格在图中的位置只有左右的偏移。 这样只需在同一行上搜索左右像平面的匹配点即可,能使效率大大提高 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值