相机的内参标定(实现原理+具体操作流程+实验结果)

这篇具有很好参考价值的文章主要介绍了相机的内参标定(实现原理+具体操作流程+实验结果)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇主要是总结梳理一下关于学习到的相机内参标定的知识。计划分为原理介绍,具体操作流程,标定实验结果三个模块。

首先先简单解释下为什么要进行相机标定这个操作,我们知道生活中实际使用的相机镜头都是透镜,初中时的物理就讲过,只有通过光心的光线才是沿直线传播的,而大部分的光线在通过透镜后会发生折射,从而在一定程度上改变传播的角度。越靠近透镜的边缘,改变的角度也就越大,这会造成相机所成的像产生距离上的拉伸以及形状的改变。这个现象称为相机畸变。(相机的畸变分为多种,后边会具体介绍)。而标定操作其实就是通过一系列的计算校准后得到修正参数,通过这些参数修正后就可以得到与我们人眼看到的景象相同的图像,也就是,将三维景象转换成去除畸变后的二维图像。

一、相机的成像原理

相机内参标定,数码相机,linux

这张图就是世界中的点到相机图像上的点的转换关系图。转换过程涉及四个坐标系。红色的是相机坐标系,原点就是相机光心所在的位置。黄色的是世界中的三维点。绿色的是图像坐标系,从世界点到图像点坐标的转换实际上是运用了相似三角形的计算。

相机内参标定,数码相机,linux

最后再将得到的点坐标x,y平移到黑色的像素坐标系,如此就完成了世界坐标点向像素坐标系点的转换,也就是我们所说的三维点向二维平面的投影。

通过数学公式和框图来表达转换关系:

相机内参标定,数码相机,linux

相机内参标定,数码相机,linux

我们将公式中的R称为旋转矩阵,t称为平移矩阵或平移向量。R|t合起来称作外参矩阵。将相机内参标定,数码相机,linux

称为相机的内参矩阵,也就是我们今天主要讨论的话题。

我们现在知道,从数学原理上我们有着一套准确的公式来完成三维世界点到二维像素点的转换。而完成这一系列转换的思想是简单的相似三角形。我们也在前面提到过,通过相机标定来求解内参参数的目的——是为了去除相机成像的畸变。此时回看上边的公式,就会发现上述的转换和计算是没有考虑畸变的,此时如果不去除畸变直接成像就会是这种效果:

相机内参标定,数码相机,linux

 可以看到,本来笔直的大楼看起来弯曲了,而且越是相片的四周,看起来弯曲程度越大。这就是镜头畸变导致的。我们可以通过标定操作去除畸变使得照片中的楼看起来是笔直的。

实际上,相机的畸变是非线性的,不能再简单地通过相似三角形来计算并修正,曾经的相机标定需要用到精密的参照物与复杂的操作,直到一位我们国人大佬,张正友博士提出了一套著名的使用棋盘格的标定法——张氏标定法。下面我们就介绍相机畸变的具体种类以及张氏标定法是如何修正这些畸变的。

二、相机的畸变与张氏标定法

相机的畸变,通常分为三大类。径向畸变、离心畸变以及薄棱镜畸变。

(1)径向畸变

使像点产生径向位置的偏差称为径向畸变。这也是相机中最常见的一种畸变——因为光线通过透镜一定会产生折射。径向畸变又可以具体分为正向(枕形)畸变【左图】和负向(桶形)畸变【右图】。

相机内参标定,数码相机,linux

相机内参标定,数码相机,linux

我们可以通过下面的公式对x,y进行修正,这也是切向畸变的表达形式

相机内参标定,数码相机,linux

相机内参标定,数码相机,linux

 (2)离心畸变

 相机的光学中心与几何中心不一致(镜头各器件的光学中心)所造成的畸变称为离心畸变。广义上讲,离心畸变既包含径向畸变,又包含镜头主光轴不对称所造成的切向畸变(不过我们通常将径向畸变单独分成一类)。同样的,对切向畸变的修正可以通过以下公式描述:

