跳转至

标定 Calibration

优雅,太优雅了

标定的目的

  • 一个就是矫正由于镜头畸变造成的图片的变形,例如,现实中的直线,拍摄成图像后会外凸或内凹,进行相机标定后可以对这种情况进行校正;

  • 另一个是根据拍摄获得的二维图像来重构三维场景,因为标定的过程就是通过一系列的三维点和它对应的二维图像点进行数学变换,求出相机的内参数和外参数。

标定之后的相机,可以进行测距、三维场景的重建等。

标定方法

传统相机标定法

传统相机标定法需要使用尺寸已知的标定物,通过建立标定物上坐标已知的点与其图像点之间的对应,利用一定的算法获得相机模型的内外参数。根据标定物的不同可分为三维标定物平面型标定物

三维标定物可由单幅图像进行标定,标定精度较高,但高精密三维标定物的加工和维护较困难。平面型标定物比三维标定物制作简单,精度易保证,但标定时必须采用两幅或两幅以上的图像。传统相机标定法在标定过程中始终需要标定物,且标定物的制作精度会影响标定结果。同时有些场合不适合放置标定物也限制了传统相机标定法的应用。

基于主动视觉的相机标定法

基于主动视觉的相机标定法是指已知相机的某些运动信息对相机进行标定。该方法不需要标定物,但需要控制相机做某些特殊运动,利用这种运动的特殊性可以计算出相机内部参数。

基于主动视觉的相机标定法的优点是算法简单,往往能够获得线性解,故鲁棒性较高,缺点是系统的成本高、实验设备昂贵、实验条件要求高,而且不适合于运动参数未知或无法控制的场合。

零失真相机标定法

零失真相机标定法是以LCD显示屏为参考基准,以相移光栅为媒介,建立LCD像素与相机传感器像素之间的映射关系,确定每个相机像素点在LCD上的视点位置。镜头使相机在LCD上的视场为非矩形。在这个有畸变的视场内,可以构造一个内接的虚拟传感器,并保持相同的像素数。这样每个虚拟像素点就一定落在某四个相邻视点构成的任意四边形之内。虚拟像素点的亮度将由这四点的亮度经加权插值确定,而与其它像素点无关。用这四个加权系数的集合对原始图像作重采样(四次乘法、四次加法),就可以得到零畸变的输出图。对彩色相机的RGB三通道分别处理,但选用一个公共的虚拟传感器,则合成的彩色图像将是零畸变、零色差的。每个像素点(物理视点和虚拟点)的位置误差都是零均值,均方差都可小于1/1,000像素点距。

坐标系

平面旋转

三维坐标旋转

坐标变换

旋转矩阵左乘得到

四个坐标系

世界坐标系:Xw、Yw、Zw。

相机坐标系: Xc、Yc、Zc。

图像坐标系:x、y。

像素坐标系:u、v。

世界坐标系(参考坐标系)

用户定义的三维世界的坐标系,为了描述目标物在真实世界里的位置以及相机所在的位置而被引入。

相机坐标系

在相机上建立的坐标系,为了从相机的角度描述物体位置而定义,作为沟通世界坐标系和图像/像素坐标系的中间一环。
认为相机到图像的距离为f(OO‘),物体到相机的距离为z,实际上缩放因子就是z

一个有趣的现象是,一个两倍的物体放在两倍远的地方和原物体在相机中成像一样

图像坐标系

为了描述成像过程中物体从相机坐标系到图像坐标系的投影透射关系而引入,方便进一步得到像素坐标系下的坐标。

像素坐标系

为了描述物体成像后的像点在数字图像上(相片)的坐标而引入,是我们真正从相机内读取到的信息所在的坐标系,单位为个(像素数目)。

畸变

~~畸变偶不变符号看象限~~

畸变是指光学系统对物体所成的像相对于物体本身而言的失真程度,是光学透镜的固有特性,其直接原因是因为透镜的边缘部分和中心部分的放大倍率不一样。

透镜的畸变是不可消除的,但在实际的应用中可以通过一些软件来进行畸变的补偿,如OpenCV、MATLAB等。

畸变的分类

  • 径向畸变:主要由于透镜不同部位放大倍率不同造成的,又分枕型畸变,桶形畸变两种
  • 切向畸变:主要由于透镜安装与成像平面不垂直造成的,类似透视原理(近大远小,圆变椭圆等等)
  • 薄棱镜畸变:由于透镜设计缺陷和加工安装误差造成,又称为线性畸变。影响较小,一般忽略不计

通常情况下径向畸变的影响要远远大于其他畸变

畸变模型

理解径向畸变:指的是按照径向距离进行畸变(也就是和x/y成比例关系,但不是线性关系)。

由泰勒展开得到。

像方畸变和物方畸变

像方畸变模型:即将畸变模型作为附属参数添加至图像平面。通俗的来讲就是认为,图像透过透镜之前是正常的(理想的),透过透镜后,在图像平面成像时产生了畸变。

物方畸变模型:即将畸变模型作为附属参数添加至相机坐标系。通俗的讲就是认为,图像从进入相机开始就已经产生了畸变,之后这种畸变一直保持存在。

像方畸变模型和物方畸变模型都是对图像的校正模型,只是采取的参考系不同而已。

Inpho等传统摄影测量软件通常情况下都是采用像方畸变模型

OpenCV、Matlab等计算机视觉软件通常采用物方畸变模型

张正友标定法

张正友标定法标定相机的内外参数的思路如下: 1. 求解内参矩阵与外参矩阵的积(H) H被(U,V)和(u,v)约束着,前者是现实世界的人为定义好的,后者用图像识别算法找到对应像素的,从而求出有8个自由度的H

  1. 求解内参矩阵; H=A(R1 R2 t)
    \(B=A^{-T}A^{-1}\),是个对称阵 通过多张图片最小二乘可以求解b,然后得到内参矩阵

  2. 求解外参矩阵。 用H和A求解外参

