【自动驾驶】27.相机畸变_相机内参标定 整理

2024-06-16 21:18

本文主要是介绍【自动驾驶】27.相机畸变_相机内参标定 整理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这篇文章讲解的很详细,包括在哪一步添加畸变:【自动驾驶视觉感知:相机标定】

本文整理了很多有关相机畸变博客的相关内容,都附上的原文地址,也纠正了一些其他博客的错误。


下面两张截图来自高翔博士的《视觉SLAM十四讲》书中内容。
在这里插入图片描述
在这里插入图片描述

有关添加畸变矫正以及去畸变的详细过程,可以参考 自动驾驶视觉感知:相机标定。

关于相机内参标定的请参考这篇博客:最详细、最完整的相机标定讲解。 注意,这篇博客的畸变矫正公式也写反了。

相机畸变公式推导可参考这篇博客:相机畸变详细推导。
在这里插入图片描述
【畸变矫正公式参数说明:】
网上有很多文章都在谈畸变矫正,对于畸变矫正的公式,有很多文章是把畸变前的像素坐标和畸变后的像素坐标的关系搞反了,下面给出正确的关系:

引用张正友论文的原文:
《Flexible camera calibration by viewing a plane from unknown orientations》
在这里插入图片描述
由上述论文可见, 畸变公式左侧 x ˘ \color{red}\breve{x} x˘ y ˘ \color{red}\breve{y} y˘ 是畸变矫正前的像素坐标,右侧的 x \color{red}x x y \color{red}y y 是理想情况下无畸变时的像素坐标:
正确公式如下:
径向畸变:
在这里插入图片描述
切向畸变:
在这里插入图片描述
网上有些博客搞反了, 他们说等式左侧 是畸变矫正后的结果。

这里只是关于畸变公式中参数的意义做了一个说明记录,关于畸变的矫正的代码及详细原理解释可参考下面这个博客,写的很好:https://www.jianshu.com/p/6daa8dbbfa30


原文链接:https://blog.csdn.net/TimeRiverForever/article/details/117283430

透镜

实际成像时,如果小孔过小,则入射光的强度会受到影响,进一步会影响到成像。 另一方面,由于光的波动性,在小孔的边缘上,光将发生衍射,因此,这些光将在像平面上“散播”。当小孔变的越来越小时,入射光的“散播”范围将变得越来越大,因此,入射光中越来越多的能量将会被“散播”到:偏离入射光方向的“地方”。
在这里插入图片描述
我们在使用针孔相机时,我们做过一个假设:针孔是无线小的一个孔。在真实物理世界中,我们的假设一般无法成立,那如果改变针孔的大小后,会发生怎样的变化呢?

在这里插入图片描述

如上图所示,当针孔尺寸发生改变后,穿过针孔的光线数量就会增加。光线数越多,像平面中的点就会被三维世界中物体上越多的点影响,导致图像越发模糊。针孔小了,得到的图像更清晰,但也更暗。自然而然的,我们就会想到针孔模型下的一个基本问题:我们能设计一个相机能得到既清晰又明亮的图像吗?

为了解决小孔相机的上述问题,我们现在考虑:在成像系统中使用透镜。镜头可以使光线聚焦或分散,如果我们选用一个理想的透镜替代针孔,那他应该具有以下特性:P点发出的所有射线,经镜头折射后,聚焦在像平面上P′点。
在这里插入图片描述
假如我们另取一点 Q,在像平面上的投影点则可能是模糊或失焦的。每个镜头都会有特定的准确对焦的距离,在摄影学或计算机图形学中也叫景深(depth of field)。
在这里插入图片描述
镜头能够讲所有平行于光轴的光线折射到同一个点,称之为焦点。焦点和光心的距离即为焦距f。从光心穿过的光线不会偏离原始方向。
一个理想的透镜具有如下两个性质:

  • 它的投影方式和小孔模型相同
  • 将一定数量的光线汇聚在一起。

畸变模型参数

相机的内参除了以上fx, fy, u0, v0,还包含畸变系数[k1, k2, p1, p2, k3]
理想的透镜是没有畸变的。但是,因为制造和安装精度等方面的原因,镜头总是存在这畸变。畸变是相机固有特性,同款相机的畸变也会有些许差异,但是其和相机内参一样,标定一次即可。