相机内参标定,数码相机,linux

(3)薄棱镜畸变

镜头设计缺陷与加工安装误差所造成的畸变称为薄棱镜畸变,这种畸变会同时引起径向畸变和切向畸变(想象一下相机的镜头安装的不正,或者镜头不够平整)。高价位的镜头可以忽略薄棱镜畸变。薄棱镜畸变可以通过下式进行描述:

相机内参标定,数码相机,linux

张氏标定法只关注径向畸变,通过五个左右的畸变系数进行修正,通常为k1,k2,p1,p2,k3(五个畸变系数的情况下)。k的个数通过计算的结果与修正的效果进行调整,可多可少,实际计算过程中,如果考虑太多高阶的畸变参数,会导致标定求解的不稳定。我做的实验中通常是4~5个畸变系数。

(4)张氏标定法

接下来我们具体介绍一下张氏标定法的思路。

由前边提到的坐标转换公式,使用K来代替内参矩阵,可以写成:

相机内参标定,数码相机,linux

再将内外参矩阵合并为H,可以写成:相机内参标定,数码相机,linux

H是一个3x3矩阵,并且有一个元素作为齐次坐标,也就是说有8个是未知元素,一组坐标对应两个方程,我们最少只需要四组对应的点即可算出单应性矩阵H。

相机内参标定,数码相机,linux

 因为R旋转矩阵为正交矩阵,存在:

相机内参标定,数码相机,linux

代入H可得求出两组A和H的公式:

相机内参标定,数码相机,linux

矩阵A包含5个元素,需要3组H才能解出A的唯一封闭解,因此在标定时需拍摄3组以上的图片。由A可计算出相应的外参矩阵。此时的求解过程忽略相机畸变的影响。对内外参应用最小二乘方法估计实际存在的径向畸变的畸变系数(忽略切向畸变),最后通过极大似然法进行优化,得到精度较高的解。这就是张氏标定法的大致思路。现在很多标定工具使用的方法和思路都是张氏标定法或以此为基础进行改进的。

ps:学习时查了不少资料,发现大多是将畸变和理论情况下的投影分开介绍。对去畸变究竟发生在什么时候讲的都是模棱两可,只是知道在标定过程中通过非线性优化完成去畸变操作。我个人认为,相机的去畸变是发生在将三维世界点坐标转换到图像坐标系的时候(三维世界点转换到相机坐标系,再归一化到图像坐标系后,此时能够发现本该是直线的地方弯曲了或缩放比例不正确,这时通过调整畸变系数对坐标进行修正,使得大部分坐标在修正后能够较为准确)【当然要看到最终成像时的畸变才能去针对性地进行去畸变操作,所以这段话貌似又没什么价值,可能是这个原因所以很多大佬的科普贴中才没有专门进行说明吧】

三、具体实现流程

接下来我们介绍相机的内参标定究竟是如何操作的。张氏标定法使用的是带有棋盘格的标定板,这一方法目前已经有现成的工具可以实现,我尝试过的方法有ROS的camera calibration以及matlab的相机内参标定工具箱。这里介绍一下ROS的camera calibration工具。

Ubuntu18.04安装ROS melodic_qq_41361687的博客-CSDN博客

matlab相机内参标定_qq_41361687的博客-CSDN博客

安装好ROS后(我使用的是ROS-Melodic),需要安装标定工具包

sudo apt-get install ros-melodic-camera-calibration

随后需要找到我们的相机驱动文件,启动launch文件(我用的是普通usb相机,驱动可以在网上搜索usb_cam找到)

roscore

roslaunch usb_cam usb_cam.launch

这样相机就启动了,接下来启动标定工具

rosrun camera_calibration cameracalibrator.py --size 11x9 --square 0.095 image:=/camera/image_raw camera:=/camera --no-service-check

这里size是指所使用棋盘格的尺寸,数字指的是角点的数量(可以先简单理解成不同颜色的边界交汇点),比如下图,我用的是12个格子长,10个格子宽的棋盘格,那么角点数量就是11 × 9;square指的是棋盘格格子的边长,单位是m;之后的两个是接收的topic,ROS通过topic来发布并接受信息。实际标定中,所使用的topic可以在运行相机驱动后通过输入

