智慧交通day03-车道线检测实现02-1:相机校正

简介: 我们所处的世界是三维的,而照片是二维的,我们可以把相机认为是一个函数,输入量是一个场景,输出量是一幅灰度图。这个从三维到二维的过程的函数是不可逆的。

1. 相机标定的意义


我们所处的世界是三维的,而照片是二维的,我们可以把相机认为是一个函数,输入量是一个场景,输出量是一幅灰度图。这个从三维到二维的过程的函数是不可逆的。


6fe85e7995c04405b84830cde28b8ae2.png


相机标定的一个目的是要找一个合适的数学模型,求出这个模型的参数,能够近似从三维到二维的过程,使这个三维到二维的过程的函数找到反函数。


bf72fb20ea7d4e639d108c231c6983d6.png


这个逼近的过程就是相机标定,我们用简单的数学模型来表达复杂的成像过程。


由此可知,相机标定的一个目的就是建立像素坐标系和世界坐标系之间的关系。原理是根据摄像机的模型,由已知特征点的图像坐标求解摄像机的模型参数,并求出成像的反过程,从而从图像中恢复出空间点的三维坐标,达到三维重建的目的。


另外相机标定还可以进行图像校正,由于透镜的制造精度以及组装工艺的偏差会引入畸变,导致图形失真,所以我们可以求解畸变参数,对图像进行去畸变。


2. 成像原理


在介绍相机标定之前,我们首先来看下相机的成像模型。也就是,现实物体上的一个点在相机采集到的图像中所在的位置是怎么确定的。我们采用的模型是针孔模型,也就是小孔成像。


小孔成像是利用了光线直线传播的原理。比如说,远处有一棵大树,而我们有个盒子,在这个盒子的对着大树的那一面上用针尖戳一个小孔。我们任选这棵大树上的任何的一个点,它都会向四周去反射无数条光线。但是因为光线是直线传播的,所以这些光线要么没有一条能进入盒子中,要么就只有一条光线是进入到这个盒子里面的。进入到盒子中的光线会在盒子里的一面上形成一个光点。这个光点跟大树上的某个点是对应的,颜色也是一致的,这就建立了一对一的关系。如果我们把感光胶片或者感光的传感器放在盒子里,就可以做成一个针孔相机来得到大树的彩色图像了。如下图所示:


fc71f0c0468e473798b6ef021f80c568.png


由于大树上每个点反射的无数条光线只有一条进入到盒子中,所以图像是很暗的。而加大孔径,虽然可以提高图像的亮度,却会使物体上的某一个点会反射一小束光进入到相机里。这一小束光会在感光传感器上形成一个光斑,而不是一个点;从而相机失去了物体与图像上的点的一一对应关系,进而导致图像模糊甚至无法成像。当然实际的针孔相机不可能是让每个点只有一条光线进入相机。因为光具有波粒二象性,是可以衍射的,所以很小的针孔,也会导致图像模糊。根据可见光的波长,理论计算的小孔最佳直径是 0.25mm 左右,相应的光圈值大概是 f/200。


所以用一个直径比针孔直径大许多的凸透镜来替代针孔。凸透镜可以把物体上的一个点所反射的那一小束通过透镜的光重新汇聚成一个点,这样,不但图像亮度增大了,而且物体和图像上点的又可以一一对应起来了。这就是我们现在常用的相机的基本工作原理。


3. 相机成像模型


现在我们看下相机的成像模型,我们从下图中直观感受下:


9975df71f2b54de0a5d562682d0187ec.png


下面我们介绍下成像过程中的四大坐标系:


0970f55f899f47758fd2c964ca0130d2.png

46ff924e468b4b368240e584fb09905d.png

14858016cf874b60b7014db9f78e6f27.png


下面我们进行一系列的变换,引入多个参数矩阵,实现从世界坐标系到像素坐标的转换。已知一个现实世界中的物体点的在世界坐标系中的坐标为(Xw, Yw, Zw),经过相机拍摄得到图片,在图片上的像素坐标为(u , v )。假设在图像坐标系中的坐标为( x , y ),在相机坐标系中的坐标为(Xc, Yc, Zc)。各个坐标之间的转化流程如下图所示:


b05d2d99e7b049378d821bcda99b4f12.png


3.1. 世界坐标系与相机坐标系之间的转换


世界坐标系转换到相机坐标系时不会产生形变,所以将世界坐标系进行刚体变换就可转换为相机坐标系。三维空间中,当物体不发生形变时,而只进行旋转平移的运动,就是刚体变换。空间中的一个坐标系总可以通过刚体变换,即平移和旋转,就可以转换为另一个坐标系,如下图所示:


