计算机视觉之三维重建(2)---摄像机标定

文章目录

  • 一、回顾线代
    • 1.1 线性方程组的解
    • 1.2 齐次线性方程组的解
  • 二、透镜摄像机的标定
    • 2.1 标定过程
    • 2.2 提取摄像机参数
    • 2.3 参数总结
  • 三、径向畸变的摄像机标定
    • 3.1 建模
    • 3.2 求解
  • 四、变换
    • 4.1 2D平面上的欧式变换
    • 4.2 2D平面上的相似变换和仿射变换
    • 4.3 2D平面上的透射变换
    • 4.4 3D平面上的欧式变换
    • 4.5 3D平面上的仿射变换
    • 4.5 3D平面上的透射变换


一、回顾线代

1.1 线性方程组的解

 对于线性方程组 A x = y Ax=y Ax=y,当矩阵 A A A 列满秩情况时:(1) 行数(方程数)小于未知数个数,欠定方程组,多解。(2) 行数(方程数)等于未知数个数,唯一解。(3) 行数(方程数)大于未知数个数,超定方程组,无解。

在这里插入图片描述

1.2 齐次线性方程组的解

  对于线性方程组 A x = 0 Ax=0 Ax=0,当矩阵 A A A 列满秩情况时:(1) 行数(方程数)小于未知数个数,欠定方程组,多解。(2) 行数(方程数)等于未知数个数,只有零解。(3) 行数(方程数)大于未知数个数,超定方程组,除零解外无解。

在这里插入图片描述

二、透镜摄像机的标定

