单应性矩阵在标定中的应用

news2024/11/25 3:46:17

1.单应性矩阵是什么?

言简意赅定义:定义在两个不同视角中对同一平面范围内的特征点的射影变换(projective transformation)即:

x1 = H*x2 //x1、x2为匹配点

上图中x,x‘为一对匹配点,通过单应矩阵H实现在各自图像坐标系下的坐标转化。

H矩阵(单应性矩阵)大小为3×3:

因为H矩阵因尺度一致性,减少一个自由度,故H矩阵的自由度为8(有疑问可网上搜索一下),因此我们有两种处理方法:

1.可以将 h33 设置成1

2.||H|| = 1,即:

2.单应矩阵求解原理

故在两视角所有匹配点对都满足:

进而变换为:

 进而转化为:

进而转化为:

假如我们得到了两幅图片中对应的N个点对(特征点匹配对),那么可以得到如下线性方程组:

写成矩阵形式:

由于单应矩阵H包含了||H||=1约束,因此根据上图的线性方程组,8自由度的H我们至少需要4对对应的点才能计算出单应矩阵。但是,以上只是理论推导,在真实的应用场景中,我们计算的点对中都会包含噪声。比如点的位置偏差几个像素,甚至出现特征点对误匹配的现象,如果只使用4个点对来计算单应矩阵,那会出现很大的误差。因此,为了使得计算更精确,一般都会使用远大于4个点对来计算单应矩阵。另外上述方程组采用直接线性解法通常很难得到最优解,所以实际使用中一般会用其他优化方法,如RANSAC算法、奇异值分解、Levenberg-Marquarat(LM)算法(后续文章会介绍)等进行求解。

3.单应矩阵用于摄像机标定

我们标定其实就是从单应矩阵H中恢复出内外参数矩阵,怎么理解标定里面H?因为我们常常把标定的棋盘格图像放在平面上,并设定Z=0,故棋盘格自身是一平面xy坐标系,而最后我们摄像机的像素坐标系也可看作一个xy坐标系,那么这就符合单应矩阵的使用情景可用于求解两坐标系中匹配点对的映射变换关系。详见从零开始学习「张氏相机标定法」(一)

其中,u、v表示像素坐标系中的坐标,s表示尺度因子(等于1/zw),fx、fy、u0、v0、γ(由于制造误差产生的两个坐标轴偏斜参数,通常很小)表示5个相机内参,R(对应列向量r1、r2、r3),t表示相机外参,Xw、Yw、Zw(=0)(假设标定棋盘位于世界坐标系中Zw=0的平面)表示世界坐标系中的坐标。故我们这里把内外参合并看作H。

关于r3没写出是因为:(详见从零开始学习「张氏相机标定法」(一))

流程:

1、打印一张棋盘格标定图纸,将其贴在平面物体的表面。

2、拍摄一组不同方向棋盘格的图片,可以通过移动相机来实现,也可以移动标定图片来实现。

3、对于每张拍摄的棋盘图片,检测图片中所有棋盘格的特征点(角点,也就是下图中黑白棋盘交叉点,中间品红色的圆圈内就是一个角点)。我们定义打印的棋盘图纸位于世界坐标系Zw=0的平面上,世界坐标系的原点位于棋盘图纸的固定一角(比如下图中黄色点),像素坐标系原点位于图片左上角。

4、因为棋盘标定图纸中所有角点的空间坐标是已知的,这些角点对应在拍摄的标定图片中的角点的像素坐标也是已知的,如果我们得到这样的N>=4个匹配点对(越多计算结果越鲁棒),就可以根据LM等优化方法得到其单应矩阵H。当然计算单应矩阵一般不需要自己写函数实现,OpenCV中就有现成的函数可以调用。现在也有专门用于传感器标定的工具箱Kalibr(github链接),精度要好于OpenCV。

4.单应矩阵求解数学推导

我们知道H是内参矩阵和外参矩阵的乘积,而我们想要最终分别获得内参和外参。所以需要想个办法,先把内参求出来(先求内参是因为更容易),得到内参后,外参也就随之解出了。

我们先不考虑镜头畸变(正规的标定是包含镜头畸变的),来看看如何求解内参和外参。求解思路是利用旋转向量的约束关系,以下是具体推导,建议自己演算一遍,加深理解。

为了利用旋转向量之间的约束关系,我们先将单应性矩阵H化为3个列向量,即H=[h1 h2 h3],则有:

进而转换为:

因为旋转向量在构造中是相互正交的,即r1和r2相互正交,由此我们就可以利用“正交”的两个含义,得出每个单应矩阵提供的两个约束条件:

