相机标定(Camera calibration)原理、步骤

相机标定(Camera calibration)原理、步骤

简介

  • 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。
  • 常用术语
    • 内参矩阵: Intrinsic Matrix
    • 焦距: Focal Length
    • 主点: Principal Point
    • 径向畸变: Radial Distortion
    • 切向畸变: Tangential Distortion
    • 旋转矩阵: Rotation Matrices
    • 平移向量: Translation Vectors
    • 平均重投影误差: Mean Reprojection Error
    • 重投影误差: Reprojection Errors
    • 重投影点: Reprojected Points

1、坐标系的转换

1.1 世界坐标系

世界坐标系(world coordinate)(xw,yw,zw),也称为测量坐标系,是一个三维直角坐标系,以其为基准可以描述相机和待测物体的空间位置。世界坐标系的位置可以根据实际情况自由确定。

1.2 相加坐标系

相机坐标系(camera coordinate)(xc,yc,zc),也是一个三维直角坐标系,原点位于镜头光心处,x、y轴分别与相面的两边平行,z轴为镜头光轴,与像平面垂直。

1.3 世界坐标系转换为相机坐标系

其中R为3*3的旋转矩阵,t为3*1的平移矢量,(xc,yc,zc,1)T(xc,yc,zc,1)T为相机坐标系的齐次坐标,(xw,yw,zw,1)T(xw,yw,zw,1)T为世界坐标系的齐次坐标。 ### 1.4 像素坐标系、图像坐标系 - 像素坐标系(pixel coordinate) 如图,像素坐标系uov是一个二维直角坐标系,反映了相机CCD/CMOS芯片中像素的排列情况。原点oo位于图像的左上角,uu轴、vv轴分别于像面的两边平行。像素坐标系中坐标轴的单位是像素(整数)。
  • 像素坐标系不利于坐标变换,因此需要建立图像坐标系XOYXOY,其坐标轴的单位通常为毫米(mm),原点是相机光轴与相面的交点(称为主点),即图像的中心点,XX轴、YY轴分别与uu轴、vv轴平行。故两个坐标系实际是平移关系,即可以通过平移就可得到。

  • 图像坐标系转换为像素坐标系

其中,dX、dY分别为像素在X、Y轴方向上的物理尺寸,u0,v0为主点(图像原点)坐标。

1.5 针孔成像原理

如图,空间任意一点P与其图像点p之间的关系,P与相机光心o的连线为oP,oP与像面的交点p即为空间点P在图像平面上的投影。
该过程为透视投影,如下矩阵表示:

其中,ss为比例因子(ss不为0),ff为有效焦距(光心到图像平面的距离),(x,y,z,1)T(x,y,z,1)T是空间点PP在相机坐标系oxyzoxyz中的齐次坐标,(X,Y,1)T(X,Y,1)T是像点pp在图像坐标系OXYOXY中的齐次坐标。

1.6 世界坐标系转换为像素坐标系

其中,αx=f/dXαx=f/dX、αy=f/dYαy=f/dY,称为u、v轴的尺度因子,M1称为相机的内部参数矩阵,M2称为相机的外部参数矩阵,M称为投影矩阵。 ## 2 相机内参与畸变参数 ### 2.1 相机内参 - 参看1.6节所述

2.2 畸变参数

  • 畸变参数(distortion parameters)
    畸变(distortion)是对直线投影(rectilinear projection)的一种偏移。
    简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。
    畸变简单来说就是一条直线投影到图片上不能保持为一条直线了,这是一种光学畸变(optical aberration),可能由于摄像机镜头的原因。

  • 畸变一般可以分为:径向畸变、切向畸变
    1、径向畸变来自于透镜形状
    2、切向畸变来自于整个摄像机的组装过程。畸变还有其他类型的畸变,但是没有径向畸变、切向畸变显著
    下面是几张反应畸变的图像


  • 径向畸变
    实际摄像机的透镜总是在成像仪的边缘产生显著的畸变,这种现象来源于“筒形”或“鱼眼”的影响。如下图,光线在原理透镜中心的地方比靠近中心的地方更加弯曲。对于常用的普通透镜来说,这种现象更加严重。筒形畸变在便宜的网络摄像机中非常厉害,但在高端摄像机中不明显,因为这些透镜系统做了很多消除径向畸变的工作。

    对于径向畸变,成像仪中心(光学中心)的畸变为0,随着向边缘移动,畸变越来越严重。

  • 径向畸变包括:枕形畸变、桶形畸变

  • 切向畸变

    • 切向畸变是由于透镜制造上的缺陷使得透镜本身与图像平面不平行而产生的。
    • 切向畸变可分为:薄透镜畸变、离心畸变
    • 切向畸变图示:
