计算机视觉基础(9)——相机标定与对极几何

前言

本节我们将学习相机标定对极几何两部分的内容。

在相机标定部分,我们将学习直接线性变换(Direct Linear Transform, DL,张正友标定法(Zhang’s Method)和 Perspective-n-Point (PnP) 这三种方法。

在对极几何部分,我们将了解极平面、基线、极点和极线等概念,以及相机相对位姿估计和对极约束。

一、相机标定

1.1  相机内外参

内参:描述相机本身的属性,同一相机,内参固定

外参:描述相机的姿态、位置,随时间变化

让我们来回顾一下相机的成像过程

1.2  相机标定概述

通过实验的方法计算和估计相机内外参数的过程称为相机标定(Camera Calibration)

相机标定的应用有:

• 矫正透镜畸变(内参标定)

• 建立相机成像几何模型,实现三维重构

相机标定的意义:

相机标定是非常关键的环节,标定结果的精度直接影响相机工作产生结果的准确性

做好相机标定是做好后续工作的前提

下面讲解三种相机标定的常见方法:

直接线性变换 (Direct Linear Transform, DLT)——同时估计内外参

张正友标定法 (Zhang’s Method)——估计内参

Perspective-n-Point (PnP)——估计外参

1.3  直接线性变换(DLT)

1.3.1  基本设定

已知:部分参考点在图像坐标系和世界坐标系下的坐标

• 求解:相机的内参矩阵𝑲、外参𝑹与𝒕

1.3.2  世界坐标系到图像坐标系的映射

1.3.3  关于矩阵M自由度的解释

1.3.4  DLT算法的基本思路和流程

1.3.5  小结

DLT方法通过计算未标定数据 (Uncalibrated Camera)的映射参数矩阵𝑀,来计算相机内外参

需要已知至少6个观测点的世界坐标和图像坐标

当已知观测点近似落在同一平面时,DLT求解不稳定

1.4  张正友标定法

【参考文献】

Zhang, A flexible new technique for camera calibration, IEEE TPAMI, 2000

1.4.1  标定工具:标定板

相机标定往往需要观测点在世界坐标系中的坐标,但是世界坐标不易测量

因此,引入二维标定板

由规则的黑白棋盘格构成,尺寸已知

网格点可以被角点检测算法自动、准确检测出

在标定板上建立世界坐标系,标定板位于Z=0平面,网格点作为观测点

二维标定板的优势如下:

  1. 观测点世界坐标易得
  2. Z=0降低了求解复杂度

1.4.2  从世界坐标系到图像坐标系的映射

• 用于描述两个平面之间的映射关系

• 共有3 × 3 = 9个元素,但由于齐次性,自由度为8

1.4.3  求解内参矩阵

1.4.4  张氏标定法基本思路和流程 

  1. 在标定板上建立世界坐标系,并以不同的位姿对其拍摄3张以上图像(可以晃动标定板或改变相机姿态)
  2. 利用角点检测算法对每张图中标定板上的网格点进行检测,每张图选取4个以上网格点作为标定点,并读取标定点的图像坐标和世界坐标
  3. 利用3张图像的观测点列出3个方程组,通过SVD分解计算3个单映矩阵 𝑯
  4. 利用三个单映矩阵 𝑯 列出6个关于矩阵 𝑩 的方程,并利用SVD分解求出 𝑩 
  5. 由于 𝑩 = 𝑲−⊺𝑲−𝟏 ,对求出的 𝑩 进行cholesky 矩阵分解:𝑩 = 𝑨𝑨⊺→𝑲 = 𝑨 −⊺

1.5  PnP

1.5.1  基本设定

已知:至少3个参考点在图像坐标系和世界坐标系下的坐标,相机的内参矩阵𝑲

求解:外参𝑹𝒕,即估计相机在世界坐标系下的位置

1.5.2  基本思路

二、对极几何

2.1  对极几何(Epipolar Geometry)简介

以上三种相机标定方法均需图像中观测点的世界坐标

相比于世界坐标,观测点的图像坐标更容易获取

给定同一场景的两张图像,能否仅根据对应点的图像坐标估计相机的相对姿态?

利用对极几何约束

2.2  对极几何的基本设定

𝑰𝟏, 𝑰𝟐是同一场景拍摄的两张图像,𝑶𝟏, 𝑶𝟐是拍摄时的相机中心

相机的相对运动/姿态为 𝑹, 𝒕

换言之,以相机𝑶𝟏的相机坐标系为世界坐标系,相机𝑶𝟐的外参是𝑹, 𝒕

空间中的点𝑷在两图中投影为𝒑𝟏, 𝒑𝟐

平面 𝑶𝟏𝑶𝟐𝑷 称为极平面 (Epipolar Plane),  𝑶𝟏𝑶𝟐 称为基线(Baseline),基线与 𝑰𝟏,𝑰𝟐 的交点 𝒆𝟏, 𝒆𝟐 称为极点 (Epipole),极平面与两张图像的交线 (𝒑𝟏𝒆𝟏, 𝒑𝟐𝒆𝟐称为极线 (Epipolar Line)

2.3  极线的物理意义

  1. 在仅已知投影点𝒑𝟏坐标的情况下,无法获得3D𝑷的具体未知,只能推断出点𝑷在投影射线𝑶𝟏𝒑𝟏
  2. 直线𝑶𝟏𝒑𝟏在图像𝑰𝟐上的投影就是极线𝒑𝟐𝒆𝟐
  3. 所以空间中投影在图像𝑰𝟏𝒑𝟏位置上的点在图像𝑰𝟐上对应点位于直线𝒑𝟐𝒆𝟐
  4. 换言之,图像𝑰𝟏上的一个点𝒑𝟏与图像𝑰𝟐上的一条直线𝒑𝟐𝒆𝟐对应

2.4  极线的解析式

【对极约束】

2.5  相机相对位姿估计与对极约束

  • 给定两张图8个以上对应点,可以通过8点法求解线性齐次系统求出基础矩阵,然后如果相机已经进行标定(即𝑲 已知)可以求出本质矩阵,并进一步求出两个相机的相对位姿𝑹𝒕
  • 由于本质矩阵的齐次性,无法只通过对应点估计出相对位姿𝑅𝑡的绝对尺度
  • 如果已知两个相机的相对位姿𝑹𝒕,可以求出基础矩阵𝑭,进而获得极线𝒑𝟐𝒆𝟐的位置。𝒑𝟏点在图像𝑰𝟐上的对应点搜索空间可以从整幅图像缩小到极线上

总结

本节我们学习了相机标定和对极几何的基本概念。重点需要掌握直接线性变换和张正友标定法的基本流程,知道这两种方法需要几个观测点和几张图像能完成标定。还需要知道对极几何中极平面、基线、极点和极线的基本概念并在图中对应。最后需要掌握极线解析式的推导过程,知道两个约束关系以及其代表的物理含义,知道相机的相对位姿估计。

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

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

相关文章

SpringJDBC模板类JdbcTemplate

Spring JdbcTemplate使用JdbcTemplate完成增删改查环境准备新增修改删除查询一个对象批量添加批量修改和批量删除使用德鲁伊连接池(之前数据源是用我们自己写的) JdbcTemplate JdbcTemplate是Spring提供的一个JDBC模板类,是对JDBC的封装&…

某60区块链安全之51%攻击实战学习记录

区块链安全 文章目录 区块链安全51%攻击实战实验目的实验环境实验工具实验原理攻击过程 51%攻击实战 实验目的 1.理解并掌握区块链基本概念及区块链原理 2.理解区块链分又问题 3.理解掌握区块链51%算力攻击原理与利用 4.找到题目漏洞进行分析并形成利用 实验环境 1.Ubuntu1…

2023数维杯国际赛数学建模竞赛选题建议及B题思路讲解

大家好呀,2023年第九届数维杯国际大学生数学建模挑战赛今天早上开赛啦,在这里先带来初步的选题建议及思路。 目前团队正在写B题和D题完整论文,后续还会持续更新哈,大家三连关注一下防止迷路。 注意,本文只是比较简略…

企业微信获取第三方应用凭证

上一篇介绍了如何配置通用开发参数及通过url回调验证, 本篇将通过服务商后台配置关联小程序应用配置和获取第三方凭证及如何配置企业可信IP。 当然上篇配置的回调设置也不会白费,在下方的指令和数据回调会用到。 第三方应用开发流程 官方企业微信第三方…

Beego之Bee工具使用

1、bee工具使用 bee 工具是一个为了协助快速开发 Beego 项目而创建的项目,通过 bee 你可以很容易的进行 Beego 项目的创 建、热编译、开发、测试、和部署。Bee工具可以使用的命令: [rootzsx ~]# bee 2023/02/18 18:17:26.196 [D] init global config…

van-dialog弹窗异步关闭-校验表单

van-dialog弹窗异步关闭 有时候我们需要通过弹窗去处理表单数据,在原生微信小程序配合vant组件中有多种方式实现,其中UI美观度最高的就是通过van-dialog嵌套表单实现。 通常表单涉及到是否必填,在van-dialog的确认事件中直接return是无法阻止…

软件测试面试-如何定位线上出现bug

其实无论是线上还是在测试出现bug,我们核心的还是要定位出bug出现的原因。 定位出bug的步骤: 1,如果是必现的bug,尽可能的复现出问题,找出引发问题的操作步骤。很多时候,一个bug的产生,很多时…

Java基础笔记

1.数据类型在java语言中包括两种: 第一种:基本数据类型 基本数据类型又可以划分为4大类8小种: 第一类:整数型 byte , short,int, long(没有小数的) 第二类:浮点型 float,aouble(带有小数的) 第三类:布尔型 boole…

计算机毕业设计 基于Vue的米家商城系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

React经典初级错误

文章 前言错误场景问题分析解决方案后言 前言 ✨✨ 他们是天生勇敢的开发者,我们创造bug,传播bug,毫不留情地消灭bug,在这个过程中我们创造了很多bug以供娱乐。 前端bug这里是博主总结的一些前端的bug以及解决方案,感兴…

FastAdmin表格顶部增加toolbar按钮

效果入下图&#xff0c;在表格顶部增加一个自定义按钮&#xff0c;点击确认后请求服务器接口 表格对应的index.html中 <div class"panel-body"><div id"myTabContent" class"tab-content"><div class"tab-pane fade active …

【开源】基于JAVA的服装店库存管理系统

项目编号&#xff1a; S 052 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S052&#xff0c;文末获取源码。} 项目编号&#xff1a;S052&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服…

Go 语言变量类型和声明详解

在Go中&#xff0c;有不同的变量类型&#xff0c;例如&#xff1a; int 存储整数&#xff08;整数&#xff09;&#xff0c;例如123或-123float32 存储浮点数字&#xff0c;带小数&#xff0c;例如19.99或-19.99string - 存储文本&#xff0c;例如“ Hello World”。字符串值用…

微服务学习 | Ribbon负载均衡、Nacos注册中心、微服务技术对比

Ribbon负载均衡 负载均衡流程 负载均衡策略 通过定义IRule实现可以修改负载均衡规则&#xff0c;有两种方式&#xff1a; 1. 代码方式:在服务消费者order-service中的OrderApplication类中&#xff0c;定义一个新的IRule: 2.配置文件方式: 在order-service的application.yml…

【C++学习手札】模拟实现vector

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;くちなしの言葉—みゆな 0:37━━━━━━️&#x1f49f;──────── 5:28 &#x1f504; ◀️ ⏸ ▶️ ☰…

Verilog基础:三段式状态机与输出寄存

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html 对于Verilog HDL而言&#xff0c;有限状态机(FSM)是一种重要而强大的模块&#xff0c;常见的有限状态机书写方式可以分为一段式&#xff0c;二段式和三段式&#xff0c;笔者强烈建议使用三…

进程信号(linux)

什么是信号 信号是一种用于进程之间通信或操作的一种手段&#xff0c;通常一个进程会在任意时刻接收到系统发送的信号&#xff0c;因此信号也可以看做是一种进程事件异步通知的手段。 一个进程可以对信号有三种操作&#xff1a; 默认操作&#xff1a;默认进行信号对应的操作…

【Python】【应用】Python应用之一行命令搭建HTTP、FTP服务器

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;Python应用&…

python爬虫 之 JavaScript 简单基础

文章目录 在网页使用JavaScript 代码的方式常用的JavaScript 事件常用的JavaScript 对象 在网页使用JavaScript 代码的方式 在网页中使用 JavaScript 代码的方式主要有三种&#xff1a; 内联方式&#xff08;Inline&#xff09;&#xff1a; 在 HTML 文件中直接嵌入 JavaScrip…

简单的 UDP 网络程序

文章目录&#xff1a; 简单的UDP网络程序服务端创建套接字服务端绑定启动服务器udp客户端本地测试INADDR_ANY 地址转换函数关于 inet_ntoa 简单的UDP网络程序 服务端创建套接字 我们将服务端封装为一个类&#xff0c;当定义一个服务器对象之后&#xff0c;需要立即进行初始化…