几何角度理解相机成像过程

news2024/11/17 19:52:43

        本笔记从几何角度来理解相机的成像过程,我们生活在三维世界中,相机所捕捉到的画面是2D的,3D空间中的点是如何投影到2D平面的过程是本笔记关注的。

预设场景

        本笔记讨论的东西基于以下场景:

        在一个房间内放了一台相机,在相机视野范围内有一个点P(3D空间坐标)。我们来看这个3D空间坐标下的P点是如何变成相机成像平面上的像素2D坐标的。

图1:世界坐标系、相机坐标系。两者通过旋转变换和平移变换联系起来。

世界坐标系(World Coordinate System)

        我们不考虑房间具体在外部世界中的位置,而是把房间当成是一个世界。在这个房间里,为了能够表示出物体的位置信息,我们首先要为这个房间定义一个坐标系,这个坐标系包含两个最重要的东西:

        1. 原点:可以将原点放在房间正中心,也可以放在某个角落作为原点(本笔记使用这种方式),原点坐标(0,0,0)

        2. XYZ轴:本例中X和Y轴表示沿着房间地面的两个维度,Z轴是沿着墙的垂直方向的维度。

        定义好了坐标系后,房间中的任意一个点的位置,用3D坐标都能够被表示出来,坐标形式为(x,y,z),三个值分别代表了这个点距离X、Y和Z轴的距离。在本例中,这个坐标系就是世界坐标系。

         图中加粗的字体(Xw,Yw,Zw)表示世界坐标系的X,Y,Z轴,对于某个点的坐标用普通字体表示比如案例的P点坐标我们记为(Xw,Yw,Zw)。

相机坐标系(Camera Coordinate System)

        接下来我们在房间里摆放一台相机。如果相机被放置到了房间的原点位置,并且让相机的X.Y.Z轴对齐到Xw,Yw,Zw轴,那么这两个坐标系就完全一样了。

        当然,相机的位置是可以随意摆放的,这种情况下,我们需要找到世界坐标和相机坐标之间的关系。

        假设相机在世界坐标系中的位置为(Tx,Ty,Tz),这个坐标其实可以看成在世界坐标系下,相机从原点位置平移到了(Tx,Ty,Tz)。

        相机本身也可以看向任意方向,也就是说在世界坐标系下,相机进行了旋转。3D旋转本身可以用三个参数表达,yaw,pitch,roll,这三个参数表示了沿着三个轴的旋转,如下图所示:

        通常为了数学计算的方便,旋转是通过一个3x3的矩阵来表示的,虽然这个矩阵有9个元素,但只有三个元素用于旋转参数。

        关于旋转矩阵的细节和推导,可以参考这里:

旋转矩阵(Rotation Matrix)的推导及其应用 - meteoric_cry - 博客园向量的平移,比较简单。 Xnew = Xold + Tx Ynew = Yold + Ty 缩放也较为简单 矩阵如何进行计算呢?之前的文章中有简介一种方法,把行旋转一下,然后与右侧对应相乘。在谷歌图片https://www.cnblogs.com/meteoric_cry/p/7987548.html        综上,世界坐标系和相机坐标系通过一个旋转矩阵R和一个3个元素的平移向量t产生联系。

        这也意味着,对于世界坐标系下的点P(Xw,Yw,Zw),在相机坐标系中会有不同的位置坐标值(Xc,Yc,Zc),见图1中使用红色表示的相机坐标系。

        这两个坐标系的值的关系通过下面的等式表示:

        从上面这个等式可以看到,如果要将世界坐标转为相机坐标,需要做一次矩阵相乘和一次矩阵相加。这种方式虽然可行,但如果能用一个矩阵相乘完成旋转和平移操作的话岂不是更加方便吗。但从上面的等式可以看出,对于一个只有三个维度的向量而言,是无法做到旋转和平移写成一个3X3矩阵的。为了能够统一旋转和平移到一个矩阵里,需要对三维向量增加一个维度w,此时这个四维的点坐标就叫做齐次坐标,增加了一个维度后就能用一个4x4矩阵来统一旋转和平移操作了。

        关于齐次坐标的更详细的参考资料,可以看这里:

