康谋技术 | 深入探讨:自动驾驶中的相机标定技术

随着自动驾驶技术的快速发展,多传感器的数据采集和融合可以显著提高系统的冗余度和容错性,进而保证决策的快速性和正确性。在项目开发迭代过程中,传感器标定扮演着至关重要的角色,它位于数据采集平台与感知融合算法之间,是确保传感器数据准确性的基础,同时也是实现传感器融合的关键先决条件。

在众多传感器中,相机以其丰富的信息获取能力和成本效益而成为自动驾驶系统中的首选。相机标定可以提高空间定位精度,消除畸变影响,统一传感器数据以及增强系统的鲁棒性。


目录

一、相机的工作原理

二、相机的标定参数

三、标定方法

作者介绍


一、相机的工作原理

通过相机拍摄图像,可以将3D世界投影成2D图像。因此可以把相机模型看作一个从3D空间到2D空间的映射。采用小孔成像模型来描述相机的成像原理。

小孔成像模型由光心、光轴和成像平面几个部分组成,且假设所有成像过程都满足光的直线传播条件。根据光的直线传播理论,空间中的物点反射光经过光心后,投影到平面形成一个倒立的像点。虽然作为理想的成像模型,小孔成像的物理性质极佳,但是实际的相机光学系统中大多是由透镜组成的,在透镜成像中需要满足以下条件:

\frac{1}{f}=\frac{1}{u}+\frac{1}{v}

其中,表示 f透镜的焦距, u表示物距, v 表示像距,如图1所示。

图1 凸透镜成像原理

相机成像系统主要有4个坐标系,分别是世界坐标系、相机坐标系、图像坐标系和像素坐标系,如图2所示。世界坐标系通过平移和旋转得到相机坐标系,相机坐标系通过成像模型中的相似三角形原理得到图像坐标系,图像坐标系通过平移和缩放得到像素坐标系。

图2 相机成像系统中4个坐标系之间的关系

这些坐标系描述了从三维空间到二维图像的坐标变换过程。标定的目标是确定这种变换关系,即三维物体表面点与二维图像对应点之间的关系,从而建立摄像头成像的几何模型。

二、相机的标定参数

相机的标定参数主要包括内参、外参和畸变参数。从世界坐标系到像素坐标系的转换是图像处理和计算机视觉中的关键步骤,它允许我们理解图像中物体的真实位置和尺寸,进而实现各种应用,如自动驾驶中的物体检测与定位。

  • 内参是相机自身的固有属性,包括焦距、主点坐标和像素的物理尺寸等信息,这些参数不会因外界环境而改变,可以通过标定获得。相机的内参矩阵 A(d_{x},d_{y},r,v_{0},u_{0},f) , 内参矩阵是实现图像坐标系与像素坐标系转换的关键。 d_{x},d_{y}分别表示在x和y轴方向上一个像素占据的实际长度,r表示径向畸变参数之一, f表示焦距, u_{0},v_{0} 表示像素坐标下的主坐标点。

  • 外参描述了摄像头在世界坐标系中的位置和方向,包括旋转角度和平移参数,它说明了现实世界点是如何通过平移和旋转映射到摄像头坐标系的。其中,R为旋转矩阵,负责实现坐标系之间的旋转变换。T为平移矩阵,负责实现坐标系之间的平移变换。

  • 畸变参数则是用来描述摄像头成像过程中产生的形状改变和扭曲。畸变主要包括径向畸变和切向畸变,即相机的径向畸变系数 k_{1},k_{2},k_{3}等和相机的切向畸变系数p_{1},p_{2}等。常见的畸变类型,如图3所示。

图3 图像畸变的两种类型

因此,世界坐标系到像素坐标系的转换关系为:

其中,相机坐标系到图像坐标系转换时,由于相机镜头制造工艺缘故,需要进行畸变桥正。径向畸变是由于透镜形状的制造工艺导致的,且越向透镜边缘移动,径向畸变就越严重。矫正径向畸变前后的坐标关系为:

X_{corrected}=x(1+k_{1}\times r^{2}+k_{2}\times r^{4}+k_{3}\times r^{6})

Y_{corrected}=y(1+k_{1}\times r^{2}+k_{2}\times r^{4}+k_{3}\times r^{6})

切向畸变是由透镜和CMOS或者CCD的安装位置误差导致的。切向畸变需要两个额外的畸变参数来描述,矫正前后的坐标关系为:

X_{corrected}=x+2p_{1}xy+p_{2}(r^{2}+2x^{2})

Y_{corrected}=y+2p_{2}xy+p_{1}(r^{2}+2y^{2})

