计算机视觉——棋盘格标定法获取相机内参外参

一、原理

相机标定目的

为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。这个求解参数(内参、外参、畸变参数)的过程就称之为相机标定。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。 畸变(distortion)是对直线投影(rectilinear projection)的一种偏移。简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。畸变简单来说就是一条直线投影到图片上不能保持为一条直线了,这是一种光学畸变(optical aberration),可能由于摄像机镜头的原因。

相机标定的输入

标定图像上所有内角点的图像坐标,标定板图像上所有内角点的空间三维坐标(一般情况下假定图像位于Z=0平面上)。

相机标定的输出

摄像机的内参、外参系数。

相机标定策略

  1. 光学标定:利用已知的几何信息(如定长棋盘格)实现参数求解。
  2. 自标定:在静态场景中利用structure from motion估算参数。
    本次实验中使用光学标定法

相机拍摄图像变换过程

设P=(X,Y,Z)为场景中的一点,在针孔相机模型中,其要经过以下几个变换,最终变为二维图像上的像点p=(μ,ν):

  1. 将P从世界坐标系通过刚体变换(旋转和平移)变换到相机坐标系,这个变换过程使用的是相机间的相对位姿,也就是相机的外参数。
  2. 从相机坐标系,通过透视投影变换到相机的成像平面上的像点p=(x,y)。
  3. 将像点p从成像坐标系,通过缩放和平移变换到像素坐标系上点p=(μ,ν)。

相机内参

相机内部参数/内方位元素:焦距、像主点坐标、畸变参数
从相机坐标系,通过透视投影变换到相机的成像平面上的像点,将该变换过程整理为矩阵相乘的形式:
内参
将矩阵K称为相机的内参数,
K
为了不失一般性,可以在相机的内参矩阵上添加一个扭曲参数s,该参数用来表示像素坐标系两个坐标轴的扭曲。则内参数K变为
K
对于大多数标准相机来说,可将扭曲参数s设为0

相机外参

将P从世界坐标系通过刚体变换(旋转和平移)变换到相机坐标系,这个变换过程使用的是相机间的相对位姿,也就是相机的外参数。
相机外部参数/外方位元素: 旋转、平移
用矩阵表示:
外参
t表示平移的量,R表示x,y,z方向的旋转参数,矩阵与平移量相加就可得出变换后的矩阵,与旋转参数相乘后可得旋转后的矩阵
外参
旋转参数R:
R

二、环境

win10,64位,MATLAB2018b,手机型号:小米8,计算手机内参:python3.7

三、数据集

拍摄15张不同角度的黑白棋盘格作为数据集
数据集

四、运行结果与分析

角点提取

选取所有图像的角点,以其中一张图像选取过程展示如下:
单击矩形棋盘图案上的四个极端角:
结果
自动计算两个方向上的平方数,并在不失真的情况下显示预测的网格角:
结果
预测的角点与真实的图像角点足够接近。因此,不必通过输入对径向畸变系数的猜测来“帮助”程序检测图像拐角。使用这些位置作为初始猜测自动提取角。
自动提取图像的角,并显示如下(角点周围的蓝色方框显示了角点查找器窗口的界限):
结果
本次实验拍摄图像都比较清晰,没有出现失真的情况,因此网格中的某些预测角距离实际网格角不远,没有错误的提取。如果图像失真,网格中的一些预测角与实际网格角距离较远,为了帮助系统更好地猜测拐角位置,要手动输入对畸变系数的猜测,然后再进行预测,如果接下来预测点与真实点距离比较近则预测成功,否则需要再次输入畸变系数进行尝试。

校准

校准分为两个步骤:首先进行初始化,然后进行非线性优化。
初始化步骤基于不包含任何镜头畸变的校准参数计算封闭式解
非线性优化步骤将所有校准参数上的总重投影误差(最小二乘)最小化。
初始化步骤得出的参数结果:
结果
非线性优化后得出的参数结果:
结果
其中:fc是横纵方向的焦距,cc表示主光点的偏移,kc是畸变参数,这几个参数是相机内参中的重要参数。
外部参数:
“以相机为中心”
结果
“以世界为中心”
结果

重新投影错误

结果
以彩色编码的叉号形式显示:
错误
在大量图形上,重投影误差非常大。原因是,我们在提取某些失真的图像上的角点时并没有做非常仔细的工作。

内参矩阵

小米8手机的内参矩阵为
结果

五、总结

通过结合matlab与python的求解,很顺利的得出了手机相机的内参矩阵以及棋盘格标定的重要参数和外部参数,同时也计算了重投影错误。可以看出第一次计算重投影错误发现了很多错误,这是因为在一个或多个图像上错误提取了拐角,这也是检查重投影错误的重要意义。在这种情况下,可以使用不同的窗口大小(更大或更小)重新计算特定图像的角,然后特定角的重投影误差就会变小。

  • 4
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
相机标定是用于确定相机内参外参的过程,它是计算机视觉和机器人视觉中的重要步骤。在Python中,我们可以使用OpenCV库来进行相机标定。 以下是相机标定的大致步骤: 1. 收集相机标定所需的图像数据,这些图像应该包括不同位置和角度下的棋盘图像。 2. 使用OpenCV中的findChessboardCorners函数来检测每个棋盘角点的位置。 3. 使用calibrateCamera函数来计算相机内参和畸变系数。该函数需要输入棋盘图像的坐标和实际世界坐标。 4. 使用solvePnP函数来计算每个棋盘图像的外参。该函数需要输入棋盘图像的坐标和实际世界坐标。 下面是一个示例代码,用于标定相机获取内参外参: ```python import cv2 import numpy as np # 收集相机标定所需的图像数据 images = [...] # 棋盘图像列表 objpoints = [] # 实际世界坐标列表 imgpoints = [] # 图像坐标列表 # 设置棋盘的大小 pattern_size = (9, 6) # 遍历每张图像 for img in images: # 寻找棋盘的角点 ret, corners = cv2.findChessboardCorners(img, pattern_size, None) # 如果找到棋盘 if ret == True: objpoints.append(...) # 将实际世界坐标添加到列表中 imgpoints.append(corners) # 将图像坐标添加到列表中 # 计算相机内参和畸变系数 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, img.shape[::-1], None, None) # 计算每张棋盘图像的外参 rmatrices = [] for i in range(len(objpoints)): ret, rmat, tvec = cv2.solvePnP(objpoints[i], imgpoints[i], mtx, dist) rmatrices.append(rmat) ``` 在上面的代码中,我们首先使用findChessboardCorners函数来检测每张棋盘图像中的角点位置,并将它们存储在imgpoints列表中。然后,我们构建一个实际世界坐标列表objpoints,该列表包含每个棋盘的实际世界坐标。接下来,我们使用calibrateCamera函数计算相机内参和畸变系数。最后,我们使用solvePnP函数来计算每个棋盘图像的外参,将结果存储在rmatrices列表中。 通过运行上面的代码,我们可以得到相机内参矩阵mtx和畸变系数dist,以及每个棋盘图像的旋转矩阵rmatrices和平移向量tvecs。这些参数可以在后续的计算机视觉和机器人视觉应用中使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值