约束条件1:旋转向量点积为0(两垂直平面上的旋转向量互相垂直),即:

约束条件2:旋转向量长度相等(旋转不改变尺度),即:

所以一个单应性矩阵H可以提供上述两个约束条件。那么如何利用上述两个约束条件求解内参或者外参呢?我们一步一步来看,由前面可知内参矩阵M:

利用M定义B:

我们看到B为对称矩阵,真正有用的元素只有6个(主对角线任意一侧的6个元素)。把B带入前面两个约束条件后可转化为:

上面两约束中的式子均可写为通式:

的形式,定义3X3的单应矩阵H=[h1 h2 h3]的第i列列向量:

将如下表达式代入上述的约束单项式:

其中,令:

则:

由此,两约束条件最终可以转化为如下形式:

假设我们已经根据前面计算得到了矩阵B元素的值,那么根据已知的矩阵B很容易解出内参,如下:

得到内参数后,内参矩阵M也已知。单应矩阵H也已知,因此可继续求得外参数:

其中又由旋转矩阵性质有:

则:

实际情况下,数据中是存在噪音的,所以计算得到的旋转矩阵R并不一定能满足旋转矩阵的性质。所以通常根据奇异值分解来得到旋转矩阵R。

上述的推导结果是基于理想情况下的解,从理论上证明了张氏标定算法的可行性。但在实际标定过程中,一般使用非线性优化求解。假设我们拍摄了n张标定图片,每张图片里有m个棋盘格角点。三维空间点X在图片上对应的二维像素为x,三维空间点经过相机内参M,外参R,t变换后得到的二维像素为x',假设噪声是独立同分布的,求解上述非线性优化问题得到最小化x, x'的位置来:

现在我们来考虑透镜畸变的影响,由于径向畸变的影响相对较明显,所以主要考虑径向畸变参数,根据经验,通常只考虑径向畸变的前两个参数k1,k2就可以(增加更多的参数会使得模型变的复杂且不稳定)。实际求解中,通常把k1,k2也作为参数加入上述函数一起进行优化,待优化函数如下所示:

上述非线性优化问题通常用Levenberg-Marquardt(LM)算法进行迭代求解。一般将k1,k2初值设为0。

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

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

相关文章

Pytest自动化框架运行全局配置文件pytest.ini

前言 还记得在之前的篇章中有讲到Pytest是目前主要流行的自动化框架之一,他有基础的脚本编码规则以及两种运行方式。 pytest的基础编码规则是可以进行修改,这就是今日文章重点。 看到这大家心中是否提出了两个问题:pytest的基础编码规则在…

Array_JavaScript

Array 学习路线:JavaScript基础语法(输出语句)->JavaScript基础语法(变量)->JavaScript基础语法(数据类型)->JavaScript基础语法(运算符)->JavaScript基础语…

python数据容器——列表

目录 一.数据容器 二.数据容器——列表 基本语法 注意 三.列表的下标(索引) 嵌套列表的下标(索引) 四.列表的常用操作(方法) 1.查询元素下标 2.插入元素 3.删除元素 4.统计元素 说明 一.数据容器 1&a…

使用react-sizeme解决react-grid-layout中侧栏(抽屉)展开或隐藏时不会自适应容器大小的问题

文章目录使用react-sizeme解决react-grid-layout中侧栏(抽屉)展开或隐藏时不会自适应容器大小的问题前提概要问题代码解决代码参考使用react-sizeme解决react-grid-layout中侧栏(抽屉)展开或隐藏时不会自适应容器大小的问题 前提概要 在上一篇博文中,我们讲到了使…

postgres源码解析38 表创建执行全流程梳理--2

本小节主要讲解查询执行模块,有机地调用存储、索引、事务、并发等模块,按照执行计划中的计划节点(操作执行接口)完成数据的读取或者修改。知识回顾:postgres源码解析37 表创建执行全流程梳理–1 关键数据结构 总图&a…

八、【React-Router5】路由组件传参

文章目录1、实现效果2、向路由组件传递参数总览3、修改上一节代码3.1、项目结构变更如下3.2、CODE(params传参)3.2.1、Messages.jsx3.2.2、Detail.jsx3.2.3、Result3.3、CODE(search传参)3.3.1、Messages.jsx3.3.2、Detail.jsx3.3…

【强化学习论文】小样本策略泛化的提示决策转换器

文献题目:Prompting Decision Transformer for Few-Shot Policy Generalization 摘要 人类可以利用先前的经验并从少量演示中学习新任务。与旨在通过更好的算法设计实现快速适应的离线元强化学习相比,我们研究了架构归纳偏差对少样本学习能力的影响。我…

