相机标定的基本原理与改进方法
1、相机模型
(1)各个坐标系
确定空间某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型(各个坐标系),这些坐标系之间的转换参数就是相机参数,求解参数的过程叫做相机标定(摄像机标定)。建立立体视觉系统所需要的各个坐标系,包括世界坐标系、相机坐标系、以及图像坐标系(物理和像素坐标系)。
首先明确各个坐标系之间的转换关系:
① 世界坐标系与相机坐标系
这是将一个三维的坐标系转换成另一个三维的坐标系,这两个坐标系之间的转换属于刚体转换,物体只改变在两个坐标系中的空间位置(平移)和朝向(旋转),而不改变其形状。它们之间的转换关系可以用旋转矩阵R和平移矩阵T来完成,这两个矩阵反映了世界坐标系与相机坐标系之间的转换关系,合称外参矩阵Lw。获得了外参矩阵,这样已知世界坐标系中的一点通过转换关系就可以得到此点在相机坐标系的位置,反之亦成立。
② 相机坐标系与图像物理坐标系
这是一个将三维的坐标系转化为二维的坐标系,这两个坐标系之间的转换要通过几何投影模型关系获得,下面是两个坐标系的投影关系示意图:
③ 图像物理坐标系与图像像素坐标系
首先以一个形象的例子来说明两个坐标系间的区别。物理坐标系是一个连续的概念,它是以毫米为单位,就好比某一观众在电影院里的具体坐标值(3.4,5.9);而像素坐标系是一个离散的概念,它是以像素作为单位,只能是整数值坐标,就好比某一观众在电影院里的位置是(第三排,第六列)。另外还需要注意的是,这两个坐标系的原点位置也不相同,物理坐标系将原点定为摄像机光轴与图像物理坐标系的交点位置,通常称其为主点;而像素坐标系则以像素图像的左上角为原点。
(2)相机畸变模型
一般只考虑径向畸变k和切向畸变p
其中。
一般选择2或3个k值,这个是经验证过可以获得较好的结果,如果k取得再多影响不会很大可以忽略,甚至可能反而导致效果不好。
畸变模型:枕型畸变(k>0)和桶型畸变(k<0)
当k>0时,r越大(点离中心越远),畸变量越大,r越小,畸变量越小,呈枕型。
当k<0时,r越大(点离中心越远),畸变量越小,r越小,畸变量越大,呈桶型。
(3)相机标定参数
内参:
单位长度的像素个数:fx、fy
主点坐标:cx、cy
畸变系数:k1、k2、k3、p1、p2
外参:R、T
2、张正友标定法
(1)标定基本原理
目标函数:
这里A为内参,R、T为旋转平移矩阵。n代表n张图片,m代表每张图片上有m个角点。
可以将三维空间中的点都投影到二维空间的对应点m^处,在二维平面上通过角点提取算法可以提取出对应角点。通过选择合适的内外参数来使得目标函数达到最小,将这一组内外参数作为实际求得的内外参数。
提出问题:为什么张正友没有使用这样一种简单直观的方式?
因为这样做要优化的量太多,如果初始值不好很容易陷入局部最优。
张正友的贡献:通过数值解法解出了一个比较准确的初始值(内外参),使得后面做最优化的方法有一个非常好的初始值,所以结果比较准。
(2)张正友标定原理
先求解单应性矩阵H,根据单应性矩阵求解相机的内外参,这里不做详细过程介绍。张正友标定法通过代数求解出了一个代数意义上的内外参最优解,最后也需要将多组代数意义上的最优解代入目标函数中验证,获得物理意义上的最优解。
也可以将畸变因子考虑在内,做进一步优化,目标函数就变为如下形式:
3、一些改进
(1)明确张正友的方法没有限制棋盘格或者圆环。
只要可以检测出需要的特征点就可以,至于图案形状是没有限制的。
(2)圆环与棋盘格的优缺点分别是什么
圆环标定板的精度会好一些,原因是因为圆的特征检测(提取圆心坐标)的鲁棒性要比正方形的特征检测(检测边缘的交点作为角点)好。
(3)比较圆环与棋盘格标定板
圆检测精度高,表现为中心拟合精度高,但是具有偏心误差,这是由于空间中的圆的圆心投影不等于投影出的椭圆的圆心。
棋盘格检测精度低,可能是因为实际的棋盘格标定板的边缘存在过渡带,不是直接的由白瞬间变黑,但不存在偏心误差,这是由于空间中两条相交直线的交点,投影到二维图像上仍然是这两条投影直线的交点,故棋盘格检测不存在偏心误差。。
解决办法:可以将椭圆先投影为正圆,检测正圆的圆心,再通过透视投影的方法将其对应到原图像中,而不是检测椭圆的中心,通过这样一个变换把真实的圆心提取出来,这样就不存在偏心误差了。
以下是使用棋盘格标定板和圆环标定板的实验数据:
(4)标定板选择
如果知道怎么纠正偏心误差,用圆环标定板的精度一定会更高;如果不知道如何纠正偏心误差,则选择圆环标定板和棋盘格标定板的精度差不多或更差。
4、实际操作
(1)OpenCV中的函数cv::calibrateCamera
calibrateCamera(
object_points,//3维物点坐标
image_points,//通过角点检测出的2D像点坐标
imageSize,//图片尺寸
cam_intr_para,//相机内参
distCoffs,//相机畸变矩阵
rvecs,//旋转矩阵
tves//平移矩阵
)
(2)拍摄机位和数量的选择
至少需要拍不同视角的3张照片,大概需要拍20张不同视角照片,照片最好覆盖图像的每一个位置,不能只固定在中间位置上拍摄。
(3)标定结果的评判标准
重投影误差Re-projection error
用目标函数,将三维物点投影至二维图像中与二维图像中提取出的对应角点坐标做某种差值计算(目标函数)求和。
提出问题:重投影误差是否可以完全正确的反应出标定(内外参)结果是否正确?
不一定,这个重投影误差还受以下因素影响:
①图像角点检测精度,如果角点检测精度差,会直接影响到重投影误差;
②相机本身存在噪声,相机抖动;
③与相机分辨率有关,由于单位是像素。在其它条件一致的情况下,分辨率越大的相机,它的像素越密集,得到的重投影误差也会大;
④优化算法
其它评判标准:
选择两个三维的点,将其投影在二维图像上,计算这两个点的距离。用角点检测算法在这个图像上检测出对应点,也计算这两个像点之间的距离。判断两个距离的偏差。
(4)应用
①单目:PnP问题
根据三维标定靶与二维平面之间的对应点坐标,求解三维标定靶与二维平面之间的转换关系(旋转和平移矩阵)。
在OpenCV中可通过函数solvePnP实现。
②双目测量
用两个相机拍摄的图片中可以恢复三维信息,这是由于二维图片中的一点对应于三维空间中的一条射线,由两条射线的交点可以确定这个点在三维空间中的位置。
上一篇: Allan方差分析
下一篇: .NET运行时中的监测和可观测性
推荐阅读
-
framework7的改进,以及与vue组合使用遇到的问题以及解决方法 (附vue的原理)
-
老相机的测光与对焦 老相机使用方法介绍
-
致导TransDrone A4无人机与GoPro 相机的配对方法
-
framework7的改进,以及与vue组合使用遇到的问题以及解决方法 (附vue的原理)
-
老相机的测光与对焦 老相机使用方法介绍
-
基于kalibr的xtion pro live 相机及与IMU的标定
-
Python的字符串与下标定义与使用方法(内有示例与解析)
-
Python的字符串与下标定义与使用方法(内有示例与解析)
-
相机标定的基本原理与改进方法
-
致导TransDrone A4无人机与GoPro 相机的配对方法