相机标定学习记录
相机标定是计算机视觉和机器视觉领域中的一项基本技术,它的主要目的是通过获取相机的内部参数(内参)和外部参数(外参),以及镜头畸变参数,建立起现实世界中的点与相机成像平面上对应像素点之间准确的位置关系。
基本原理
相机标定的基本原理是通过一系列的数学变换和几何模型,将现实世界中的三维坐标点(世界坐标系)转换为相机成像平面上的二维坐标点(图像坐标系)。
坐标系转换
- 世界坐标系:现实世界中的点用三维坐标表示。
- 相机坐标系:以相机光心为原点的三维坐标系。
- 成像平面坐标系(图像坐标系):在相机坐标系中,通过成像平面上的点来表示图像中的点。
- 像素坐标系:在成像平面坐标系的基础上,进一步考虑像素的尺寸,以像素为单位。
数学模型
相机标定的数学模型通常基于小孔成像模型。该模型假设光线是直线,且相机内没有畸变。
一个典型的相机标定过程包括以下步骤:
- 建立几何关系:使用一个已知尺寸的标定板(如棋盘格)放置在相机前不同的位置和角度,获取多个视角的图像。
- 特征提取:从每个图像中提取出标定板的角点,这些角点在标定板上的位置是已知的(世界坐标系)。
- 坐标转换:利用相机的内参(焦距、主点等)和外参(相机相对于标定板的位置和方向),以及畸变参数,将世界坐标系中的点转换为像素坐标系中的点。
- 参数估计:通过最小化重投影误差(实际图像点与通过模型计算得到的图像点之间的差异),使用优化算法(如最小二乘法)来求解相机参数。
相机参数
- 内参:焦距(f)、主点(c_x, c_y)、成像平面与相机坐标系之间的比例因子(s)。
- 外参:描述相机在世界坐标系中的位置和方向,由旋转矩阵(R)和平移向量(t)组成。
- 畸变参数:由于镜头制造和安装的原因,实际成像与理想成像存在偏差,这包括径向畸变(k_1, k_2, k_3)和切向畸变(p_1, p_2)。
标定的目的
- 畸变校正:通过校正镜头畸变,生成更接近真实世界的图像。
- 三维重建:在已知相机参数的情况下,可以从多个图像中重构出物体的三维结构。
步骤
1. 准备标定板
- 标定板:通常使用具有明显特征的图案,如黑白相间的棋盘格或圆点图案。
- 尺寸:标定板的实际尺寸需要已知,以便于后续转换计算。
2. 拍摄标定图像
- 使用相机拍摄多张标定板在不同角度和位置的照片。确保标定板在每张照片中至少有一部分是可见的。
3. 特征提取
- 从每个图像中提取标定板的特征点(如棋盘格的角点)。
4. 建立世界坐标系与图像坐标系的关系
- 世界坐标系:假设标定板平面为世界坐标系的XOY平面,标定板上的点可以精确测量。
举例
假设我们有一个10x7的棋盘格,每个格子的大小是1cm x 1cm。
- 世界坐标系:以棋盘格的左上角为原点(0,0,0),每个格子的角点可以按照厘米给出坐标。
5. 相机参数初始化
- 首先需要估计相机参数的初始值,这可以通过一些基本假设来完成,例如假设相机的焦距、主点位于图像中心等。
6. 参数优化
- 使用最小化重投影误差的方法(如张氏标定法、Levenberg-Marquardt算法等)来优化相机参数。
- 重投影误差是指实际观察到的图像点与通过当前相机参数计算得到的图像点之间的差异。
7. 畸变校正
- 一旦获得了相机的内参和畸变参数,就可以对图像进行畸变校正。
举例
- 假设相机由于镜头原因产生了径向畸变,我们可以通过畸变参数来校正图像,使得图像中的直线看起来更加直线。
张氏标定法
张氏标定法(Zhang's Method)是由张正友博士在1998年提出的一种高效且实用的相机标定方法。该方法使用一个平面棋盘格作为标定图案,通过从不同角度拍摄多张图像来标定相机的内参和外参。以下是张氏标定法的基本步骤:
-
准备标定板:使用一个平面棋盘格作为标定图案,棋盘格上的角点坐标是已知的。
-
拍摄标定图像:从不同角度和位置拍摄多张标定板的图像。确保标定板在每张图像中至少有一部分是可见的。
-
提取角点坐标:从每个图像中提取标定板的角点坐标。这些坐标是图像坐标。
-
建立世界坐标系与图像坐标系的关系:假设标定板平面为世界坐标系的XOY平面,标定板上的点可以精确测量。因此,可以建立标定板上的点在世界坐标系和图像坐标系之间的对应关系。
-
初始化相机参数:首先估计相机的内参(焦距、主点等)和外参(相机在世界坐标系中的位置和方向)的初始值。
-
优化相机参数:使用优化算法(如Levenberg-Marquardt算法)最小化重投影误差,即实际观测到的图像点与通过当前相机参数计算得到的图像点之间的差异。通过多次迭代优化,不断调整相机参数,直到重投影误差最小。
-
畸变校正:一旦获得了相机的内参和畸变参数,就可以对图像进行畸变校正。
张氏标定法具有以下优点:
- 高效:只需使用一个平面棋盘格作为标定图案,拍摄多张图像即可。
- 实用:不需要精确知道相机与标定板之间的位姿关系,只需从不同角度拍摄图像即可。
- 精度高:通过优化算法可以精确估计相机的内参和畸变参数。
- 鲁棒性:对于图像质量、光照条件等变化具有较强的鲁棒性。
因此,张氏标定法被广泛应用于相机标定领域,成为计算机视觉和机器人导航等领域的重要技术。
具体步骤详述
a. 特征提取
- 使用OpenCV等计算机视觉库,可以检测出棋盘格的角点。
- 例如,使用OpenCV的
findChessboardCorners()
函数。
b. 构建映射关系
- 对于每一张标定图像,提取出的角点在世界坐标系中的位置是已知的。
- 使用相机内参和外参将这些点映射到图像坐标系。
c. 参数优化
- 使用优化算法(如OpenCV中的
calibrateCamera()
函数)来计算相机参数。 - 这个过程会最小化所有标定图像上的重投影误差。
d. 畸变校正
- 使用
undistort()
函数和计算出的内参、畸变参数来校正图像。
通过以上步骤,我们可以获得一个准确的相机模型,这个模型可以用于后续的视觉任务,如三维重建、机器人导航等。相机标定是一个精确且系统的过程,它要求在标定过程中尽可能减少误差,以确保标定结果的准确性。
为什么至少两张图才能测量内参?
相机内参的测量需要至少两张图的原因在于,单个视角的图像无法提供足够的信息来唯一确定相机的内参。以下是详细解释:
-
单一视角的局限性:单张图像只能提供一个视角下的信息,无法提供关于相机内参的完整信息。例如,无法确定焦距、主点位置等参数。
-
缺乏深度信息:单张图像无法提供深度信息,因为缺乏其他视角的比较。这使得无法准确判断图像中点的真实位置和大小。
-
几何约束不足:为了准确估计内参,需要多个视角下的图像点来建立几何约束。这些约束有助于确定相机内参,如焦距和主点位置。
-
重投影误差最小化:内参的估计通常涉及最小化重投影误差,即实际观测到的图像点与通过内参计算得到的理论图像点之间的差异。这需要多个视角下的图像点来提供足够的数据点。
-
非线性优化:内参的估计通常涉及非线性优化过程,这个过程需要多个数据点来稳定和收敛到全局最小值。
-
畸变参数估计:畸变参数的估计也需要多个视角,因为畸变会随着图像中的位置变化而变化。
因此,为了准确估计相机的内参,通常需要至少两张图像,从不同视角捕捉同一标定板。这些图像提供了多个视角下的信息,有助于建立几何约束,并最小化重投影误差,从而估计出相机的内参。
为什么一般建议拍很多张来进行标定?
在相机内参标定中,一般建议拍摄多张标定板图像,原因如下:
-
提高准确性:更多的图像意味着更多的数据点,这有助于提高内参估计的准确性。每个图像提供了独特的视角,有助于更好地约束内参的估计。
-
减少噪声影响:单张图像可能受到噪声、光照变化等因素的影响。通过拍摄多张图像,可以从多个视角观察标定板,从而平均这些随机误差,提高标定结果的稳定性。
-
增加覆盖范围:多张图像可以提供更全面的覆盖范围,包括标定板的不同部分和不同方向。这有助于捕捉相机的内参在不同条件下的表现。
-
改善优化过程:在最小化重投影误差的优化过程中,更多的数据点有助于算法更好地收敛到全局最优解,并减少陷入局部最优解的风险。
-
畸变估计:畸变参数的估计尤其需要多张图像,因为畸变会随着图像中的位置变化而变化。多张图像可以提供更多关于畸变的分布信息。
-
验证和交叉检验:多张图像可以用来验证和交叉检验标定结果。通过比较不同图像中的标定板点,可以确保内参估计的一致性和准确性。
-
鲁棒性:在实际应用中,相机可能会遇到各种不同的场景和光照条件。拍摄多张图像有助于提高标定结果的鲁棒性,使其在各种条件下都能保持准确性。
因此,为了获得更准确、更稳定的相机内参估计,通常建议拍摄多张标定板图像,最好涵盖不同的视角、位置和光照条件。这样可以确保标定结果在实际应用中的有效性和可
从棋盘格--》像素坐标,需要左乘相机外参和内参。
单应性(Homography)变换。可以简单的理解为它用来描述物体在世界坐标系和像素坐标系之间的位置映射关系。对应的变换矩阵称为单应性矩阵。
单应矩阵=相机内参*外参
假设两张图像中的对应点对齐次坐标为(x',y',1)和(x,y,1),单应矩阵H定义为:
由于单应矩阵H包含了||H||=1约束,因此根据线性方程组,8自由度的H我们至少需要4对对应的点才能计算出单应矩阵。 这也回答了前面图像校正中提到的为何至少需要4个点对的根本原因。
但是,以上只是理论推导,在真实的应用场景中,我们计算的点对中都会包含噪声。比如点的位置偏差几个像素,甚至出现特征点对误匹配的现象,如果只使用4个点对来计算单应矩阵,那会出现很大的误差。因此,为了使得计算更精确,一般都会使用远大于4个点对来计算单应矩阵。另外上述方程组采用直接线性解法通常很难得到最优解,所以实际使用中一般会用其他优化方法,如奇异值分解、Levenberg-Marquarat(LM)算法等进行求解。
因为棋盘标定图纸中所有角点的空间坐标是已知的,这些角点对应在拍摄的标定图片中的角点的像素坐标也是已知的,如果我们得到这样的N>=4个匹配点对(越多计算结果越鲁棒),就可以根据LM等优化方法得到其单应矩阵H。
本质上:已经知道多组2D-3D对应点的关系,计算单应矩阵H解从而获取相机内参K,通过最小化重投影误差来获取相机最佳内参。当最后迭代出一个内参K后,不同的2D-3D对应点的重投影误差是不一样的,去掉大的,保留小的,然后继续拍照,重复循环。
参考:
张正友标定法-完整学习笔记-从原理到实战 - 知乎 (zhihu.com)
相关文章:
相机标定学习记录
相机标定是计算机视觉和机器视觉领域中的一项基本技术,它的主要目的是通过获取相机的内部参数(内参)和外部参数(外参),以及镜头畸变参数,建立起现实世界中的点与相机成像平面上对应像素点之间准…...
CSS 滚动条样式修改
1、滚动条整体部分 使用 ::-webkit-scrollbar 注意:这个必须要加,不然修改的样式不生效 ::-webkit-scrollbar {width: 10px;//修改滚动条宽度 }2、滚动条中的滑块 使用 ::-webkit-scrollbar-thumb ::-webkit-scrollbar-thumb {border-radius: 8px;b…...
谈谈配置中心?
配置中心可以做集中式的服务配置管理,比如配置一些数据库连接的URL,一些共用的配置且可动态调整的参数。如果不采用集中式的管理,会导致修改起来特别麻烦,一个个的修改特别繁琐。 Nacos Config配置中心中采用的是客户端拉取数据&a…...
人工智能(pytorch)搭建模型25-基于pytorch搭建FPN特征金字塔网络的应用场景,模型结构介绍
大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型25-基于pytorch搭建FPN特征金字塔网络的应用场景,模型结构介绍。特征金字塔网络(FPN)是一种深度学习模型结构,主要应用于目标检测任务中&am…...
JRT业务开发起步
这是一段充满挑战与奋斗的旅程,自第一行Java代码的写下起,便历经重重险阻。从细微的代码行,逐步汇聚成实用的工具类方法;从工具类方法的积累,逐渐构建起功能强大的工具包;再从工具包的整合,最终…...
深度解析:国内主流音视频产品的核心功能与市场表现
前言 当前音视频开发领域呈现出多样化竞争态势,其中声网(Agora)、即构(ZEGO)等云通讯企业占据了市场的主导地位。随着技术的持续进步和用户需求的日益多样化,选择音视频服务提供商的标准也越来越个性化&am…...
红黑树介绍及插入操作的实现
🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…...
[linux初阶][vim-gcc-gdb] TwoCharter: gcc编译器
目录 一.Linux中gcc编译器的下载与安装 二.使用gcc编译器来翻译 C语言程序 ①.编写C语言代码 ②翻译C语言代码 a.预处理 b.编译 c.汇编 d.链接 ③.执行Main 二进制可执行程序(.exe文件) 三.总结 一.Linux中gcc编译器的下载与安装 使用yum命令(相当于手机上的应用…...
单例设计模式(2)
单例设计模式(2) 单例模式存在的问题 单例对 OOP 特性的支持不友好 oop的特性:封装、继承、多态、抽象;以Id生成器代码为例,如果未来某一天,我们希望针对不同的业务采用不同的 ID 生成算法。比如&#x…...
boost::asio 启用 io_uring(Linux 5.10)队列支持
欲启用 boost::asio 对于 io_uring 的支持,这需要以下几个先决条件; 1、boost 1.78 及以上发行版本 Revision History - 1.78.0 (boost.org) 2、Linux kernel 5.10 及以上发行版本 3、在预定义头文件(stdafx.h)、或编译器预定义…...
Android 自定义坐标曲线图(二)
Android 自定义坐标曲线图_android 自定义曲线图-CSDN博客 继上一篇文章,点击折线图上的点,显示提示信息进行修改,之前通过回调,调用外部方法,使用popupwindow或dialog来显示,但是这种方法对于弹框显示的位…...
每日OJ题_子序列dp⑧_力扣446. 等差数列划分 II - 子序列
目录 力扣446. 等差数列划分 II - 子序列 解析代码 力扣446. 等差数列划分 II - 子序列 446. 等差数列划分 II - 子序列 难度 困难 给你一个整数数组 nums ,返回 nums 中所有 等差子序列 的数目。 如果一个序列中 至少有三个元素 ,并且任意两个相邻…...
GOPROXY 代理设置
通常报错: 1.http: server gave HTTP response to HTTPS client 2.timeout 解决指令:(会话临时性),长久的可以在配置文件中配置 go env -w GOPROXYhttps://goproxy.cn,direct 长久的,在~/.bashrc文件中添加: expo…...
Redis面经
Redis面经 Redis缓存穿透、缓存击穿和缓存雪崩及解决方案概述缓存穿透详解及解决方案缓存击穿详解及解决方案缓存雪崩详解及解决方案 Redis持久化机制什么是数据持久化?Redis数据持久化概述RDB持久化的优缺点AOF持久化混合持久化 Redis缓存穿透、缓存击穿和缓存雪崩…...
【c++】类和对象(六)深入了解隐式类型转换
🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章我们来到初始化列表,隐式类型转换以及explicit的内容 目录 1.初始化列表1.1构造函数体赋值1.2初始化列表1.2.1隐式类型转换与复制初始化 1.3e…...
什么是nginx正向代理和反向代理?
什么是代理? 代理(Proxy), 简单理解就是自己做不了的事情或实现不了的功能,委托别人去做。 什么是正向代理? 在nginx中,正向代理指委托者是客户端,即被代理的对象是客户端 在这幅图中,由于左边内网中…...
【Go】面向萌新的Gin框架知识梳理学习笔记
目录 Gin框架简介 路由&路由组 1. 定义基本路由 2. 参数传递 3. 查询字符串参数 4. 路由组 5. 路由中间件 模板渲染 1. 加载模板 2. 定义模板 3. 渲染模板 4. 自定义模板函数 返回json 1. 导入 Gin 包 2. 创建 Gin 引擎 3. 定义路由和处理器函数 4. 运行服…...
baseDao增删改查.
这里写目录标题 1、baseDao增删改查介绍2、basDao类3、BasDao类的作用 1、baseDao增删改查介绍 (1)、增加Create)操作: 通过BaseDao的insert方法可以向数据库中插入一条新的记录。 该方法接受一个实体对象作参数,将该对象的属性映射到表的字…...
什么是面向对象【大白话Java面试题】
什么是面向对象 同样是解决一个问题,面向对象的角度是将问题抽象成对象的形式。通过分类的思维方式,将问题分成几个解决方案的对象。给每个对象赋值属性和方法,对每个对象的细节进行面向过程的思维,执行自己的方法来解决问题。 …...
PyTorch 教程-快速上手指南
文章目录 PyTorch Quickstart1.处理数据2.创建模型3.优化模型参数4.保存模型5.加载模型 PyTorch 基础入门1.Tensors1.1初始化张量1.2张量的属性1.3张量运算1.3.1张量的索引和切片1.3.2张量的连接1.3.3算术运算1.3.4单元素张量转变为Python数值 1.4Tensor与NumPy的桥接1.4.1Tens…...
【有芯职说】数字芯片BES工程师
一、 数字芯片BES工程师简介 今天来聊聊数字芯片BES工程师,其中BES是Back End Support的缩写,就是后端支持的意思。其实这个岗位是数字IC前端设计和数字IC后端设计之间的一座桥,完成从寄存器传输级设计到具体工艺的mapping和实现。这个岗位在…...
暴力破解pdf文档密码
首先安装pdfcrack工具包 apt install pdfcrack 默认密码字典存储在/usr/share/wordlists里,是gz文件,将它解压并copy到pdf目录 然后使用pdfcrack破解 密码在最后一行user-password的单引号里...
蓝桥杯刷题第四天
思路: 这道题很容易即可发现就是简单的暴力即可完成题目,我们只需满足所有数的和为偶数即可保证有满足条件的分法,同时也不需要存下每个输入的数据,只需要知道他是偶数还是奇数即可,因为我们只需要偶数个奇数搭配在一块…...
03-数据库的用户管理
一、创建新用户 mysql> create user xjzw10.0.0.% identified by 1; Query OK, 0 rows affected (0.01 sec) 二、查看当前数据库正在登录的用户 mysql> select user(); ---------------- | user() | ---------------- | rootlocalhost | ---------------- 1 row …...
每日一题 --- 三数之和[力扣][Go]
三数之和 题目:15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 **注意&#x…...
vue render 函数详解 (配参数详解)
vue render 函数详解 (配参数详解) 在 Vue 3 中,render 函数被用来代替 Vue 2 中的模板语法。 它接收一个 h 函数(或者是 createElement 函数的别名),并且返回一个虚拟 DOM。 render 函数的语法结构如下: render(h) …...
ubuntu23.10配置RUST开发环境
系统版本: gcc版本 下载rustup安装脚本: curl --proto =https --tlsv1.2 https://sh.rustup.rs -sSf | sh下载完成后会自动执行 选择默认安装选项 添加cargo安装目录到环境变量 vim ~/.bashrc<...
Vue性能优化--gZip
一、gZip简单介绍 1.1 什么是gzip gzip是GNUzip的缩写,最早用于UNIX系统的文件压缩。HTTP协议上的gzip编码是一种用来改进web应用程序性能的技术,web服务器和客户端(浏览器)必须共同支持gzip。目前主流的浏览器,Chro…...
蓝桥杯第七届大学B组详解
目录 1.煤球数量; 2.生日蜡烛; 3.凑算式 4.方格填数 5.四平方和 6.交换瓶子 7.最大比例 1.煤球数量 题目解析:可以根据题目的意思,找到规律。 1 *- 1个 2 *** 3个 3 ****** 6个 4 ********** 10个 不难发现 第…...
荣誉 | 人大金仓连续三年入选“金融信创优秀解决方案”
3月28日,由中国人民银行领导,中国金融电子化集团有限公司牵头组建的金融信创生态实验室发布“第三期金融信创优秀解决方案”,人大金仓新一代手机银行系统解决方案成功入选,这也是人大金仓金融行业解决方案连续第三年获得用户认可。…...
非法集资罪提供网站建设/线上推广方式都有哪些
数据结构和算法到底有什么用? 数据结构是对在计算机内存中(有时在磁盘中)的数据的一种安排。数据结构包括数组、链表、栈、二叉树、哈希表等等。算法对这些结构中的数据进行各种处理。例如,查找一条特殊的数据项或对数据进行排序…...
自己怎么制作网址/seo点击排名软件哪里好
现在做一项手机评测,不跑个测试软件总是显得不科学。也有很多爱好者拿测试软件的跑分来作为手机性能的唯一依据。实际上,智能手机测试软件是个出现相当晚的东西,而智能手机测试软件因为各种原因,往往会存在一些问题。测出来的分数…...
宣传册样式/无锡网站建设方案优化
LaTex说起LaTex,又会扯出Tex、MikTeX、CJK等一系列东西。这并不是我们关注的重点,然而如果你有时间,可以当个睡前故事看看这篇文章。我们只需要知道:LaTex有一套自成体系的语法,常用于科研生产、试卷等文档排版。支持复杂公式&…...
免费做数据采集的网站/最新新闻
经常回今天说一下substring()方法的特性以及应用。substring() 方法用于提取字符串中介于两个指定下标之间的字符,所以它有两个参数,一个是起始的位置,一个是结束的位置,通俗点说就是针对一段字符串的每个字符的位置截取开始到结束…...
企业网站的推广方法/站内优化主要从哪些方面进行
如下图所示,我在任何时候按F1键,都会自动弹出Windows帮助和支持,事实上这个功能很鸡肋,从来没用过,但是玩魔兽的时候确实必须的,F1控制英雄的,呵呵。 方法还是有的,在任务管理器中找…...
学做缝纫的网站/网络舆情分析研判报告
install JDKInstall hadoopRun Project on Hadoop install JDK 需要提前安装好jdk和ant。 jdk是对java程序进行编译的工具(java development kid) jre:java runtime environment是提供java虚拟机的运行环境。 ant:项目管理工具…...