相机内参标定理论篇------相机模型选择

相机种类:

当拿到一款需要标定内参的相机时,第一个问题就是选择那种的相机模型。工程上相机类型的划分并不是十分严格,一般来说根据相机FOV可以把相机大概分为以下几类:

长焦相机:<= 30^{o}

标准相机:40^{o}~60^{o}

广角相机:60^{o}~140^{o}

鱼眼相机:>140^{o}

这里按角度的划分并不是绝对严格,临界处的相机用两种模型中的任意一种都可以。

有时也可能会遇到变焦相机和定焦相机之分,但变焦相机在标定内参时也需要固定焦距,因此也可以划分到上面几类。这里需要注意内参和焦距的严格对应的,当调焦后需要重新标定相机内参。

不同角度的相机需要选择不同的相机模型来标定相机内参。相机模型又分为投影模型畸变模型。接下来分别进行讨论。

长焦相机:

长焦相机的标定一般采用针孔相机模型,但在实际标定中我们很难通过标定板来标定长焦相机。长焦相机的景深太大,普通标定板由于尺寸较小会导致其在采集的图像中所占区域太小,无法提供足够的约束来标定外参。如果强行在近处采集标定板图像,会造成图像上标定图像模糊不清,从而导致角点提取误差较大,甚至失败。因此标定时计算外参会有非常大的误差,又因为相机内参和外参在投影时具有耦合的效应,即使重投影误差非常小也无法保证内参的正确性。这也是为什么重投影误差只能作为内参精度的参考,而无法作为衡量标准。

所以一般来说不建议个人去标定长焦相机,即使标定出来结果也很有可能是错误的。之前笔者还是小白的时候尝试使用标定板标定长焦相机,虽然重投影误差很小但内参精度较差,点云投影效果还没有使用相机厂商提供的参考内参值精确。如果必须自己标定的话也不建议用标定板的方式,需要设计新的方法,核心是保证参照物能够提供足够的约束。

标准相机:

针对标准相机工程上采用针孔相机模型标定。其原理类似于小孔成像,不同之处在于为了增加透光量采用凸透镜。其投影模型为针孔投影模型,原理如下图所示:

接下来考虑其畸变模型,这里需要了解一下概念:径向畸变和切向畸变。

一般来说,制造透镜很难保证曲率和设计的一致,曲率制造的误差会造成相机成像是在径向产生误差即径向畸变。径向畸变主要有以下两种:桶型畸变和枕型畸变。

径向畸变主要描述畸变量和像素到图像中心距离的关系,后续会在具体公式讨论。

同样安装时镜头和成像平面无法保证绝对平行,因此会产生切向畸变:

切向畸变主要描述成像平面和光轴之间的倾斜角度。因此针孔相机模型的畸变模型是径向切向畸变模型。

接下来看如何将相机坐标系下的点投影到图像上:相机坐标系->图像坐标系->像素坐标系。

具体公式如下:

\begin{bmatrix} x\\ y\\ 1 \end{bmatrix} = \frac{1}{Z}\begin{bmatrix} fx & r & cx\\ 0 & fy & cy\\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} X\\ Y\\ Z \end{bmatrix}

一般投影时先对空间三维点归一化:

\begin{bmatrix} x\\ y\\ 1 \end{bmatrix} = \begin{bmatrix} fx & r & cx\\ 0 & fy & cy\\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} \frac{X}{Z}\\ \frac{Y}{Z}\\ 1 \end{bmatrix}

其中u v是无畸变点,r描述相机坐标xy轴是否垂直,一般情况下为0。接下来对点加径向畸变:

x_{distored} = x(1 + k_{1}r^{2} + k_{2}r^{4} + k_{3}r^{6})

y_{distored} = y(1 + k_{1}r^{2} + k_{2}r^{4} + k_{3}r^{6})

其中k1 k2 k3是径向畸变参数。有时会遇到k4 k5,也是径向畸变参数,不过一般用到k3就行了。因为径向畸变是泰勒展开的多项式拟合,用到太多畸变参数就会存在过拟合问题反而效果不好。

上面提到的枕型畸变和桶型畸变与k的取值有关,当k都大于零时就会产生枕型畸变,反之则会产生桶型畸变。

接下来再加上切向畸变:

x_{distored} = x + [2p_{1}xy + p_{2}(r^{2} + 2x^{2})]

y_{distored} = y + [2p_{2}xy + p_{1}(r^{2} + 2y^{2})]

以上就是相机坐标系下点投影到图像上像素的整个过程。

广角相机:

广角相机和鱼眼相机其实都属于鱼眼相机的范畴,只是标定时选择的相机模型不一样。在介绍接下来几种相机模型前还是简单介绍鱼眼相机相关的基础知识以方便理解。

                 

        你以为的鱼眼相机                                                       实际的鱼眼相机