b7619e836ba340f3bc65437435ab998d.png


433928c9d4e2405586a88f554935df8a.png


下面我们看下旋转矩阵的计算,现在假设坐标系沿着z轴旋转,如下图所示:


43afbdbaaf9a45419bf7272839c8bd2a.png


则有:(假设其中x’,y’表示世界坐标系,x,y是相机坐标系)


f9a29db1aecb4be9b2ed15ad881b591d.png

4d4afb8bc71a49f49d24e758448d2030.png


3.2. 相机坐标系到图像坐标系的转换


从相机坐标系到图像坐标系,是从3d到2d的过程,属于透射投影关系:


b0e8b4647e2d4fcc99f53d88772354b2.png


8f8528e93c7f4124b866dcf489232203.png

7e49d82ba8e443c6ba68128b8a704259.png


3.3. 图像坐标系到像素坐标系


像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。图像坐标系的原点为相机光轴与成像平面的交点,通常情况下是成像平面的中点。图像坐标系的单位是mm,属于物理单位,而像素坐标系的原点在图像的左上角,单位是pixel,也就是我们说的几行几列。如下图所示:


0557fce83561424598a14c11685d1bff.png


所以这二者之间的转换如下:


4eae7d4600084b439ee80af42ccb2f7f.png

db95e3d9165a4b958b31da9056f53238.png


3.4. 总结


我们已经介绍了各个坐标系之间的转换过程,但是我们想知道的是如何从世界坐标系转换到像素坐标系,因此我们需要把上面介绍到的联系起来,将三者相乘,可以把这三个过程和在一起,写成一个矩阵:


3cd2b2becd6c4a1a90a9c0f7b38b2e4e.png


e73c9c8bb3ab433cb105192dcf154bd1.png


4. 图像畸变


我们在相机坐标系到图像坐标系变换时谈到透视投影。相机拍照时通过透镜把实物投影到像平面上,但是透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真。因此我们需要考虑成像畸变的问题。透镜的畸变主要分为径向畸变和切向畸变两类。


6fffaa5771a24f22b4e894ab55a92e4f.png


4.1. 径向畸变


顾名思义,径向畸变就是沿着透镜半径方向分布的畸变,产生原因是光线在原理透镜中心的地方比靠近中心的地方更加弯曲,这种畸变在普通的镜头中表现更加明显,径向畸变主要包括桶形畸变和枕形畸变两种。以下分别是枕形和桶形畸变示意图:(从左到右依次是:正常无畸变,桶形畸变和枕形畸变)


f1d42187cb2e4959a8fbce5f1d079283.png

405418e7faf34718aebeaaf05e89d57f.png


09cdf68611e14ad7bb95a7a80c4cae8a.png


4.2. 切向畸变


切向畸变是由于透镜本身与相机传感器平面(像平面)或图像平面不平行而产生的,这种情况多是由于透镜被粘贴到镜头模组上的安装偏差导致。在相机传感器和镜头不平行的情况下,因为存在夹角,所以光透过镜头传到图像传感器上时,成像位置发生了变化,如下图所示:


00a6e41c39a3488ca581a93b7acb8714.png


8fde904dead14469980b01f0039c5d97.png


下图显示某个透镜的切向畸变示意图,大体上畸变位移相对于左下—右上角的连线是对称的,这跟凸透镜与传感器之间的夹角有关:


4dd82ce002af459e9b0fe7f8fa1e6945.png


径向畸变和切向畸变模型中一共有5个畸变参数:k1、k2、p1、p2、k3,得到这五个参数,就可以进行图像的去畸变。这些都属于相机的内参。


5.相机标定的分类


相机标定方法一般分为三类,分为传统的标定算法,自标定法和基于主动视觉的标定法。分别介绍如下:


  • 传统的标定算法:传统的相机标定算法就是基于标定物的相机标定算法,在进行相机标定时,要通过专门指定的标定物来完成,此类方法是利用标定物上构建的已确定的物点坐标和与之对应的图像点之间的联系,借助一些数学方法,得到相机的内部和外部参数。它对标定物的要求有:标定物的特征部分与周围环境存在较大的差别,特征容易分辨且提取方便,标定物具有较高的稳定性,也就是说它的特征不随着相机位置的变换产生畸变。常见模板有棋盘格,圆形,三角形等。