因此,一共需要5个畸变参数。求出上述这些参数即完成了标定过程。

三、标定方法

标定方法是视觉领域中摄像头校准的关键步骤,直接影响视觉系统的输出结果。主要的标定方法包括自标定、根据参照物进行标定和基于主动视觉的标定法。 在这些方法中,张正友标定法因其简便、高精度和广泛的适用性而备受推崇。它利用双平面棋盘格结构作为标定物,通过观察棋盘格在不同视角下的图像,可以计算出相机的内外参数。克服了传统方法需要高精度标定物的缺点,并提高了自标定的精度。张氏标定法的主要贡献在于提出了计算相机参数优化初值的方法,成为计算机视觉领域广泛应用的标定方法之一。 张正友标定法的整体流程如下:

  1. 制作标定板并从不同角度(平移、旋转)拍摄若干张图像(10-20张)。

  2. 检测图像中的特征点。

  3. 求解理想无畸变情况下的内参、外参。

  4. 使用最小二乘法求出实际的径向畸变参数。

  5. 使用极大似然法优化估计,结合内参、外参、畸变参数,提升估计精度。

  6. 得到实际的内参、外参、畸变参数。

相机标定是自动驾驶系统中不可或缺的一环,它直接影响到系统的感知能力和决策准确性。通过深入理解和掌握相机标定的技术要点,我们可以为自动驾驶车辆提供更加准确和可靠的视觉感知能力,推动自动驾驶技术的发展和应用。


作者介绍

郑工

康谋高级自动驾驶技术研发工程师,拥有超过5年的汽车电子和自动驾驶数据分析经验,专精于高精度传感器数据的获取、整合与优化。在数据采集技术方面造诣深厚,尤其在车载网络和实时数采系统上富有实践成果,设计并优化了多种数据采集与传输方案。曾多次代表公司参加海外技术研讨会和培训项目,深入了解国际自动驾驶行业的最新动态和技术趋势,积累了丰富的国际视野。


欢迎联系康谋自动驾驶团队了解更多信息。

我们将竭诚为您服务!

期待与您的交流!

康谋科技 - 您的一站式自动驾驶解决方案合作伙伴,助力自动驾驶商业化落地 - keymotek康谋科技有限公司是原虹科自动驾驶业务孵化出来的全新独立公司,专注于自动驾驶领域。我们以数据为驱动力,提供高性能的数据采集、记录、传输方案,针对各种驾驶场景进行精准的仿真模拟,以及对大量自动驾驶数据进行高效、高质量处理。我们的一站式服务能够满足自动驾驶领域研发测试的全流程需求,助力客户在自动驾驶领域取得更大突破。icon-default.png?t=N7T8https://keymotek.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