rostopic list

进行查看。然后找到其中image与camera发布的话题。将参数都设置好之后就可以回车启动,正式开始标定了。

使用的棋盘格标定板如图所示,从图上可以看出,相机确实存在畸变,视场中的标定板和棋盘格都出现了不同程度的形变。

相机内参标定,数码相机,linux

运行标定程序后,界面上左侧是当前的镜头画面,右侧会有一个工具栏,标有X,Y,Size,Screw这四个指标,以及calibrate,save,load三个功能键。其中X对应左右方向(x轴),Y对应上下方向(y轴),Size对应远近(z轴),Screw对应俯仰(以自身中心为轴的偏转)。

在上图右侧terminal中可以看到,标定程序会自动提取能够检测出角点时的图片帧。我们需要做的是,移动标定板的位姿,包括上下左右,远近,以及俯仰(总结来说,就是在能够检测出角点的情况下,使标定板尽可能出现在相机视场中的每个位置)使得标定界面中的四个指标X,Y,Size,Screw下边的线尽可能拉满。这代表着标定程序已经在该指标下采集到了足够多质量好的数据。

当四个指标都差不多拉满的时候,我们可以点击calibrate,此时程序会停止数据采集并开始计算内参参数与畸变系数。点击save可以将得到的计算结果进行保存。

四、标定结果

标定结果会以yaml文件格式保存,包括内参3*3矩阵、外参3*4矩阵、以及畸变系数(由于我们只进行了内参参数intrinsic matrix的计算,可以看到外参参数extrinsic matrix虽然也在标定结果里但只是一个单位矩阵)。

相机内参标定,数码相机,linux

想得到去畸变后的画面,可以使用image_proc包来对摄像头图像进行去畸变。image_proc会从指定的topic上提取相机校正参数,这个topic默认为/xxx_camera/camera_info。这里xxx_camera是名字空间,可以指定。

ROS_NAMESPACE=usb_cam rosrun image_proc image_proc

确保指定名字空间中有image_raw和camera_info的主题。image_proc会将处理后的图像发布到/xxx_camera/image_rect和image_rect_color。image_rect是灰度图像,image_rect_color是彩色图像。

接下来需要把校正得到的yaml文件内容发布到/xxx_camera/camera_info上去。 需要我们在启动usb_cam时为其指定camera_info_url参数,通过修改usb_cam.launch文件完成,在其中添加如下:

<param name="camera_info_url" type="string" value="file://$(find usb_cam)/ost.yaml" />

#<param name="camera_info_url" type="string" value="file:///home/xxx/ost.yaml" />

这样在usb_cam启动时就会加载该相机参数文件。通过指定的topic(如image_rect和/image_rect_color),我们就可以得到去畸变后的图像。

(PS:相机畸变不可能完全去除,因为我们使用的方法是通过非线性优化近似,通常画面的四个角会留有一定程度的畸变【肉眼可见】,而靠近中心位置的畸变则去除的效果较好【几乎观察不到畸变】,越好的相机在出厂时的去畸变会越精细,但不代表畸变完全被去除了,只是人眼不易观察到)。

以上就是通过ROS的camera calibration实现相机内参标定的大致操作。

另外:

以下是我在学习标定以及在梳理这篇博客时参考的内容,在此感谢各位大佬的资料,大家可以一并查阅。

相机标定(Camera calibration)原理、步骤_AI人工智能科学的博客-CSDN博客

最详细、最完整的相机标定讲解_卍卐没想到的博客-CSDN博客

[图像]摄像机标定(2) 张正友标定推导详解_祥知道的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-704255.html