3189772f524542479f971685074cc096.png


  • 代表算法有Tsai标定法和直接线性变换法(DLT)等。


  • 自标定法:该算法不使用标定物,而是依靠图像点之间存在的关系,直接计算相机的参数。该算法只计算相机的内部参数的约束,不考虑相机系统的外部场景,所以方法灵活,应用范围较广,但是算法鲁棒性较差,只适合精度要求较低的场合。


  • 基于主动视觉的标定法:该算法是控制相机做一些特定的动作,比如说平移,旋转,得到多张图片,以此计算相机参数。使用比较广泛的有两类:一类是在三维空间中,让相机作两组纯平移运动,进而求解相机的参数,第二类是控制相机绕光心轴旋转,获得相机的参数。此类方法优点是算法简单,往往能够获得线性解,故鲁棒性较高,缺点是系统的成本高、实验设备昂贵、实验条件要求高,而且不适合于运动参数未知或无法控制的场合。
目录
相关文章
|
传感器 算法 数据处理
yolo目标检测+目标跟踪+车辆计数+车辆分割+车道线变更检测+速度估计
yolo目标检测+目标跟踪+车辆计数+车辆分割+车道线变更检测+速度估计
|
机器学习/深度学习 编解码 监控
计算机视觉实战项目4(单目测距与测速+摔倒检测+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A_路径规划+行人车辆计数+动物识别等)-1
计算机视觉实战项目4(单目测距与测速+摔倒检测+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A_路径规划+行人车辆计数+动物识别等)-1
|
7月前
|
人工智能
拥抱AI原生!8月29日深圳,企业实践工作坊火热报名中
阿里云诚挚邀请您参加【AI原生,智构未来——AI原生架构与企业实践】工作坊,8月29日13:30于深圳·LandMarkCoffee 蓝马咖啡(南山区科技园桑达科技大厦1楼)从开发范式到工程化实践,全链路解析AI原生架构奥秘,与AI先行者共探增长新机遇。立即报名:https://hd.aliyun.com/form/6638
437 16
拥抱AI原生!8月29日深圳,企业实践工作坊火热报名中
|
机器学习/深度学习 存储 缓存
ORCA:基于持续批处理的LLM推理性能优化技术详解
大语言模型(LLMs)的批处理优化面临诸多挑战,尤其是由于推理过程的迭代性导致的资源利用不均问题。ORCA系统通过引入迭代级调度和选择性批处理技术,有效解决了这些问题,大幅提高了GPU资源利用率和系统吞吐量,相比FasterTransformer实现了最高37倍的性能提升。
786 26
|
7月前
|
机器学习/深度学习 算法 物联网
【MPC】模型预测控制(MPC)之多变量和状态空间研究(Matlab代码实现)
【MPC】模型预测控制(MPC)之多变量和状态空间研究(Matlab代码实现)
671 0
|
Windows
Multisim 14二极管及其电路的应用
Multisim 14二极管及其电路的应用
575 1
|
机器学习/深度学习 数据采集 供应链
使用Python实现智能食品销售预测的深度学习模型
使用Python实现智能食品销售预测的深度学习模型
355 3
|
前端开发 JavaScript UED
debounce(防抖)和 throttle(节流)是两种非常实用的技术,它们可以帮助我们有效地控制函数的执行频率,提高应用的性能和用户体验。
【9月更文挑战第1天】在前端开发中,频繁的用户操作可能导致性能问题。为此,debounce(防抖)和 throttle(节流)技术应运而生,有效控制函数执行频率,提升应用性能和用户体验。debounce 原理是在一定时间内仅执行最后一次事件,减少不必要的计算;throttle 则确保函数按固定频率执行,保证基本响应速度。二者广泛应用于搜索实时反馈、滚动事件处理等场景,可通过原生 JavaScript 或第三方库如 Lodash 实现。正确使用可显著改善应用性能。
251 8
|
前端开发 Java Go
vscode怎么运行程序代码的两种方法
VSCode要运行程序的代码,大致要分为两种情况而定,一种是前端的代码,另一种是后端的代码。在VSCode中,后端代码的运行,可以从VSCode打开终端,然后使用命令行工具,使用命令来运行后端代码程序,比如Python的就可以使用命令:python file.py;Golang就可以使用:go run file.go;Java的就可以使用:java file.java,具体的步骤如下
817 1
|
机器学习/深度学习 计算机视觉
【机器学习】LoFTR:革命性图像特征批评技术等领跑者
【机器学习】LoFTR:革命性图像特征批评技术等领跑者
947 1

热门文章

最新文章