畸变参数分为径向畸变(Radial Distortion)和切向畸变(Tangential Distortion),除了这两种之外也还有其他类型畸变,但是没有这两种显著,故忽略不计。

径向畸变

径向畸变来自透镜形状不规则以及建模的方式,导致镜头不同部分焦距不同。光线在远离透镜中心的地方偏折更大(枕型畸变)或更小(桶形畸变)。

从径向畸变开始。实际摄像机的透镜总是在成像仪的边缘产生显著的畸变,如下图所示。对某些透镜,光线在远离透镜中心的地方比靠近中心的地方更加弯曲。
在这里插入图片描述

对径向畸变,成像仪中心(光轴)的畸变为0,随着向边缘移动,畸变越来越严重。当然,在实际的相机中,这种畸变比较小,而且可以用r=0位置周围的泰勒级数展开的前几项来定量描述。

等号左边是畸变,右边的x,y是理想值。
在这里插入图片描述在这里插入图片描述

下图显示矩形网格因径向畸变而产生的位移。越远离光轴中心的地方,矩形网格上的点偏移越大。
在这里插入图片描述
下图描述了3种常见的畸变情形,桶形畸变通常k1>0,枕形畸变通常k1<0。
在这里插入图片描述

切向畸变

切向畸变来自于整个摄像机的组装过程。由于透镜制造上的缺陷使得透镜本身与图像平面不平行而产生的,如下图所示:

1569638268925
切向畸变可以用两个额外的参数p1和p2来描述:

在这里插入图片描述在这里插入图片描述

去畸变计算

到目前位置,相机的模型已经建立起来了,以下公式中的矩阵描述了相机的固有参数
在这里插入图片描述
有时(u0, v0)也写作(cx, cy),以及畸变参数:Distortioncoefficients=(k1,k2,p1,p2,k3)

决定这两个矩阵的过程,便是相机标定。通常,把摄像机对准一个有很多独立可标识点的物体,在不同角度观看这个物体,进一步可通过每个图像来计算摄像机的相对位置和方向,以及摄像机的内参。

在内参标定完成后,可以建立三维坐标和二维图像的关系:
在这里插入图片描述
综合径向畸变和切向畸变,我们总结出去畸变公式:
在这里插入图片描述

  • Ideal point (xu,yu)为理想点
  • real point (xd,yd)为实际点
  • dr为径向畸变,参数为{k1, k2, k3}
  • dt为切向畸变,参数为{p1, p2}
    于是通过下面的变换,可以得到没有畸变的标定结果:

在这里插入图片描述


等式右边的(x, y)为得到的图像中的理想点,但是存在畸变,于是把其带入等式左边,经过径向和切向变换后,得到右边的畸变校正后的实际点坐标(xcorrected, ycorrected),取出对应颜色值作为(x, y)的颜色值即可。通过去畸变,可以完成图像的矫正,如下图:
在这里插入图片描述
注:以上文字和图片均来源于链接,若有侵权请联系转载方删除。

这篇关于【自动驾驶】27.相机畸变_相机内参标定 整理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067575

相关文章

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

Spring使用@Retryable实现自动重试机制

《Spring使用@Retryable实现自动重试机制》在微服务架构中,服务之间的调用可能会因为一些暂时性的错误而失败,例如网络波动、数据库连接超时或第三方服务不可用等,在本文中,我们将介绍如何在Sp... 目录引言1. 什么是 @Retryable?2. 如何在 Spring 中使用 @Retryable

使用 Python 和 LabelMe 实现图片验证码的自动标注功能

《使用Python和LabelMe实现图片验证码的自动标注功能》文章介绍了如何使用Python和LabelMe自动标注图片验证码,主要步骤包括图像预处理、OCR识别和生成标注文件,通过结合Pa... 目录使用 python 和 LabelMe 实现图片验证码的自动标注环境准备必备工具安装依赖实现自动标注核心

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

rtmp流媒体编程相关整理2013(crtmpserver,rtmpdump,x264,faac)

转自:http://blog.163.com/zhujiatc@126/blog/static/1834638201392335213119/ 相关资料在线版(不定时更新,其实也不会很多,也许一两个月也不会改) http://www.zhujiatc.esy.es/crtmpserver/index.htm 去年在这进行rtmp相关整理,其实内容早有了,只是整理一下看着方