【AI数学】相机成像之外参数

news2024/11/7 9:31:34

在一个多视点计算机视觉系统里,系统输入除了多个视角的图像外,一般还需要输入对应视角下相机的内外参数。其中,相机内参数决定了图像坐标系和相机三维坐标系的映射关系,而相机外参数则决定了相机三维坐标系和世界坐标系的对应关系。这两组对应关系描述了多视几何的数学基础。

先明确三个概念:1. 图像坐标:像素值的坐标x,y,最多附带一个原点平移(左上角–>图像中心);2. 相机三维坐标系:以图像二维坐标系扩到三维,其中垂直图像外面向外的为z轴,通常以光心作为原点;3. 世界坐标系:每个视点都有自己的独立坐标系,需要投射到同一个坐标系,即世界坐标系。

我们可以通过“小孔成像”原理轻松求解出利用相机内参数求解图像坐标和相机三维坐标系的映射关系,详情可戳《【AI数学】相机成像之内参数》。本文主要讲解相机外参数的作用,即相机坐标系对世界坐标系对映射关系。
Extrinsic Parameters
图片来自(https://ftp.cs.toronto.edu/pub/psala/VM/camera-parameters.pdf)

现在有两个坐标系 A A A B B B,空间上有一个点 P P P P P P在坐标系 A A A和坐标系 B B B上都有一个坐标。假如 P P P在坐标系 A A A中点的坐标为 P A = ( x A , y A , z A ) \bold{P_A}=(x_A,y_A,z_A) PA=(xA,yA,zA),在坐标系 B B B中的坐标为 P B = ( x B , y B , z B ) \bold{P_B}=(x_B,y_B,z_B) PB=(xB,yB,zB)。那么 P A \bold{P_A} PA P B \bold{P_B} PB满足什么关系呢?

所谓坐标系,无非就是一组正交基。假如坐标系 A A A的单位正交基为 ( a 1 ⃗ , a 2 ⃗ , a 3 ⃗ ) (\vec{a_1}, \vec{a_2}, \vec{a_3}) (a1 ,a2 ,a3 ),坐标系 B B B的单位正交基为 ( b 1 ⃗ , b 2 ⃗ , b 3 ⃗ ) (\vec{b_1}, \vec{b_2}, \vec{b_3}) (b1 ,b2 ,b3 )。这些单位正交基,都可以在同一个坐标系表示出来,只需选定一个确切的坐标系即可,我们无论选坐标系 A A A、坐标系 B B B或者其他坐标系都是可以的,被选定的坐标系我们通常称为“世界坐标系”。由此,我们可以发现,我们选来表示其他坐标系的单位正交基的公用坐标系就是世界坐标系

那么,空间中一点 P P P向量可以表示为:
[ a 1 ⃗ , a 2 ⃗ , a 3 ⃗ ] ⋅ [ x A y A z A ] \begin{bmatrix} \vec{a_1} , \vec{a_2} , \vec{a_3} \end{bmatrix} \cdot {\begin{bmatrix} x_A \\ y_A \\ z_A \end{bmatrix}} [a1 ,a2 ,a3 ] xAyAzA
也可以表示为:
[ b 1 ⃗ , b 2 ⃗ , b 3 ⃗ ] ⋅ [ x B y B z B ] \begin{bmatrix} \vec{b_1} , \vec{b_2} , \vec{b_3} \end{bmatrix} \cdot {\begin{bmatrix} x_B \\ y_B \\ z_B \end{bmatrix}} [b1 ,b2 ,b3 ] xByBzB
二者有相等(假设两个坐标系原点重合)关系。
[ a 1 ⃗ , a 2 ⃗ , a 3 ⃗ ] ⋅ [ x A y A z A ] = [ b 1 ⃗ , b 2 ⃗ , b 3 ⃗ ] ⋅ [ x B y B z B ] (1) \begin{bmatrix} \vec{a_1} , \vec{a_2} , \vec{a_3} \end{bmatrix} \cdot {\begin{bmatrix} x_A \\ y_A \\ z_A \end{bmatrix}}=\begin{bmatrix} \vec{b_1} , \vec{b_2} , \vec{b_3} \end{bmatrix} \cdot {\begin{bmatrix} x_B \\ y_B \\ z_B \end{bmatrix}}\tag{1} [a1 ,a2 ,a3 ] xAyAzA =[b1 ,b2 ,b3 ] xByBzB (1)
对公示(1)两边同时左乘 [ a 1 T ⃗ a 2 T ⃗ a 3 T ⃗ ] \begin{bmatrix} \vec{a^T_1} \\ \vec{a^T_2} \\ \vec{a^T_3} \end{bmatrix} a1T a2T a3T ,则可以将左边的系数化为单位矩阵,变换可得:
[ x A y A z A ] = [ a 1 T ⃗ b 1 ⃗ a 1 T ⃗ b 2 ⃗ a 1 T ⃗ b 3 ⃗ a 2 T ⃗ b 1 ⃗ a 2 T ⃗ b 2 ⃗ a 2 T ⃗ b 3 ⃗ a 3 T ⃗ b 1 ⃗ a 3 T ⃗ b 2 ⃗ a 3 T ⃗ b 3 ⃗ ] [ x B y B z B ] (2) \begin{bmatrix} x_A \\ y_A \\ z_A \end{bmatrix}=\begin{bmatrix} \vec{a^T_1}\vec{b_1} & \vec{a^T_1}\vec{b_2} & \vec{a^T_1}\vec{b_3} \\ \vec{a^T_2}\vec{b_1} & \vec{a^T_2}\vec{b_2} & \vec{a^T_2}\vec{b_3} \\ \vec{a^T_3}\vec{b_1} & \vec{a^T_3}\vec{b_2} & \vec{a^T_3}\vec{b_3} \end{bmatrix} \begin{bmatrix} x_B \\ y_B \\ z_B \end{bmatrix}\tag{2} xAyAzA = a1T b1 a2T b1 a3T b1 a1T b2 a2T b2 a3T b2 a1T b3 a2T b3 a3T b3 xByBzB (2)
我们用字母来代替公式(2),可得:
P A = R P B (3) \bold{P_A}=\bold{R}\bold{P_B}\tag{3} PA=RPB(3)
公式(3)中的 R \bold{R} R被称为旋转矩阵。旋转矩阵 R \bold{R} R是一个行列式为1的正交矩阵,满足 R − 1 = R T \bold{R^{-1}}=\bold{R^T} R1=RT。所以有
P B = R − 1 P A = R T P A (4) \bold{P_B}=\bold{R^{-1}}\bold{P_A}=\bold{R^T}\bold{P_A}\tag{4} PB=R1PA=RTPA(4)
R \bold{R} R只定义了旋转,公式(3)满足两个坐标系原点相同的情况下的坐标换算。假设两个坐标系的原点并不重合,我们则需要对其进行平移。加一个三维的平移矩阵 T \bold{T} T即可:
P B = R T P A + T (5) \bold{P_B}=\bold{R^T}\bold{P_A}+\bold{T}\tag{5} PB=RTPA+T(5)
公式(5)完成的是,两个坐标系( A A A B B B)换算,我们称为相对位姿换算。如果把任意坐标系转换为世界坐标系,我们就称为绝对位姿换算。我们不难推出绝对位姿的换算方法,首先,我们把世界坐标系原点平移到相机坐标系:
P w ^ = P w − C (6) \bold{\hat{P_w}=P_w -C}\tag{6} Pw^=PwC(6)
其中, C \bold{C} C为两个坐标系原点的偏移量。根据公式(3)我们可以得到:
P c a m = R P w ^ = R ( P w − C ) = R P w − R C = R P w + T (7) \bold{P_{cam}} = \bold{R\hat{P_w}}=\bold{R(P_w - C)}=\bold{RP_w}-\bold{RC}=\bold{RP_w}+\bold{T}\tag{7} Pcam=RPw^=R(PwC)=RPwRC=RPw+T(7)
公式(7)就是本文的精髓:从世界坐标系中算出相机坐标系的坐标。其中
T = − R C (8) \bold{T}=-\bold{R}\bold{C}\tag{8} T=RC(8)
C = − R T T (9) \bold{C}=-\bold{R^TT}\tag{9} C=RTT(9)
通过公式(7),我们就可以将相机坐标系中的点换算到世界坐标系了。这里的 R \bold{R} R T \bold{T} T就是我们的相机外参数了。通常表示为一个 3 × 4 3\times4 3×4的矩阵:
E = ( R   T ) (10) \bold{E}=(\bold{R} \ \bold{T})\tag{10} E=(R T)(10)
如果需要从相机坐标系换算出世界坐标系,可依照
P w = R T ( P c a m − T ) (11) \bold{P_w=R^T(P_{cam}-T)}\tag{11} Pw=RT(PcamT)(11)
本文全部公式为皆为手动推理,若有疑问或指教可留言交流~

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

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

相关文章

【TCP/IP】多进程服务器的实现(进阶) - 进程的概念及fork函数

目录 进程的概念及应用 进程的定义 进程的ID fork函数(进程创建函数) 多进程(以及多线程)是现代计算机网络的精髓。在之前,我们所做的诸如回声服务器、回声客户端、文件收发等都是偏向基础的单进程应用。而经过前面…

【论文阅读】Twin neural network regression is a semi- supervised regression algorithm

论文下载 GitHub bib: ARTICLE{,title {Twin neural network regression is a semi- supervised regression algorithm},author {Sebastian J Wetzel and Roger G Melko and Isaac Tamblyn},journal {Machine Learning: Science and Technology},year {2022},volum…

“我转行做测试开发的这一年多,月薪5K变成了18K”,中文系萌妹的自白

公司老板是我的测试引路人 本人就读于某普通院校,在大学期间就开始实习找工作,误打误撞进入一家做工业大数据的创业公司。 刚开始我并没有明确的职业发展方向,主要是做一些环境搭建的基础工作。但由于执行效率高,工作责任感强&a…

06-发送短信验证码实现登录功能

1、发送短信验证码实现登录功能的流程 1.1、获取验证码流程 1.2、登录流程 1.3、页面带有图形验证码的流程 2、 注册登录二合一页面的开发 2.1、将src目录下的App.vue页面上通用显示的删掉 2.2、在router目录下的index.js文件中通过懒加载的方式添加login.vue页面 对于rout…

【新版】系统架构设计师 - 软件工程

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 软件工程考点摘要软件工程概述软件能力成熟度模型软件过程模型瀑布模型原型化模型增量模型螺旋模型喷泉模型V模型迭代与增量的概念CBSD基于构件的模型(构件组装模型/基于构件的软件开发…

PSP - 更新 MSA 搜索的全部 UniProt 蛋白序列库

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/131115471 UniProt 是一个提供蛋白质序列和功能信息的数据库,由欧洲生物信息学研究所(EMBL-EBI)、美国瑞士生物技术信息中心(SIB)和美国蛋白质信息资源(…

一图详解!接口测试之HTTP协议与HTTPS协议的传输过程

目录 前言: 1、HTTP协议 1.1 协议 1.2 原理 1.2.1 客户端 1.2.2 服务器端 1.3 请求报文 1.3.1 报文格式 1.3.2 请求报文方法 1.4 响应报文 1.4.1 报文格式 1.4.2 响应报文状态码 2、HTTPS协议 2.1 加密算法 2.2 数字签名 2.3 传输过程 2.4 流程图 …

Kafka运维监控:Kafka-Eagle安装

kafka自身并没有集成监控管理系统,因此对kafka的监控管理比较不便,好在有大量的第三方监控管理系统来使用,常见的有: Kafka Eagle KafkaOffsetMonitor Kafka Manager(雅虎开源的Kafka集群管理器) Kafka …

安装和配置Canal

安装和配置Canal 下面我们就开启mysql的主从同步机制,让Canal来模拟salve 1.开启MySQL主从 Canal是基于MySQL的主从同步功能,因此必须先开启MySQL的主从功能才可以。 这里以之前用Docker运行的mysql为例: 1.1.开启binlog 打开mysql容器…

电商打工人的饭碗,AIGC还端不走

文 | 螳螂观察 作者 | 鲸胖胖 以ChatGPT、Midjourney、文心一言等为代表的AIGC产品,已经在全球掀起新一轮的AI技术变革新浪潮,再度刷新了人们对AI的认知,多个行业的商业模式和生态必然在未来会被彻底重构。 前不久,36氪就测使用…

【博客647】MetricsQL(VictoriaMetrics)和PromQL(Prometheus)的不同之处

MetricsQL(VictoriaMetrics)和PromQL(Prometheus)的不同之处 1、如果对PromSQL不熟悉可以先看以下链接 https://valyala.medium.com/promql-tutorial-for-beginners-9ab455142085 2、与PromQL相比,以下功能在MetricsQL中的实现方式不同,这也改善了用户…

AI实战营第二期 第六节 《MMDetection代码课》——笔记7

什么是MMDetection? MMDetection 是被广泛使用的检测工具箱,包括了目标检侧、实例分割、全景分割等多个通用检测方向,并支持了 75 个主流和前沿模型, 为用户提供超过 440 个预训练模型, 在学术研究和工业落地中拥有广泛应用。该恇…

帧布局叠放视图

线性视图只会将视图组织到一行或一列中&#xff0c;每个视图都在屏幕上有自己的位置不会重叠。如果希望布局能够重叠&#xff0c;有个很简单的做法就是使用帧布局。 本文实现一个图像上显示文本的例子。 定义帧布局 <?xml version"1.0" encoding"utf-8&quo…

C++类和对象-5

本篇博客来讲述C类和对象中的最后一些内容&#xff0c;即友元和const的使用方法。 目录 1.友元 1.1引入 1.2内容 1.2.1友元函数 1.2.2友元类 1.3内部类 2.const修饰 2.1内容 2.1.1常数据成员 2.1.2常成员函数 2.1.3常对象 2.2示例 1.友元 1.1引入 在讲述友元之…

使用DR对流量进行管理 subnet子集的定义

这里vs可以控制往svc1和svc2流量走的比例&#xff0c;但是这里只假设往svc3里面走。现在想控制的是往pod1和pod2各走多少流量。 流量到了svc3的时候还是使用的是kube-proxy对流量进行转发。 了解DR DR定义的是经过VS之后已经到达service的流量&#xff0c;主要可以用于&#xf…

【深度学习入门:基于Python的理论与实现】

文章目录 神经网络从感知机到神经网络神经网络的例子复习感知机激活函数登场 激活函数sigmoid函数阶跃函数的实现sigmoid函数的实现 sigmoid函数和阶跃函数的比较ReLU函数 3层神经网络的实现符号确认代码实现 输出层的设计恒等函数和softmax函数输出层的神经元数量 手写数字识别…

【ArcGIS Pro二次开发】(36):度分秒转十进制度

经纬度坐标的表达方式比较常用的一般有2种&#xff0c;【度分秒和十进制度】。 在成果展示中&#xff0c;以【度分秒】居多&#xff0c;但如果要将坐标导入ArcGIS中&#xff0c;则一般需要用到【十进制度】&#xff0c;这个转换可以在Excel中进行&#xff0c;也可以在ArcGIS中的…

火龙果MM32F3273G8P开发板MindSDK开发教程4 - 滴嗒定时器Systick的配置

火龙果MM32F3273G8P开发板MindSDK开发教程4 - 滴嗒定时器Systick的配置 1、Systick寄存器 Systick是ARM内核的一个外设&#xff0c;所以在不同芯片的代码上移植比较方便&#xff0c;他总共有4个寄存器&#xff0c; 从Systick定义中可以看到&#xff1a; typedef struct {__I…

Android系统的启动流程(二):SystemServer处理过程

Android系统的启动流程&#xff08;二&#xff09;&#xff1a;SystemServer处理过程 摘要 在上篇文章中&#xff0c;我们已经将启动的进程推进到了ZygoteInit的main中&#xff0c;在ZygoteInit中我们已经知道它的main方法中的forkSystemServer方法将会启动系统服务&#xff0…

机器学习 | 支持向量机SVM | 概念了解向

概念了解向&#xff0c;参考视频&#xff1a; 【小萌五分钟】机器学习 | 支持向量机 SVM &#x1f4da;最大间隔分类器 如下图有两种不同颜色的点。我需要一个分类器告诉我&#xff0c;假设在下图中新加入一个点&#xff0c;应该将它分类至红点还是蓝点。考虑加入一条决策边界…