到了这里,关于相机的内参标定(实现原理+具体操作流程+实验结果)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • matlab标定相机内参

    在APP中选择Camera Calibrator,如下: 点击 Add Images,导入拍照图片。标定20张左右就够了,然后角度变一下,但不需要变太大,太大了会影响标定效果。标定板最好在视场中心,且占据较大面积。 修改棋盘格大小为27*27mm(我的A4纸测量是这样) 对于标准相机,菜单栏的option里选

    2024年02月05日
    浏览(35)
  • 2.4.1.1 相机内参标定

    更多内容,请关注: github:https://github.com/gotonote/Autopilot-Notes.git 相机内参标定主要是为了获取相机本身的性质参数,包括相机的焦距,光心以及畸变参数等。 内参的物理意义与相机模型强相关,常用的相机成像模型为小孔模型,等效焦距与光心用数学可表示为一个矩阵 [ f

    2024年02月22日
    浏览(28)
  • Opencv 相机内参标定及使用

    目录 一、功能描述 二、标定板制作 三、图像采集 四、标定内参 方法一:Matlab标定  方法二:C++程序标定 五、使用内参 1.本文用于记录通过 Opencv 进行相机内参标定和对内参的使用来进行图像畸变矫正。         1)相机矩阵:包括焦距(fx,fy),光学中心(Cx,Cy),完

    2024年01月24日
    浏览(28)
  • 【相机标定】opencv python 标定相机内参时不计算 k3 畸变参数

    畸变参数 k3 通常用于描述径向畸变的更高阶效应,即在需要高精度的应用中可以用到,一般的应用中 k1, k2 足矣。 常见的应用中, orbslam3 中是否传入 k3 是可选的,而 kalibr 标定中则只需要传入 k1, k2 。但计算 k3 时的 k1, k2 不等于不计算 k3 时的 k1, k2 ,因此需要学会两种场景下

    2024年02月09日
    浏览(29)
  • 相机标定 >> 坐标系转换@内参、外参

    为了更好的理解标定,首先应熟悉各个坐标系。(坐标系图均取自百度百科) 该坐标系是以图像左上角为原点建立以像素为单位的二维坐标系u-v。(相对坐标系) 图像坐标系是以 O1 (是图像的主点,也即光轴与像平面的交点,一般就是像素坐标系的中点)为原点的二维坐标

    2024年02月12日
    浏览(38)
  • 【Ubuntu18.04】激光雷达与相机联合标定(Livox+HIKROBOT)(一)相机内参标定

    Livox Lidar + HIKROBOT Camera 联合标定 参考链接:相机雷达标定文档 安装ROS环境,参考笔者的博客:【ROS】Ubuntu18.04安装Ros 参考链接:海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++) 海康的相机没有ros驱动,且对linux开发不太友好(但支持windows),因此需要重写了sdk接口

    2024年02月04日
    浏览(36)
  • 计算机视觉(相机标定;内参;外参;畸变系数)

    目录 一、预备知识 1、坐标系变换过程(相机成像过程) (1)相机坐标系转换为图像坐标系(透视投影变换遵循的是针孔成像原理) (2)齐次坐标的引入原因:(为什么引入齐次坐标???) 2、内参与外参矩阵的构成 3、畸变参数 二、相机标定 1、张正友标定法(光学标

    2024年02月07日
    浏览(38)
  • zed2i相机内参标定

    参考: https://blog.csdn.net/yanpeng_love/article/details/107166922 https://blog.csdn.net/weixin_41954990/article/details/127928852 参考以上连接先安装 kalibr 。 注意: python包装不上,换成:pip install 出现pyx找不到的错误:sudo apt-get install python3-pyx 1. 生成标定板 可以自己定制特定尺寸的标定板: 其中,

    2024年02月04日
    浏览(76)
  • OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/136616551 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、

    2024年03月13日
    浏览(37)
  • 8. 基于消影点进行相机内参(主点)的标定

    可以参考我的另一篇博客ocam模型。 这里简单提一下ocam模型: 这个模型将中心折反射相机和鱼眼相机统一在一个通用模型下,也称为泰勒模型。它由Scaramuzza等人在2006年开发,其优点是折反射相机和屈光相机都可以用同一个模型来描述,即一个泰勒多项式。 公式: 从上面一

    2024年02月07日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包