今天碰到的一点小问题(网上搜了一下理解了一下

在编程中,let 是一个关键字,主要用于声明一个块级作用域的局部变量。它是在 ECMAScript 2015(也称为 ES6)中引入的,以替代 var 关键字,用于解决 var 的一些作用域问题。 使用 let 声明的变量具有以下特点&…

如何使用自定义Promptbooks优化您的安全工作流程

在当今的数字化时代,安全工作流程的优化变得前所未有的重要。安全团队需要快速、有效地响应安全事件,以保护组织的数据和资产。Microsoft Copilot for Security提供了一种强大的工具——自定义Promptbooks,它可以帮助安全专家通过自动化和定制…

Swift高级特性之泛型

泛型是一种在编程语言中实现通用性的特性,它允许我们编写可以适应不同数据类型的代码。在Swift中,泛型可以应用于函数、类、结构体和枚举。 1.泛型函数:使用泛型函数可以编写一次代码,用于处理不同类型的数据。例如,我…

Linux下git维护

目录 1、安装 2、git是一个版本控制器 3、git操作 1、 #将文件放到本地仓库 2、#提交到本地 3、#远端修改同步(需输密码) 4、#查看提交日志 5、#删除对应文件 4、相关理解: 1、安装 sudo yum -y install git 2、git是一个版本控制器…

tmux 命令速查 导图

最近在使用tmux,整理了一份命令的导图,大家需要自取~ tmux是什么? Tmux是一个终端复用器,一个非常有用的linux开发工具。 基本概念 会话: 与命令下的终端窗口类似;tmux进程,可包…

SpringBoot整合Swagger2

SpringBoot整合Swagger2 1.什么是Swagger2?(应用场景)2.项目中如何使用2.1 导入依赖2.2 编写配置类2.3 注解使用2.3.1 controller注解:2.3.2 方法注解2.3.3 实体类注解2.3.4 方法返回值注解2.3.5 忽略的方法 3.UI界面 1.什么是Swa…

浅谈PyExecJS模块

浅谈PyExecJS模块 PyExecJS 是一个 Python 模块,用于在 Python 中执行 JavaScript 代码。 PyExecJS 模块的主要作用: 执行 JavaScript 代码:允许在 Python 环境中执行 JavaScript 代码,这在一些需要跨语言处理或评估 JavaScript…

短视频矩阵系统----技术源头开发

短视频矩阵系统--- 1. 确定账号类型和目标受众 2. 准备账号资料 3. 搭建系统框架 4. 开发核心功能 5. 测试和调试 6. 部署和维护 7. 推广和运营 在开发短视频账号矩阵系统源码时,可以使用一些开源框架和工具来提高开发效率和降低开发难度。同时,需要组…

Qt查询mysql表的信息解释

Qt如何查询表中的数据呢? 首先我们需要连接数据库,连接完了,我们进行操作数据库。 连接数据库的代码: bool MainWindow::connectToDatabase(QSqlDatabase &db, const QString &host, const QString &dbName, const…

如何使用Python进行Web开发,如Flask或Django?

Python是一种非常流行的Web开发语言,它提供了多种框架来帮助开发者快速构建Web应用程序。Flask和Django是两个非常受欢迎的Python Web框架,它们各有特点和优势。 Flask Flask是一个轻量级的Web应用框架,它易于上手且灵活。Flask适合小型项目…

抓取电商产品数据的方法|PHP|Python多语言环境|高并发需求|电商商品API接口数据采集

电商商品数据的抓取|电商平台商品API接口 客户在搭建电商网站时经常提出的诉求和相应的解决方案如下: 1. **网站设计和用户体验**: - 诉求:希望有吸引力、易用性强的网站设计,提升用户体验。 - 解决方案:设计专…

使用pdfbox将pdf转换成图片

导入pom文件 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>fontbox</artifactId><version>2.0.22</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifact…

react ts react-router 6路由配置

创建一个router.tsx文件 // // 配置路由信息 import { BrowserRouter,HashRouter, Routes, Route,createBrowserRouter,useRoutes } from "react-router-dom"; import React,{useState,lazy,Component } from "react" import { JSX } from react/jsx-runt…

无人机--行业生命周期分析

行业生命周期:无人机行业生命周期还相对较短&#xff0c;但已经经历了多个阶段的发展。从最初的军用无人机&#xff0c;到近年来民用无人机和商业无人机的快速发展&#xff0c;无人机行业正逐渐走向成熟阶段。未来随着技术的不断进步和应用领域的不断拓展&#xff0c;无人机行业…

项目7-音乐播放器5+注册账号

1.前端代码 MAPPER Insert("insert into user(username,password) values (#{username},#{password}) ")Integer insertUserInfo(String username,String password); Service public Result insertUserInfo(String username, String oldpassword,String newpasswo…

0 回归-海上风电出力预测

https://www.dcic-china.com/competitions/10098 分析一下&#xff1a;特征工程如何做。 时间特征&#xff1a; 小时、分钟、一个星期中的第几天、一个月中的第几天。这些可以作为周期特征的标识。比如周六周日的人流会有很大的波动&#xff0c;这些如果不告诉模型它是很难学习…

NLP地点位置抽取python库实现

在自然语言处理(NLP)中,抽取文本中的地点信息通常涉及到命名实体识别(NER,Named Entity Recognition)任务。Python 中常用的库如spaCy、NLTK、StanfordNLP、Hugging Face Transformers等均提供了相应的功能来识别文本中的地理位置实体。以下是一个使用spaCy库抽取地理位置…

^ SyntaxError: iterable unpacking cannot be used in comprehension

这个错误是Python中的一个语法错误&#xff0c;意思是在列表推导式中不能使用可迭代对象的解包操作符。列表推导式是一种简洁的创建列表的方式&#xff0c;但是在使用解包操作符时会导致语法错误。 解包操作符&#xff08;*&#xff09;用于将可迭代对象拆分为单独的元素&…

如何关掉地址空间随机化

如果我们的ru没有密码的话我们要先建一个密码 接着输入 su 进入root 接着输入 echo 0 > /proc/sys/kernel/randomize_va_space 就可以啦 接着可以cat查看是不是显示0&#xff0c;是的话就成功了

【Linux的git操作】

Linux学习笔记---010 Linux的git操作1、什么是gitee2、git 准备工作2.1、查看是否安装了 git 版本工具2.2、安装 git 工具/更新成最新版本2.3、在gitee上创建远程仓库&#xff08;略&#xff09;2.4、提交file的初始化操作 3、git的“三板斧”3.1、add3.2、commit3.3、push3.4、…