2.1 标定过程

 1. 摄像机标定,即求解摄像机的内、外参数矩阵。摄像机的内、外参数矩阵描述了三维世界到二维像素的映射关系。

 2. 首先对于摄像机标定问题,约定像素坐标平面的点用 p p p 表示(不再用 P ′ P' P 表示),世界坐标系的点用 P P P 表示(不再用 P w P_w Pw 表示)。

在这里插入图片描述

 3. 当我们已知多个位置的对应关系时,那我们的目标就是根据这些点对应关系求出摄像机的内、外参数。

在这里插入图片描述

 4. 投影矩阵 M M M 3 × 4 3×4 3×4 的矩阵,我们写成如下的形式,则 m 1 , m 2 , m 3 m_1,m_2,m_3 m1,m2,m3 都是 1 × 4 1×4 1×4 的矩阵。
在这里插入图片描述

 那么像素坐标系的一个点 p i p_i pi 就可以定义为:

在这里插入图片描述

 4. 下面公式是将任意一个像素坐标系上的点,通过等式变换得到一个齐次线性方程,而多个点对又可以构成齐次线性方程组。
 摄像机投影矩阵有11个自由度(未知量)。由于每一个二维点在像素坐标系下为两个值,那么对于11个未知量来说最少需要12个方程来进行求解(由于像素坐标系下点的两个横纵坐标成对出现),那么就需要六对点来对应,但实际应用中一定是使用多于六对点来对应,通过最小二乘法消掉一部分错误的噪声点对,可以获得更好的鲁棒性效果。
 大多数情况下,生成的齐次线性方程数是远大于11的,方程数大于未知参数,齐次线性方程组为一个超定方程组,所以可以用齐次线性方程组的最小二乘法求解方法来求解同样的问题。

在这里插入图片描述

在这里插入图片描述

2.2 提取摄像机参数

 1. 将下面的投影矩阵展开,左一列为 3 × 3 3×3 3×3 的矩阵,右一列为 3 × 1 3×1 3×1 的向量,合起来投影矩阵为一个 3 × 4 3×4 3×4 的矩阵,由于通过齐次线性方程组的最小二乘法求解内外参数,从而导致真正的投影矩阵和求的投影矩阵之间存在一个比例系数 ρ ρ ρ 的关系,所以,括号里的为真实的投影矩阵(未知), M M M 为求解得到的投影矩阵。

在这里插入图片描述

 2. 我们把求解得到的投影矩阵 M M M 写成 [ A , b ] [A,b] [A,b] A A A 就是前三列, b b b 是最后一列,所以 ρ A = K R ρA=KR ρA=KR
A A A b b b 都是已知的。

在这里插入图片描述

 3. 旋转矩阵中每一行的模都是1,所以可以得到以下的结论。利用 ρ a 1 T ⋅ ρ a 3 T ρ{a_1}^T · ρ{a_3}^T ρa1Tρa3T ρ a 2 T ⋅ ρ a 3 T ρ{a_2}^T · ρ{a_3}^T ρa2Tρa3T 可以求出 u 0 u_0 u0 v 0 v_0 v0:点乘。

在这里插入图片描述

 4. 利用 ρ a 1 T × ρ a 3 T ρ{a_1}^T × ρ{a_3}^T ρa1T×ρa3T ρ a 2 T × ρ a 3 T ρ{a_2}^T × ρ{a_3}^T ρa2T×ρa3T 可以求出下面图中的式子。:叉乘。

在这里插入图片描述

 5. 由上面的式子可以得到 α α α β β β 的表达式。再将 ρ 2 ( a 1 × a 3 ) ρ^2(a_1 × a_3) ρ2(a1×a3) ρ 2 ( a 2 × a 3 ) ρ^2(a_2 × a_3) ρ2(a2×a3) 进行点乘,然后带入 α α α β β β 的表达式可以得到关于 θ θ θ 的表达式。

在这里插入图片描述

在这里插入图片描述

 (1) 此时我们也可以令 θ = 90 ° θ=90° θ=90° c o s θ cosθ cosθ 为0,满足零倾斜透视情况,那么分子 ( a 1 × a 3 ) ⋅ ( a 2 × a 3 ) (a_1 × a_3) · (a_2 × a_3) (a1×a3)(a2×a3) 为0,满足Faugeras定理中的第二条零倾斜透视矩阵性质。

 (2) 我们令 α = β α=β α=β 那么一定满足 α α α 的平方等于 β β β 的平方,即 ( a 1 × a 3 ) ⋅ ( a 1 × a 3 ) = ( a 2 × a 3 ) ⋅ ( a 2 × a 3 ) (a_1 × a_3) · (a_1 × a_3)= (a_2 × a_3) · (a_2 × a_3) (a1×a3)(a1×a3)=(a2×a3)(a2×a3),且令 θ = 90 ° θ=90° θ=90° 满足零倾斜透视情况,此时满足Faugeras定理中的第三条零倾斜且宽高比为1的透视矩阵性质。

 6. r i r_i ri 是个方向向量,不用管前面的系数。所以利用 ρ a 2 T × ρ a 3 T ρ{a_2}^T × ρ{a_3}^T ρa2T×ρa3T 可以求出 r 1 r_1 r1 r 3 r_3 r3 可以直接得出,最后 r 2 = r 1 × r 3 r_2=r_1 × r_3 r2=r1×r3

在这里插入图片描述

 7. 利用公式 ρ b = K T ρb=KT ρb=KT 可以求出 T T T

在这里插入图片描述

上面求解推导过程中有几个注意点:
(1) 列向量模的求法:
在这里插入图片描述
(2) 向量的点乘(内积)
在这里插入图片描述
(3) 向量的叉乘(外积)
两个向量叉乘的运算结果是一个向量而不是一个标量。并且两个向量叉乘得到的向量与这两个向量组成的坐标平面垂直。
在这里插入图片描述

2.3 参数总结

 1. 各个参数的最终公式如下所示:

在这里插入图片描述

 2. 我们要注意取点时不要取同一平面的点。

在这里插入图片描述

三、径向畸变的摄像机标定

3.1 建模

 1. 径向畸变会导致图像的放大率随着距离光轴距离的增加而减小,换句话说,距离摄像机中心近的影响小,距离摄像机中心远的畸变影响大。

 2. 定义一个 λ λ λ,满足和摄像机中心 d d d 之间的多项式关系,对原来像素坐标系和世界坐标系的映射关系间添加一个 S λ S_λ Sλ 矩阵。下图中 d 2 d^2 d2 表示点距离摄像机坐标系中心的距离。

在这里插入图片描述

 3. 对于径向畸变问题不再是一个齐次线性方程组的问题,而是一个非线性的问题,由于 λ λ λ u u u v v v 之间存在了映射关系,导致 λ λ λ 不再是一个简单的参数,也无法再转换为齐次方程组的 A x = 0 Ax=0 Ax=0 的关系,只能建立成 f ( x ) = 0 f(x)=0 f(x)=0 的非线性关系。

在这里插入图片描述

3.2 求解

在这里插入图片描述

四、变换

4.1 2D平面上的欧式变换

 1. 欧式变换,也称为欧几里得变换或刚性变换,是一种较为基本的变换方式。在欧式变换中,同一个向量在各个坐标系下的长度和角度都不会发生变化,它只涉及物体的旋转和平移运动,不改变物体的形状和大小。这种变换方式在视觉SLAM(同步定位与地图构建)中具有重要的应用,用于描述相机等刚体的运动定位和构图过程。

 2. 欧式变换具有长度、夹角和体积不变性,即在变换过程中,物体的长度、各部分的夹角以及体积都会保持不变。

 3. 等距变换包括欧式变换( σ = 1 σ=1 σ=1)和镜像变换( σ = − 1 σ=-1 σ=1)。

在这里插入图片描述

4.2 2D平面上的相似变换和仿射变换

 1. 相似变换就在欧式变换基础上添加了一个比例因子 s s s,使得大小会有所变化,但形状不变,保持相似性。

在这里插入图片描述

 2. 仿射变换中形状和大小已经完全变化,但是不同形状之间平行性,面积比值,平行线段长度比值仍然不变。

在这里插入图片描述

4.3 2D平面上的透射变换

 透射变换不保持平行性,只能保持原来是个点现在还是个点,原来是个线现在还是个线,原来在一个平面现在还在一个平面。
在这里插入图片描述

在这里插入图片描述

4.4 3D平面上的欧式变换

:下图中的 s s s 为缩放因子,欧式变换 s = 1 s=1 s=1,相似变换 s s s 就不定了。

在这里插入图片描述

在这里插入图片描述

4.5 3D平面上的仿射变换

在这里插入图片描述

在这里插入图片描述

4.5 3D平面上的透射变换

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Git Bash命令初始化本地仓库,提交到远程仓库

git init:初始化空仓库 // 初始化一个空仓库或者重新初始化一个存在的仓库 git init git remote // 为当前本地仓库添加一个远程仓库地址 git remote add origin https://gitee.com/xxx/demo.git git pull // 从设置好链接的远程仓库拉去已经存在的数据,…

微信小程序调试、断点调试

1、wxml 查看对应的页面组件 2、console面板可以用来打印信息 3、sources 用来断点调试 4、network面板用来调试接口 5、storage面板 可以查看每个key对应的value内容,这些数据在用户使用小程序时被持久化保存在本地。

Outlook邮件导入Notes竟然有这么多办法

大家好,才是真的好。 以前我们讲过,如何将微软的Outlook里的邮件导入到Notes邮箱中。今天我们来系统地跟大家再回顾下几种方式。 第一种方式就是Notes客户端自带一个迁移工具。名字叫做Exchange迁移,在Notes客户机安装时,可以选…

Flink:使用 Faker 和 DataGen 生成测试数据

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…

HarmonyOS定时器与定时任务

HarmonyOS 的 ArkTS 说白了 就是 TS和JS混合 加了一些新特性的语言 定时任务 就还是用 js代码就OK了 我们代码这样写 Entry Component struct Twox {build() {Row() {Column(){Button("触发定时任务").onClick(()>{setTimeout(()> {console.log(执行)},2000…

如何将Excel两列数据转换为统计图、曲线图、折线图?如何自定义某一列作为Excel的统计图横纵坐标?

这样,横坐标就更换为指定选中的数据了 我们还可以修改统计图的样式 也可以修改统计图的类型

GAMES104-现代游戏引擎 1

主要学习重点还是面向就业,重点复习八股和算法 每天早上八点到九点用来学习这个课程 持续更新中... 第一节 游戏引擎导论 第二节 引擎架构分层 引擎是分层架构的 编辑器功能层资源层核心层平台层 越底层的代码越稳定越坚固,越上层的代码越灵活越开…

蓝桥杯练习03个人博客

个人博客 介绍 很多人都有自己的博客,在博客上面用自己的方式去书写文章,用来记录生活,分享技术等。下面是蓝桥云课的博客,但是上面还缺少一些样式,需要大家去完善。 准备 开始答题前,需要先打开本题的…

【重温设计模式】策略模式及其Java示例

策略模式的基本概念 策略模式,是一种常见的行为设计模式,主要用于处理程序中的一些相同行为,但具有不同实现方式的问题。在策略模式中,我们将每一种行为封装为一个个策略类,通过策略类的组合和切换,可以灵…

Qt QTableWidget 实现行选中及行悬浮高亮

表格整行的 selected、hover 高亮需求很常见,但使用 Qt 提供的开箱即用的方法根本无法实现这个需求(至少在当前的时间节点是不行的);想要实现这个效果必须要费一点点力气,我们尽量选择较为简单的方法。 话不多说&…

【运维】StarRocks数据迁移到新集群(针对于集群互通、不互通的情况)

文章目录 一. 迁移整体思路1. 对于新旧集群互通的情况2. 对于新旧集群不互通的情况二、迁移过程(两个集群互通的情况)1. 备份过程1.1. 通过mysqlclient与starrocks进行关联1.2. 创建仓库与minio建立联系1.3. 备份数据到minio2. 迁移过程2.1. 通过mysqlclient与starrocks进行关…

【C语言】—— 指针三 : 参透数组传参的本质

【C语言】—— 指针三 : 参透数组传参的本质 一、数组名的理解二、使用指针访问数组2.1、指针访问数组2.2、[ ] 的深入理解2.3、数组与指针的区别 三、一维数组的传参本质四、数组指针变量4.1、数组指针变量是什么4.2、 数组指针的初始化 五、二维数组传参的本质 一…

spring整合Sentinel

安装sentinel: 执行命令; java -jar sentinel-dashboard-1.8.6.jar 注:sentinel的默认端口为8080,容易出现tomcat的冲突。 当端口冲突,可以使用该指令修改sentinel的端口 默认账号和密码都为sentinel Springcloud整合sentinel:…

深入理解Java中的TCP连接:三次握手和四次挥手

欢迎来到我的博客!今天我们将一起探索网络通信的奥秘。在Java编程中,我们经常会涉及到网络通信,而TCP协议是实现可靠数据传输的重要协议之一。在建立TCP连接和断开连接的过程中,三次握手和四次挥手是至关重要的步骤。本文将深入探…

人工智能数据分析Python常用库 01 time、random、collections、itertools库

文章目录 一、time库1、获取现在时间2、时间戳与计时器3、格式化4、睡眠 二、random库1、随机种子2、产生随机整数3、产生随机浮点数4、随机序列5、概率分布——以高斯分布为例 三、collections库——容器数据类型1、namedtuple——具名元组(1)定义方法&…

YOLO_you only look once

前言 计算机图形学的课程即将结束,我需要提交一份关于YOLO模型的学习报告。在这段时间里,我对YOLO进行了深入的学习和研究,并记录下了我的学习过程和心得体会。本文将详细介绍YOLO模型的原理、优缺点以及应用领域,希望能够为后续…

Day11:栈 LeedCode 20.有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值

20.有效的括号 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的…

使用stream流合并多个List(根据实体类特定属性合并)

开发情景 现有多个List集合,其中都是一样的实体类,这里我想根据实体类的特定属性将它们合并在一起,形成一个最终的List集合。 这里主要用到了Stream流的flatMap方法与reduce方法。 flatMap:可以将多个Stream流合并在一起,形成一个Stream流。 reduce:可以将Stram流中的元…

基于Java+Springmvc+vue+element实现高校心理健康系统详细设计和实现

基于JavaSpringmvcvueelement实现高校心理健康系统详细设计和实现 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐…

Ubuntu Flask 运行 gunicorn+Nginx 部署

linux Ubuntu 下运行python 程序出现killed 原因:CPU或内存限制:在华为云上,你可能有CPU或内存使用的限制。例如,如果你使用的是一个固定大小的实例,那么超过该实例的CPU或内存限制可能会导致进程被杀死。 参考&am…