2.2.1 opencv中的畸变模型
  • 径向畸变模型:

2.3 相机标定

  • 相机标定步骤
    1、打印一张棋盘格,把它贴在一个平面上,作为标定物。
    2、通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向的照片。
    3、从照片中提取棋盘格角点。
    4、估算理想无畸变的情况下,五个内参和六个外参。
    5、应用最小二乘法估算实际存在径向畸变下的畸变系数。
    6、极大似然法,优化估计,提升估计精度。

参考文章

注:本文只是为了自己备忘使用

3 相机标定

3.1 准备

OpenCV使用棋盘格板进行标定,如下图所示。为了标定相机,我们需要输入一系列三维点和它们对应的二维图像点。在黑白相间的棋盘格上,二维图像点很容易通过角点检测找到。而对于真实世界中的三维点呢?由于我们采集中,是将相机放在一个地方,而将棋盘格定标板进行移动变换不同的位置,然后对其进行拍摄。所以我们需要知道(X,Y,Z)的值。但是简单来说,我们定义棋盘格所在平面为XY平面,即Z=0。对于定标板来说,我们可以知道棋盘格的方块尺寸,例如30mm,这样我们就可以把棋盘格上的角点坐标定义为(0,0,0),(30,0,0),(60,0,0),···,这个结果的单位是mm。
  3D点称为object points,2D图像点称为image points。

3.2 检测棋盘格角点

为了找到棋盘格模板,我们使用openCV中的函数cv2.findChessboardCorners()。我们也需要告诉程序我们使用的模板是什么规格的,例如88的棋盘格或者55棋盘格等,建议使用x方向和y方向个数不相等的棋盘格模板。下面实验中,我们使用的是107的棋盘格,每个方格边长是20mm,即含有96的内部角点。这个函数如果检测到模板,会返回对应的角点,并返回true。当然不一定所有的图像都能找到需要的模板,所以我们可以使用多幅图像进行定标。除了使用棋盘格,我们还可以使用圆点阵,对应的函数为cv2.findCirclesGrid()。
  找到角点后,我们可以使用cv2.cornerSubPix()可以得到更为准确的角点像素坐标。我们也可以使用cv2.drawChessboardCorners()将角点绘制到图像上显示。如下图所示:

3.3、标定

通过上面的步骤,我们得到了用于标定的三维点和与其对应的图像上的二维点对。我们使用cv2.calibrateCamera()进行标定,这个函数会返回标定结果、相机的内参数矩阵、畸变系数、旋转矩阵和平移向量。

第三步我们已经得到了相机内参和畸变系数,在将图像去畸变之前,我们还可以使用cv.getOptimalNewCameraMatrix()优化内参数和畸变系数,通过设定自由自由比例因子alpha。当alpha设为0的时候,将会返回一个剪裁过的将去畸变后不想要的像素去掉的内参数和畸变系数;当alpha设为1的时候,将会返回一个包含额外黑色像素点的内参数和畸变系数,并返回一个ROI用于将其剪裁掉。

然后我们就可以使用新得到的内参数矩阵和畸变系数对图像进行去畸变了。有两种方法进行去畸变:

(1) 使用cv2.undistort()

这是一个最直接的办法,只用直接调用函数就可以得到去畸变的图像,使用上面的ROI可以对其进行剪裁。代码如下:

# undistort
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)

# crop the image
x,y,w,h = roi
dst = dst[y:y+h, x:x+w]
cv2.imwrite('calibresult.png',dst)
(2)使用remmaping()