我们知道鱼眼相机的初衷是为了让相机看到尽可能大的视野,也就是尽可能将场景中的物体投影到图像上,因此鱼眼相机通过组合多个镜头将光线多次折射到图像平面上。鱼眼相机需要根据某种投影模型进行设计,常见的设计模型主要分为四种:等距投影模型、等立体角投影模型、正交投影模型和体视投影模型。其投影过程如下图所示,除了f*tan(\theta)对应针孔投影模型外,其它四种对应上面四种。

鱼眼相机四种投影模型其中最常用的是等距相机模型,所以主要对等距相机模型进行讨论,其它模型感兴趣自己上网搜索。等距相机模型:

投影公式为:r = f * \theta,r为成像的高,\theta为入射角。该模型描述成像的像高和入射角成正比。

广角相机最好选择等距相机模型,OpenCV中使用的模型是由Kannala提出的一种鱼眼相机的一般近似模型。是在等距投影模型的基础上提出来的。接下来对OpenCV中相机模型进行分析。整体过程如下图所示:

这里主要是利用相机模型将世界坐标系下点投影到图像上的过程。第一步是将世界坐标系的点通过外参转到相机坐标系下,然后转到归一化平面上。这时考虑畸变对投影的影响,也可以看出等距相机模型的畸变只考虑了径向畸变没有考虑切向畸变。

已知等距相机模型r = f * \theta,在实际中很难按设计模型制造,因此使用多项式拟合。最后得到包含畸变后新的\thetad。接着计算归一化平面上带畸变的投影点x^{'},y^{'}。然后利用针孔投影模型将点投影到图像上。上面公式中有一个\alpha,这个是表征图像平面xy是否垂直的参数,很多情况下默认为0。

鱼眼相机:

作者个人经验,小于180度的相机可以使用OpenCV中相机模型来标定相机,但是如果相机度数大于180度时OpenCV标定出来的效果并不是十分好。

这时标定相机可以用的相机模型有kalibr的MEI模型或是Davide Scaramuzza的ocam相机模型。但在实际应用中ocam相机模型更好一些。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

某验第四代滑块逆向快速破解

本期地址如下&#xff0c;使用base64解码获得网址 aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v 破解某验&#xff0c;某盾已经是司空见惯的事情了&#xff0c;网上也有很多资料查阅&#xff0c;但是大多数都是繁琐、冗长&#xff0c;本文以最直接快速理解的方法讲解&#xff0c;稍微认真…

想要学会JVM调优,先掌握JVM内存模型和JVM运行原理

1、前言 今天将和你一起探讨Java虚拟机&#xff08;JVM&#xff09;的性能调优。 JVM算是面试中的高频问题了&#xff0c;通常情况下总会有人问到&#xff1a;请你讲解下 JVM 的内存模型&#xff0c;JVM 的 性能调优做过&#xff1f; 2、为什么 JVM 在 Java 中如此重要 首…

IT安全:实时网络安全监控

了解庞大而复杂的网络环境并非易事&#xff0c;它需要持续观察、深入分析&#xff0c;并对任何违规行为做出快速反应。这就是为什么实时网络安全监控工具是任何组织 IT 安全战略的一个重要方面。 网络攻击和合规性法规是 IT 安全的两个主要驱动因素。同时&#xff0c;数据泄露…

LaTeX论文排版

LaTeX论文排版 LaTeX 简介与使用为什么选择使用LaTeX进行论文排版&#xff1f;LaTeX下载与安装LaTeX环境安装——TeX Live(Windows、Linux)安装IDE——TeXstudio LaTeX软件界面 BIT-thesis模板BIT-Thesis&#xff1a;主控文件demo.tex&#xff1a; 公式、图片、表格的排版使用L…

c语言用四种方式求解成绩之中最高分和最低分的差值

文章目录 一&#xff0c;题目二&#xff0c;方法1&#xff0c;方法一2&#xff0c;方法二3&#xff0c;方法三4&#xff0c;方法四 三&#xff0c;示例结果 一&#xff0c;题目 最高分最低分之差 输入n个成绩&#xff0c;换行输出n个成绩中最高分数和最低分数的差 输入 : 两行…

安防视频监控系统EasyCVR实现H.265视频在3秒内起播的注意事项

可视化云监控平台/安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;同时…

Java中XML的解析

1.采用第三方开元工具dom4j完成 使用步骤 1.导包dom4j的jar包 2.add as lib.... 3.创建核心对象, 读取xml得到Document对象 SAXReader sr new SAXReader(); Document doc sr.read(String path); 4.根据Document获取根元素对象 Element root doc.getRootElement(); …