RationalDMIS2022车削件(轴类)测量:回转体检测

1.坐标系知识 在三坐标测量机的使用中,坐标系的建立是最为关键的一步,是工件测量的基本依据。设备在组装本身中有着XYZ三个互相垂直的坐标轴,因此坐标系的建立便是通过以工件上的特征作为依据建立XYZ三个互相垂直的坐标轴与设备的坐标轴进行对应,从而使程序得以运行。 物…

虚拟机安装

虚拟机安装 能看到这里说明你的电脑中已经安装的有虚拟机了,如果没有虚拟机可以先下载安装一些虚拟机。 有了虚拟机后首先要准备的就是镜像,我用的是CentOS-7。如果没有的也可以百度或者去阿里云下载即可。 选择下载以ISO结尾的文件,可选类型…

SLAM学习笔记(二)

5.相机与图像 相机将三维世界中的坐标点(单位米)映射到二维图像平面(单位为像素)的过程中能够用一个几何模型进行描述。 单目相机(Mono)的成像过程: 1、世界坐标系下有个固定的点P,世界坐标为 2、由于相…

关于quartus 13.1出现的问题的一些总结

1,如果IP核的版本与当前的quartus ii版本不一致的情况,有时候虽然能编译成功,但是无法修改原有工程的IP核参数设置。 如: 之前我下载的工程用到的NCO IP核是12.1 version的,但是我用到的quartus 版本是13.0和13.1&am…

led灯什么牌子的质量好?2022双十二家用护眼台灯推荐

台灯作为一种晚上或者其他黑暗条件下的照明灯具,对于经常熬夜的人群来说可以说是必备工具了,无论是看书、写字,还是工作、学习,都非常实用,它不同于平常的家用的室内照明顶灯,光线不会那么刺眼,…

uni-app入门:小程序UI组件Vant Weapp

1.vant介绍 2.安装步骤 2.1 通过 npm 安装 2.2 修改 app.json 2.3 修改 project.config.json 2.4 构建 npm 包 3.使用说明 1.vant介绍Vant Weapp 是一个轻量、可靠的移动端组件库,于 2017 年开源,是由有赞前端团队开…

Mysql 安装与卸载

MySQL8.0.26-Linux版安装 文章目录MySQL8.0.26-Linux版安装1. 安装1.1 准备一台Linux服务器1.2. 下载Linux版MySQL安装包1.3. 上传MySQL安装包1.4. 创建目录,并解压1.5. 安装mysql的安装包1.6. 启动MySQL服务1.7. 查询自动生成的root用户密码1.8. 修改root用户密码1.9. 创建用户…

【FRP】群晖docker中部署Frp

2022-08-24 by 崔斐然 0:需求 公司有台笔记本,现在疫情期间居家办公。我用的MacBook RDP客户端做的非常好用,如相互粘贴文件、文字等,MacBook通过远程桌面连接公司内网电脑会比较方便,时延和体验感远优于向日葵。之前…

java成神之路-基础篇 (搞定java基础看这一篇就够用)

java成神之路-基础篇 文章目录java成神之路-基础篇[toc]01面向对象**→ 什么是面向对象**→ 平台无关性→ 值传递1、什么是[值传递](https://so.csdn.net/so/search?q值传递&spm1001.2101.3001.7020),什么是引用传递?2.值传递和[引用传递](https://…

23软考备考已开始,网络工程师知识点速记~

新一轮软考备考来啦~ 为了帮助大家提高备考效率,将2023上半年软考网络工程师知识点速记分享给大家,快来跟着一起打卡学习吧! 进制的转换 数据的表示方法有二进制、八进制、十进制和十六进制等。网络工程师考试要求重点掌握这四种进制之间的…

mysql基础知识篇(六)

1.如何分库? 垂直分库:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。 水平分库:以字段为依据,按照一定策略(hash、range 等),将一个库中的数据拆分到多个库…

线代 | 【提神醒脑】自用笔记串联三 —— 相似对角化 · 二次型 · 合同变换

本文总结参考于 kira 2023 线代提神醒脑技巧班。 笔记均为自用整理。加油!ヾ(◍∇◍)ノ゙ 九、相似对角化 9.1、矩阵相似的性质 ----------------------------------------------------------------------------------------------------------…

Linux 网络编程项目 —— FTP 网盘

文章目录项目简介知识点描述项目功能指令远程功能指令本地功能指令使用的关键函数access 函数popen 函数chdir 函数strtok 函数strncmp 函数linux system函数是否执行成功判断方法基本流程服务端客户端FTP代码实例头文件 ftp.h客户端 client.c服务端 server.cV2.0版 – 启用副服…