齐次坐标 - 简书H.C.(Homogeneous Coordinates) are a system of coordiantes used in projective geometry--...https://www.jianshu.com/p/eb85abbdc0ad        使用齐次坐标后,旋转和平移操作就可以放到一个统一的4X4矩阵里了,这个矩阵P称为相机的外参矩阵(Extrinisic Matrix)。

        空间某个点p,其在世界坐标系下表示为[xw,yw,zw,1],在相机坐标系下表示为[xc,yc,zc,1]:

在这里插入图片描述

图像坐标系(Image Coordinate System) 

图2:点P透视投影到图像平面示意

         前面我们使用外参矩阵将世界坐标系的P点坐标转换到了相机坐标系里的值,拿到这个值之后,就可以在相机坐标系下做投影得到该点在图像平面上的位置了。

        关于图2,需要做一点说明。图2是以一个简单的小孔成像的相机模型为基础来说明的,真实情况下,图像平面是在光心Oc后面,所产生的图像是一个颠倒的画面。为了讨论方便,这里是将图像平面放到了Oc前面。图像平面离光心Oc的距离为f(焦距)。

        下图来自于CSDN的某个博主的图,非常直观地说明了图像坐标系上的点是如何得到的。原文链接如下:

世界坐标系,相机坐标系和图像坐标系的转换(Python)_AI吃大瓜的博客-CSDN博客世界坐标系,相机坐标系和图像坐标系的转换(Python)相机内参外参说明:https://panjinquan.blog.csdn.net/article/details/102502213计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换:https://blog.csdn.net/chentravelling/article/details/535580...https://blog.csdn.net/guyuealian/article/details/104184551

         具体推导很简单,利用两个相似三角形的边长比例关系就可以得到图像平面的x,y。用齐次坐标形式写出的矩阵相乘等式为:

像素坐标系(Pixel Coordinate System)

     

         像素坐标系和图像坐标系都以图像平面为基础,但是两者的原点位置和轴的单位是不同的。图像坐标系的原点是是相机光轴和图像平面的交点,通常为图像平面的中心点(principal point),单位是毫米mm。而像素坐标系的原点在图像平面左上角,单位是像素pixel。这两者的转换如上图所示。转换关系相对简单,需要注意图中的dx,dy分别表示一个像素(看成矩形)的横向长度和纵向长度(简单理解就是宽和高),dx,dy单位是mm。

总结

        综合前面所有步骤,一个世界坐标系中的点P先从世界坐标系转换到相机坐标系,然后再转到图像坐标系,最后转换到像素坐标系。这些变换过程写成完整的矩阵相乘的式子如下:

         其中为外参矩阵,为内参矩阵。相机标定就是为了得到这两个矩阵的值。

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

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

相关文章

入职阿里的秘密武器,阿里内部“Java学习笔记”,由浅入深,通俗易懂!

导言 提起阿里,行外人联想到的关键词无非是“交易”、“淘宝”、“支付宝”,但对于程序员来说,阿里庞大的技术体系才是最吸引人的。实际上阿里作为国内一线互联网公司的头把交椅,内部的技术体系和发展都是备受关注的,…

Network-UART VHDL设计及仿真实现

设计内容: 实现UART及实时系统完成收发UART操作的测试系统,要求如下: 本工程包括一个测试系统,UART. UART包括baud波特率模块、UART的transfer and receive模块等 1 Objective The objective of this project is to design and build a complete UART in VHDL. Upon comp…

为什么电子商务物流对电商商家的业务很重要?

正是电子商务物流的推动推动了企业发展包括最大渠道在内的整体生态系统;店内提货、电子商务、分销商、经销商、合作伙伴和全球制造商,推动新客户的增长。电子商务巨头的目标是推动更多的销售并提高客户忠诚度。  无论是内部还是第三方物流公司,改进的电…

【小塔秉匠地图】