Bean 生命周期 和 SpringMVC 执行过程

这里简单记录下 Bean 生命周期的过程&#xff0c;方便自己日后面试用。源码部分还没看懂&#xff0c;这里先贴上结论 源码 结论

Spring Boot 中的虚拟线程

在本文中&#xff0c;我将讨论 Spring Boot 中的虚拟线程。 什么是虚拟线程&#xff1f; 虚拟线程作为 Java 中的一项功能引入&#xff0c;旨在简化并发性。 Virtual threads 是 轻量级的线程&#xff0c;由 Java Virtual Machine 而不是操作系统管理。它们被设计为易于使用且…

Apache Flink连载(十八):Flink On Yarn运行原理及环境准备

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. Flink On Yarn运行原理…

Final Cut 视频剪辑快速入门,小白上手视频课的制作

本文是一个快速入门教程&#xff0c;如果您是0视频处理基础&#xff0c;又想录制网课或是一些对效果要求不高的视频那么这篇教程足够使用了。 本文主要用Final Cut处理视频课&#xff0c;本文是笔者在制作视频课过程中逐渐摸索的&#xff0c;如果您想制作一些比较专业的视频&a…

docker学习(二十一、network使用示例container、自定义)

文章目录 一、container应用示例1.需要共用同一个端口的服务&#xff0c;不适用container方式2.可用示例3.停掉共享源的容器&#xff0c;其他容器只有本地回环lo地址 总结 二、自定义网络应用示例默认bridge&#xff0c;容器间ip通信默认bridge&#xff0c;容器间服务名不通 自…

SpringBoot 3.2.0 基于Logback定制日志框架

依赖版本 JDK 17 Spring Boot 3.2.0 工程源码&#xff1a;Gitee 日志门面和日志实现 日志门面&#xff08;如Slf4j&#xff09;就是一个标准&#xff0c;同JDBC一样来制定“规则”&#xff0c;把不同的日志系统的实现进行了具体的抽象化&#xff0c;只提供了统一的日志使用接…

C语言实验1:C程序的运行环境和运行C程序的方法

一、算法原理 这是学C语言的入门&#xff0c;并不需要很高深的知识&#xff0c;一个hello world 或者一个简单的加法即可 二、实验要求 了解所用的计算机系统的基本操作方法&#xff0c;学会独立使用该系统。 了解在该系统上如何编辑、编译、连接和运行一个C程序。 通过运…

Kali Linux如何启动SSH并在Windows系统远程连接

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 简单几步通过[cpolar 内网穿透](cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站)软件实现ssh 远程连接kali! …

PyTorch实战:基于Seq2seq模型处理机器翻译任务(模型预测)

文章目录 引言数据预处理加载字典对象en2id和zh2id文本分词 加载训练好的Seq2Seq模型模型预测完整代码结束语 引言 随着全球化的深入&#xff0c;翻译需求日益增长。传统的人工翻译方式虽然质量高&#xff0c;但效率低&#xff0c;成本高。机器翻译的出现&#xff0c;为解决这…

八股文打卡day12——计算机网络(12)

面试题&#xff1a;HTTPS的工作原理&#xff1f;HTTPS是怎么建立连接的&#xff1f; 我的回答&#xff1a; 1.客户端向服务器发起请求&#xff0c;请求建立连接。 2.服务器收到请求之后&#xff0c;向客户端发送其SSL证书&#xff0c;这个证书包含服务器的公钥和一些其他信息…

Python 网络编程之搭建简易服务器和客户端

用Python搭建简易的CS架构并通信 文章目录 用Python搭建简易的CS架构并通信前言一、基本结构二、代码编写1.服务器端2.客户端 三、效果展示总结 前言 本文主要是用Python写一个CS架构的东西&#xff0c;包括服务器和客户端。程序运行后在客户端输入消息&#xff0c;服务器端会…

文件操作安全之-目录穿越流量告警运营分析篇

本文从目录穿越的定义,目录穿越的多种编码流量数据包示例,目录穿越的suricata规则,目录穿越的告警分析研判,目录穿越的处置建议等几个方面阐述如何通过IDS/NDR,态势感知等流量平台的目录穿越类型的告警的线索,开展日常安全运营工作,从而挖掘有意义的安全事件。 目录穿越…

Quartus的Signal Tap II的使用技巧

概述&#xff1a; Signal Tap II全称Signal Tap II Logic Analyzer&#xff0c;是第二代系统级调试工具&#xff0c;它集成在Quartus II软件中&#xff0c;可以捕获和显示实时信号&#xff0c;是一款功能强大、极具实用性的FPGA片上调试工具软件。 传统的FPGA板级调试是由外接…