这是一个分两步的方法,首先计算一个从畸变图像到非畸变图像的映射,然后使用这个映射关系对图像进行去畸变。
代码如下:

# undistort
mapx,mapy = cv2.initUndistortRectifyMap(mtx,dist,None,newcameramtx,(w,h),5)
dst = cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)

# crop the image
x,y,w,h = roi
dst = dst[y:y+h, x:x+w]
cv2.imwrite('calibresult.png',dst)

3.4 反投影误差

通过反投影误差,我们可以来评估结果的好坏。越接近0,说明结果越理想。通过之前计算的内参数矩阵、畸变系数、旋转矩阵和平移向量,使用cv2.projectPoints()计算三维点到二维图像的投影,然后计算反投影得到的点与图像上检测到的点的误差,最后计算一个对于所有标定图像的平均误差,这个值就是反投影误差。

代码

所有步骤的代码如下所示:

#coding:utf-8
import cv2
import numpy as np
import glob

# 找棋盘格角点
# 阈值
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
#棋盘格模板规格
w = 9
h = 6
# 世界坐标系中的棋盘格点,例如(0,0,0), (1,0,0), (2,0,0) ....,(8,5,0),去掉Z坐标,记为二维矩阵
objp = np.zeros((w*h,3), np.float32)
objp[:,:2] = np.mgrid[0:w,0:h].T.reshape(-1,2)
# 储存棋盘格角点的世界坐标和图像坐标对
objpoints = [] # 在世界坐标系中的三维点
imgpoints = [] # 在图像平面的二维点

images = glob.glob('calib/*.png')
for fname in images:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # 找到棋盘格角点
    ret, corners = cv2.findChessboardCorners(gray, (w,h),None)
    # 如果找到足够点对,将其存储起来
    if ret == True:
        cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
        objpoints.append(objp)
        imgpoints.append(corners)
        # 将角点在图像上显示
        cv2.drawChessboardCorners(img, (w,h), corners, ret)
        cv2.imshow('findCorners',img)
        cv2.waitKey(1)
cv2.destroyAllWindows()

# 标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)

# 去畸变
img2 = cv2.imread('calib/00169.png')
h,  w = img2.shape[:2]
newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),0,(w,h)) # 自由比例参数
dst = cv2.undistort(img2, mtx, dist, None, newcameramtx)
# 根据前面ROI区域裁剪图片
#x,y,w,h = roi
#dst = dst[y:y+h, x:x+w]
cv2.imwrite('calibresult.png',dst)

# 反投影误差
total_error = 0
for i in xrange(len(objpoints)):
    imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)
    error = cv2.norm(imgpoints[i],imgpoints2, cv2.NORM_L2)/len(imgpoints2)
    total_error += error
print "total error: ", total_error/len(objpoints)
  • 3
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
相机标定工具gml camera calibration是一种计算机视觉领域的工具,用于对相机进行标定,以提高图像处理和计算机视觉任务的精度和准确性。 相机标定是指通过测量相机的内部和外部参数,包括焦距、畸变等,用数学模型来描述相机的成像特性和几何关系的过程。相机标定是进行三维重建、图像匹配、姿态估计等计算机视觉任务的前提。 gml camera calibration是一种相机标定工具,它能够自动提取相机的内部和外部参数,并且能够校正图像的畸变。通过使用gml camera calibration,我们可以获得更准确和稳定的相机参数,从而提高图像处理和计算机视觉任务的质量。 使用gml camera calibration进行相机标定的过程一般包括以下几个步骤:首先,需要收集一组已知的二维图像点和对应的三维世界坐标点作为标定数据。然后,通过对这组数据进行处理,可以得到相机的内部参数,如焦距、主点和径向畸变系数。最后,利用得到的内部参数和其他几何信息,可以计算得到相机的外部参数,包括相机的位置和姿态。 相机标定是计算机视觉领域中非常重要的一个技术,它对于提高图像处理和计算机视觉任务的准确性和可靠性具有重要意义。gml camera calibration作为一种相机标定工具,提供了自动化的标定方法和算法,可以极大地简化了相机标定的过程,并且能够获得更准确和可靠的相机参数,从而提高计算机视觉任务的成果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值