内容太多了就不copy了:
张正友标定法

最小二乘法的矩阵形式

代码实现

cv2.findChessboardCorners

bool cv::findChessboardCorners  (InputArray     image,Size patternSize,OutputArray  corners,int     flags =CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE 
)       
cv.findChessboardCorners(   image, patternSize[, corners[, flags]]  ) ->    retval, corners

image: 棋盘视图。它必须是8位灰度或彩色图像。

patternSize:每个棋盘行和列的内角数( patternSize = cv::Size(points_per_row,points_per_colum) = cv::Size(columns,rows) )。

corners: 检测到的角的输出数组。

flags: 可以为零或以下值组合的各种操作标志:

CALIB_CB_ADAPTIVE_THRESH使用自适应阈值将图像转换为黑白,而不是固定阈值级别(根据平均图像亮度计算)。

CALIB_CB_NORMALIZE_IMAGE在应用固定或自适应阈值之前,使用 equalizeHist 标准化图像伽玛。

CALIB_CB_FILTER_QUADS使用附加标准(如轮廓面积、周长、类似正方形的形状)过滤掉在轮廓检索阶段提取的错误四边形。

CALIB_CB_FAST_CHECK对图像进行快速检查以查找棋盘角,如果没有找到则快捷调用。当没有观察到棋盘时,这可以大大加快退化条件下的调用。

检测到的坐标是近似的,为了更准确地确定它们的位置,该函数调用cornerSubPix。如果返回的坐标不够准确,您也可以使用带有不同参数的函数cornerSubPix。

cv2.drawChessboardCorners

void cv::drawChessboardCorners  (   InputOutputArray    image,
Size    patternSize,
InputArray  corners,
bool    patternWasFound 
)       
cv.drawChessboardCorners(image, patternSize,corners,patternWasFound ) ->image

cv2.calibrateCamera

double cv::calibrateCamera  (   InputArrayOfArrays  objectPoints,
InputArrayOfArrays  imagePoints,
Size    imageSize,
InputOutputArray    cameraMatrix,
InputOutputArray    distCoeffs,
OutputArrayOfArrays     rvecs,
OutputArrayOfArrays     tvecs,
OutputArray     stdDeviationsIntrinsics,
OutputArray     stdDeviationsExtrinsics,
OutputArray     perViewErrors,
int     flags = 0,
TermCriteria    criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON) 
)       
cv.calibrateCamera( objectPoints, imagePoints, imageSize, cameraMatrix,distCoeffs[, rvecs[, tvecs[, flags[,criteria]]]]

OpenCV官网

注意事项⚠️⚠️一些坑

  • 保持相机光轴和标定板法向之间的夹角处于15°~ 70°之间

  • 标定图片在20张左右;

  • 标定过程不能过曝;
  • 标定过程不能改变光圈和焦距;
  • 标定要覆盖整个测量空间及测量视场。
  • 用棋盘格标定的过程中,角点提取的精度受噪声和图像质量影响较大,而圆形特征对噪声的抑制性比较强,且识别率比较高,因此圆形特征在视觉系统中发挥着重要的作用。
  • 标定板的图像应尽量覆盖整个视野的1/2左右,并且标定图片一般以20张左右为宜,实验证明,图片太多会导致参数优化的结果变差。
  • 照片数量:标定板特征点数目越多,同一张图片的信息量越大,需要的图片数量相应就少。
  • 标定板网格大小对标定精度影响:随着棋盘格尺寸增大,其标定的误差相应增大。较之小尺寸的棋盘格,大尺寸的误差成倍增加。其原因是棋盘格越 大,则镜头畸变引起的距离测量误差增大,从而导致标定的重投影误差增大。根据相机畸变系数大小制作精度高与棋盘格尺寸相对较小的靶标可有效地提高相机标定的精度。【相机标定的外界影响因素分析_支健辉】
  • 特征点数量对标定精度影响:当标定板单位网格长度一定时,特征点数量对有效焦距的影响有限。
  • 在标定算法确定的情况下,影响相机标定的因素主要来自相机本身以及光照、标定板规格、标定图像数量、标定物摆放位置、图像噪声等外界环境。(以下结论针对棋盘标定板而言)
  • 在张氏标定法中,标定图像数量在20张左右为宜,相机有效焦距相对稳定,重投影残差相对较小。
  • 在相机视场范围内,当特征点个数为110个,单位网格长度在6~14mm之间时,获得的有效焦距最稳定;当棋盘网格单位长度为10mm 时,棋盘标定板上的特征点应保证在150个以内,此时主点坐标获取稳定。
  • 棋盘标定板对于图像噪声有一定的抗干扰性。重投影点误差与噪声方差基本呈正比例放大。
  • 结构光视觉系统误差分析:测量误差与特征提取误差成正比,特征提取误差越大,测量误差越大,反之亦然; 摄像机光轴与投影仪光轴之间的夹角对 Z 轴存在明显影响,当夹角小于45°时,Z 轴误差随着夹角的减小而急剧增大; 当夹角大于 45°时,随着夹角的增大而缓慢减小,但是如果夹角α太大,则标定精度又大幅下降,因此夹角不能太小而又不宜太大,通常选取45°左右。测量物距对测量误差的影响是线性的,测量物距越大,测量误差随之增大; 摄像机焦距与测量误差成反比,摄像机焦距越大,测量误差越小,精度越高。

原文链接:https://blog.csdn.net/weixin_48934707/article/details/124295140