运行对应地图 1.先清空url运行一遍 2.填上url再次运行就可以了 对地图操作的方法 handleRowClick(row, column, event) {if (row) {this.send(camToAnchor,{name: row.ancName}) // camToAnchor:定位到锚点;ancName锚点的唯一标识} },send(funcName, options) {console.l…

优维低代码:Theme Mode 页面主题和模式

优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。 连载…

React 18:state概念与使用、注意问题

一、概念与基本使用 props中的所有属性都是不可变的,这使得React组件不能随着props的改变而改变。但在实际的开发中,我们更希望的是数据发生变化时,页面也会随着数据一起变化。React为我们提供了state用来解决这个问题。 state和props类似&…

类的赋值与浅拷贝

类的浅拷贝与深拷贝 变量的赋值操作 只是形成两个变量,实际上还是指向同一个对象浅拷贝 Python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝因此,源对象与拷贝对象会引用同一个子对象深拷贝 使用copy模块的deepcopy函数…

[附源码]JAVA毕业设计疫情防控期间网上教学管理(系统+LW)

[附源码]JAVA毕业设计疫情防控期间网上教学管理(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 …

window下生成SANs证书给ingress用

1.安装openssl openssl下载地址:http://slproweb.com/products/Win32OpenSSL.html http://slproweb.com/products/Win32OpenSSL.html 下载指定版本exe安装。 2. 修改openssl配置 为了方便我们copy一份openssl.cfg,用来修改 C:\Users\vamcl\Deskto…

做自媒体18个月,倒欠38万,一个自媒体创作者的自述

做自媒体18个月,倒欠38万,一个自媒体创作者的自述 疫情开始后,长期居家,工作和生活都受到了明显影响,偶然在网上看到了自媒体这个行业,号称日入几千几万。 前前后后花非不少钱买设备、买课、买会员等等,花费近40w颗粒…

Java网络编程,超详细

计算机网络分为网络协议和网络体系结构 通过网络发送数据是一项复杂的操作,必须仔细地协调网络的物理特性以及所发送数据的逻辑特征。通过网络将数据从一台主机发送到另外的主机,这个过程是通过计算机网络通信来完成。 网络通信的不同方面被分解为多个…

爆火的OpenAI及ChatGPT注册详细说明

1 准备条件 ① 需要梯子 ② 准备一个能够接收openai的手机号,用于接收注册验证码 (如果没有也不要紧,下面会介绍通过第三方接码平台来注册) 2 注册手机号接收验证码 网址:https://sms-activate.org/cn/getNumber 2.1 点击右上角注册 这里…

在word表格中一键生成序号,如何操作?

在word表格中一键生成序号,如何操作? 目录 在word表格中一键生成序号,如何操作? 1、首先选中需要填序号的这一列​ 2、在【开始】菜单中找到【多级列表】点击,再点击【定义新的多级列表】​ 3、点击【修改级别中的1…

ELK企业级日志收集

目录 一、ELK简介 二、ELK各组件介绍 ElasticSearch: Kibana: Logstash: 三、ELK可以添加的其他组件 Filebeat: 缓存/消息队列(redis、kafka、RabbitMQ等): Fluentd: 四、为…

【C初阶】第五篇——数组

一维数组的创建和初始化 数组的创建 数组的初始化 一维数组的使用 一维数组在内存中的存储 二维数组的创建和初始化 二维数组的创建 二维数组的初始化 二维数组的使用 二维数组在内存中的存储 数组越界 数组作为函数参数 冒泡排序函数的错误设计 数组名是什么? …

[附源码]Python计算机毕业设计SSM基于的汉服服装租赁系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[附源码]Python计算机毕业设计Django大学生志愿者服务管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

配置vue3适用的vue-devtools

1、下载最新的vue/devtools的github项目库 项目库地址为 :GitHub - vuejs/devtools: ⚙️ Browser devtools extension for debugging Vue.js applications. 2、安装yarn vue/devtools的项目库,必须使用yarn来编译,npm会报错。 npm i 会报…

SQLyog Ultimate最流行的数据库管理工具之一

SQLyog Ultimate最流行的数据库管理工具之一 SQLyog是为Windows提供的最流行的SQL数据库管理工具之一。该软件是世界上任何地方的数据库管理工具,非常快速,易于使用和维护图形环境。使用此程序,您可以构建漂亮的数据,并在可视摄像…

Java教程-特性/语法/对象和类/基本数据类型/变量修饰符运算符/循环结构和条件语句/数组/正则/文件IO/异常处理详细总结

文章目录教程简介主要特性Java 语言是简单的:Java 语言是面向对象的:Java语言是分布式的:Java 语言是健壮的:Java语言是安全的:Java 语言是体系结构中立的:Java 语言是可移植的:Java 语言是解释…