【情人节特辑】相机也成双——直观理解对极几何中的四个重要矩阵(外参矩阵、内参矩阵、基本矩阵、本质矩阵)

2023-05-16

祁子禹

引言

在奔逸不羁的童年,笔者对理科知识的好奇无际无边。某天曾在外婆家的煤棚子里一通乱翻,缴获了大舅学生时代的几何光学课本,不料遭遇开幕雷击:

“人的眼球好比照相机,我们要为革命而保护视力!”

对于一个孩童干瘪的脑袋来说,实在是难以领悟眼球和相机有何关联,也就更别提它们如何跟革命扯到一起了。时隔多年,笔者当物理学家的童年梦想未果,而是成为了一名脑外科医生。有了医学专业背景再回想,觉得书上这话讲得还算不孬——两只眼球属实如同两枚相机,乖巧而警觉地伏于眶窝内,可调光轴(眼外肌),可调焦距(睫状体)、可调光圈(瞳孔),既有底片(视网膜),又有电缆(视神经),最后把照片发给主机(大脑)。大脑整合双眼图像,分析差异,计算出物体到眼球的距离与深度。这些信息加上日积月累的视觉经验,便造就了双目立体视觉,使人看到立体的世界。

归纳逻辑推理告诉我们:欲谋取对事物的完整理解,要把问题一般化,还要把问题特殊化。上一段文字从眼球与相机的关系中抽象出了双目立体视觉的概念,是问题一般化。而问题特殊化是反向过程,即从双目立体视觉的概念反观眼球与相机的比喻,便可总结事物的关键部分和次要部分,专注于分析与科学问题关联最大的因素。

场景的简化版显而易见——空间中有一物体,双眼正注视着这个物体,产生两幅图像。大脑分析处理两幅图像,造就了双目立体视觉。前人正是通过双眼看世间万物这个模型,抽象出了对极几何的数学概念。本文从眼球-相机的比喻出发,聊聊笔者对对极几何中的四个重要矩阵,即外参矩阵、内参矩阵、基本矩阵和本质矩阵的直观理解。

注:左图引自Read, J. C. (2015). Stereo vision and strabismus. Eye, 29(2), 214-224. 右图引自Zhang, Z. (1998). Determining the epipolar geometry and its uncertainty: A review. International journal of computer vision, 27, 161-195.

 1. 外参矩阵(Extrinsic Matrix)

在真实世界中,物体有它的绝对位置和朝向——它的经纬度坐标,是面朝南还是面朝北。而在人眼中,该物体也有它的相对位置和朝向——它距离眼球多远,是面向人还是背朝人,正如诗所云“横看成岭侧成峰”。

物体的位姿从人的单眼变换到世界,就是外参矩阵所代表的变换。因此,左眼有左眼的外参矩阵,右眼有右眼的外参矩阵。

当物体相对于人眼发生线性变换时,外参矩阵随之改变。线性变换可以是平移(行驶的汽车),可以是旋转(转动的陀螺),可以是放缩(萎泄的皮球),也可以是仿射(斜阳之下的树影)。

术语总结:外参矩阵定义了相机坐标系和世界坐标系的关系,它是从相机坐标系转换到世界坐标系的变换矩阵。

2. 内参矩阵(Intrinsic Matrix)

外参矩阵描述了从世界到眼球的变换,内参矩阵则描述了从眼球到视网膜的变换。

眼球坐标系中的物体是三维的,而视网膜上的(实)像是二维的,因此,内参矩阵是一种从三维到二维的投影变换。投影变换的基本原理是:光在均匀透明的介质中沿直线传播。这也是几何光学体系的基本假设。因此,只要同时控制光源的位置、光的方向及其传播介质恒定不变,那么光路一定是确定的,实像的位置和大小将仅仅取决于光屏的位置和方向。

返回眼球的举例上来,只要使物体的位姿恒定,使人眼的位姿也恒定,那么这只眼球所看到的画面将永远是同一张画面。换言之,一个物体在一只眼球中有且只有一个确定的实像。

所以,每只眼球都必然存在唯一确定的变换矩阵,它使得物体与实像能够一一对应。这个矩阵就是内参矩阵,它反映了眼球的固有折光参数,因此又称“固有参数矩阵”

然而,不同人眼球不同,有人近视,有人远视,有人散光,有人斜视。所以,即便让他们的眼球都在同一位置观察同一物体,所看到的画面也很可能不同——正常人看到的清晰的物体,近视和远视的人说模糊,散光的人说有变形,斜视的人觉得歪曲,晶体被摘除的人说呜呜呜你们在说什么我怎么听不懂啊?换言之,不同眼球的内参矩阵不尽相同,内参矩阵取决于眼球的视轴、折光率、前后径等固有参数。

术语总结:内参矩阵定义了相机的内部参数,它记录了焦距、主点偏移等参数。对于定焦相机而言,内参矩阵是恒定的,在相机标定过程中需要求出。

3. 基本矩阵(Fundamental Matrix)

外参矩阵和内参矩阵概念,都以单只眼球举例,最初也都来源于位于单目视觉的范畴。前文提到双目立体视觉的基础是:大脑可以分析左右眼看到同一物体有何差异。而描述左目图像和右目图像之间变换关系的,就是基本矩阵。

这种变换关系是线性的吗?答案是肯定的。从物体到左目图像发生了线性变换,从物体到右目图像也发生了线性变换,那么,物体、左目图像与右目图像必然能在同一线性空间中描述,从左像到右像的变换也显然是线性变换。

变换是线性的,也就意味着点在左右图片中是一对一的映射,绝不会存在左图中有一个点对应着右图中的两个点。否则就会出现荒谬至极的情况——一个土豆摆在一个视力正常的人面前,他左眼看到一个土豆,右眼却看到了两个土豆。

因此,基本矩阵反映了左右视网膜上图像中的点的对应关系,这种关系可以通过几组对应点的位置,构成线性方程组来求解。

与内参矩阵的情形相似,不同人双眼的基本矩阵也不同,双目的距离(瞳距)就是一个典型的影响因素。精于推理的读者朋友可能马上会有以下疑问:是不是瞳距越大的人,感受视差的能力越强,立体感越好?笔者作为脑外科医生并不清楚,实难回答。那么,拥有眼科专业背景的读者朋友们,你们怎么看?欢迎在下方评论区留言赐教!

术语总结:基本矩阵关系了左目图像和右目图像中对应点的关系,可以用于确定双目相机系统的几何结构,以及确定视差。

4.  本质矩阵(Essential Matrix)

除瞳距外,人们在双眼焦距、光轴、折光性上的差异也会影像左目图像与右目图像的差异。凝练来说,基本矩阵除了受到双眼几何关系制约,还受到眼球固有参数的影响。本质矩阵是在基本矩阵的基础上,排除眼球固有参数的影响,而仅仅保留双眼的几何关系。正是基于这个推理,本质矩阵可以通过基本矩阵和内参矩阵求得。

如果说基本矩阵反映的是左目图像与右目图像的变换,那么本质矩阵反映的则是左眼球与右眼球的变换。将眼球位置和姿态简化为一个有朝向的质点,那么从左质点到右质点位姿的变换,正是本质矩阵所表征的。

前文多次提到斜视,那么什么是斜视呢?如果视力正常者的双眼去追踪一个运动物体,那么他两只眼球的联合转动理应协调一致。假如一些病理性因素(如眼肌损伤、眼球畸形、眶内炎症、颌面骨折等)会破坏这种联合运动的协调性,就会形成视觉障碍,斜视患者不得不通过歪斜的眼位来补偿这种不一致。在临床上,眼科医师们为斜视患者实施的矫正手术,也正是修复了患者左右眼之间的“本质矩阵”,从而使这个矩阵在追踪物体时总是协调一致,流转自如。

术语总结:本质矩阵是基本矩阵和内参矩阵的函数,它记录了两个相机坐标系的相对关系。本质矩阵可以用于计算相机的位姿,以及三维点的深度。

总而言之,外参矩阵、内参矩阵、基本矩阵、本质矩阵总是相互关联的,无论是在单目系统还是在双目系统,无论是从物体到眼球,还是从眼球到视觉图像。

写在最后

基础科学如数学,常常从抽象走向另一个抽象,而应用科学如工学,却是于抽象与具体间“其中往来种作”。众多科普文章则是通过创造性的诠释与表现,将科学知识呈现得更加生动、直观、有趣,避免理论被复杂的抽象所架空,最终疏远大众与科学的距离。本文乃笔者一己之思,全文无一公式,仅供读者朋友们参考,若能抛砖引玉,甚至使“黄发垂髫并怡然自乐”,实乃笔者之幸!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【情人节特辑】相机也成双——直观理解对极几何中的四个重要矩阵(外参矩阵、内参矩阵、基本矩阵、本质矩阵) 的相关文章

  • MAVROS二次开发(一)MAVROS的安装

    MAVROS二次开发 一 MAVROS的安装 1 参考网址 https dev px4 io v1 10 en ros mavros installation html https github com mavlink mavros tre
  • MAVROS二次开发(二)(三)添加自定义消息

    MAVROS二次开发 二 MAVROS消息添加 1 自定义rostopic消息 路径 xff1a catkin ws src mavros mavros msgs msg 自定义消息文件名称 xff1a CrawlControlStatus
  • MAVROS二次开发(四)添加消息处理插件

    MAVROS二次开发 四 添加消息处理插件 mavros插件所在路径 xff1a catkin ws src mavros mavros src plugins 1 自定义消息处理插件的编写 参考代码 xff1a catkin ws src
  • MAVROS二次开发(五)进行测试

    MAVROS二次开发 五 进行测试 1 测试环境 PX4 xff1a v1 10 1 xff08 含自定义mavlink消息收发 xff09 ROS xff1a KineticUbuntu xff1a 16 04LTSQGC xff1a S
  • ROS2+PX4开发环境配置

    一 ROS2安装 Ubuntu18 04的ros2版本 xff1a Eloquent 参考网址 xff1a https docs ros org en eloquent Installation Linux Install Debians
  • Windows10下Airsim+PX4(WSL2)+MAVROS仿真环境搭建

    一 Windows10下WSL2安装 1 1 WSL2的安装与配置 首先在Windows10下启用WSL xff0c 以管理员身份打开 PowerShell 工具并运行以下命令 dism span class token punctuati
  • Windows10通过vcpkg快速配置PCL库

    1 安装C 43 43 包管理工具vcpkg https github com microsoft vcpkg span class token function git span clone https github com micros
  • 微软Chromium版Edge浏览器正式稳定版

    微软Chromium版Edge浏览器正式稳定版 近期微软Chromium版Edge浏览器正式稳定版下载已经泄露 xff0c 版本77 0 235 9 此版本没有div什么的那些 xff0c 和之前的图标一样 当安装新Edge稳定版之后 xf
  • C++疑难问题

    acwing中的算法疑惑 1 为什么确定范围 要 43 10 在使用归并排序和快速排序等方法时有效率问题 xff0c 确定范围在1e6 但是选择的是1e 43 10 2 C 43 43 除二乘2简单方法以及算法效率问题 算法效率速度排行 x
  • 用python的scipy中的odeint来解常微分方程中的一些细节问题(适用于小白)

    用python的scipy中的odeint来解常微分方程中的一些细节问题 xff08 适用于小白 xff09 写在前面 最近有些需要解决常微分方程的问题 xff0c 网上查了很多教程都不是很明晰 xff0c 便自己研究了一段时间 xff0c
  • VsCode使用Git连接Gitee和GitHub

    VsCode连接GitHub和Gitee VsCode连接GitHub和Gitee一 软件安装1 安装git2 vscode 二 在Github或者Gitee上创建空的仓库 项目1 在Github创建空的仓库 项目2 在Gitee创建新项目
  • Julia配置【使用VScode中的Jupyter编写Julia的方法】

    简略目录 安装Julia切换国内源安装Ijulia插件VSCode配置 首次编写日期 xff1a 2021 07 10 安装Julia 官网 xff0c 一路默认即可 xff0c 记得添加PATH xff0c 安装位置可以自定义 切换国内源
  • VSCode配置C++环境(MSVC)

    VSCode配置C 43 43 环境 xff08 MSVC xff09 最近心血来潮 xff0c 想用一下微软的VSCode写一下C 43 43 xff0c 然而第一步就卡住了 xff0c 竟然不会配置C 43 43 环境 xff0c 陆陆
  • GTSAM理解

    1 xff1a GTSAM是什么 参考博文 xff1a gtsam xff1a 从入门到使用 1 xff1a 是什么 xff1a GTSAM是用于计算机视觉和多传感器融合方面用于平滑和建图的C 43 43 库 xff0c GTSAM采用因子
  • tag与branch的区别

    1 什么是tag 什么时候应该创建一个tag 项目的版本管理中 每当一个release版本发布时 需要做一个记录 以便以后需要的时候能查找特定的版本 这时候就用到tag这个功能 Git中的tag指向一次commit的id xff0c 通常用
  • 简历中“项目经历“该如何写?

    前言 找工作 xff0c 简历是最关键的一步 xff0c 只有通过了简历筛查才能往下继续进行 很多人写简历 xff0c 都是在记录流水账 xff0c 看来没有任何平淡寡味 其实简历的核心价值就在于游说 hr 和面试官 xff1a 看我 xf
  • 深度学习解释:Precision、Recall、IoU、Ap/mAp

    深度学习的指标都是 xff08 APAverage Precision xff09 二分类情况下的Precision xff08 查重率 xff09 和Recall xff08 查全率 xff09 对于二分类问题 xff0c 可将样例根据其
  • input上传文件图片本地预览

    lt form gt lt input type 61 34 file 34 id 61 34 avatar 34 name 61 34 avatar 34 gt lt button gt 点击上传 lt button gt lt form
  • colmap pthread 错误

    Looking for include file pthread h Looking for include file pthread h found Looking for pthread create Looking for pthre
  • 全球系留无人机系统行业调研及趋势分析报告

    本文调研和分析全球系留无人机系统发展现状及未来趋势 xff0c 核心内容如下 xff1a xff08 1 xff09 全球市场总体规模 xff0c 分别按销量和按收入进行了统计分析 xff0c 历史数据2017 2021年 xff0c 预测

随机推荐

  • 安装arm-none-eabi版本添加环境变了还是出错问题解决

    安装arm none eabi版本添加环境变了还是出错问题解决 问题解决 问题 已经在 profile文件里面添加了如下命令 span class token keyword export span span class token con
  • 基于ubuntu16.04 塔建PX4编译环境

    基于ubuntu16 04 塔建PX4编译环境 基于ubuntu16 04 塔建PX4编译环境环境塔建官网网址 xff1a 权限设定删除modemmanager更新软件包列表 xff0c 并为所有PX4构建目标安装以下依赖项 安装pyulo
  • APM编译记录-基于OMNIBUSF4-V3飞控板

    APM编译记录 基于OMNIBUSF4 V3飞控板 APM编译记录Bootloader问题固件编译 APM编译记录 初次使用APM xff0c 根据博客文章以及结合官方教程摸索 xff0c 发现和PX4还是有挺大差别的 xff0c 目前系统
  • ubuntu16.04基于eclipse搭建px4编译环境+Jlink调式

    ubuntu16 04基于eclipse搭建px4编译环境 43 Jlink调式 xff09 ubuntu16 04基于eclipse搭建px4编译环境 43 Jlink调式一 工具获取1 eclipse2 jlink3 jdk4 arm
  • Ardupilot通过mavlink + 4way_protocol对BLHeli_s电调的读写

    Ardupilot通过mavlink 43 4way protocol对BLHeli s电调的读写 前言上位机1 Mission Planner2 BLHeliSuite3 BLHeliSuite32 Ardupilot 源码编译1 启动B
  • C/C++中 float与uint16类型转换方法

    C C 43 43 中 float与uint16类型转换方法 为什么要做float与uint16互相转换方法一 xff1a 方法二 xff1a 为什么要做float与uint16互相转换 此需求在串口通信时常常会被用到 xff0c 串口只能
  • Keil V5仿真出现*** error 65: access violation at 0x40021000 : no ‘read‘ permission 解决办法

    Keil V5仿真出现 error 65 access violation at 0x40021000 no 39 read 39 permission 解决办法 问题解决办法1 进入debug的map设置地址2 新建debug ini配置
  • Ardupilot-NMEA协议的GNSS处理优化

    Ardupilot NMEA协议的GNSS处理优化 Ardupilot NMEA协议的GNSS处理优化原固件存在的问题解决办法 Ardupilot NMEA协议的GNSS处理优化 原固件存在的问题 1 当所使用的GNSS模块数据反馈频率不到
  • FMT-模型在环仿真(MIL)

    前提条件 matlab版本是2018B及以上版本下载好了FMT Model工程 设置MIL仿真 打开matlab xff0c 进入到FMT Model目录 xff0c 左键双击打开FMT Model prj 打开过程它自己会初始化工程 xf
  • 【移植Ardupilot的日志记录方法到linux上】

    移植Ardupilot的日志记录方法到linux上 说明日志结构组成日志写入操作预定义日志项运行时添加日志项的方法 单例测试编译方法查看数据其他 说明 采用二进制文件记录 xff0c 可在mission planer查看 支持所有数据类型记
  • 一、linux内核源码分析(内核源码结构组成)

    应该说是把linux内核这部分知识提前了 xff0c 因为坐公交需要点视频来打发一下时间 xff0c 感觉linux内核的视频就不错 xff0c 就顺便把linux内核提前了 这一次也是打算视频和书一起看 xff0c 然后总结 书的话还是推
  • Android开发:使用Lambda表达式高效开发

    简介 xff1a JDK1 8后java开始支持Lambda表达式 xff0c 使用Lambda表达式我们就可以在Android中替换匿名类的写法 本来一个Button点击事件监听要写6行代码 xff0c 我们1行就可以搞定 1 引入依赖
  • ros开发与室内定位(一)

    ROS下搭建 UWB 下行数据解析驱动 Linux内核版本 xff1a ubuntu 15 05 ROS版本 xff1a indigo 搭建局域网 xff0c 向网内的主机提供室内标签实时的定位信息 xff0c 该Demo可以利用UDP协议
  • ubuntu1604 ROS下实时双目ORB-SLAM的环境搭建

    本文主要记录本萌新从零开始搭建ORB SLAM环境的一个过程 xff0c 因为第一次装双系统 xff0c 本来就遇到了很多的问题 来来回回装了好多天才弄好 xff0c 中间遇到的主要问题和步骤参考放在下边 xff0c 可能帮助到别人的话就倍
  • 机器学习题目汇总

    1 深度学习中的激活函数需要具有哪些属性 xff1f 计算简单非线性具有饱和区几乎处处可微 ABD 解析 xff1a xff08 1 xff09 非线性 xff1a 导数不能是常数 xff08 2 xff09 几乎处处可微 xff1a si
  • 天猫精灵云云对接

    天猫精灵云云对接 一 技能开发二 产品开发 接入过程出现了一些问题 xff0c 特此记录 xff0c 用来给朋友们参考 xff0c 随意记录 xff0c 不接受批评 前情提要 xff1a 注册并认证 天猫精灵开放平台 AliGenie 一
  • 关于Altium Designe中元器件添加PDF的简述

    一 缘由 xff1a 今天无意之间在书本上看到关于元器件的Datasheet添加 xff0c 也想起自己曾经为了查询元器件datasheet xff0c 费了不少时间 xff0c 所以写下了此篇博文 二 关于添加步骤 xff1a 1 打开自
  • opencv面试知识点

    文章目录 一 opencv基础1 OpenCV中cv Mat的深拷贝和浅拷贝问题2 opencv常用数据结构和函数2 1 QImage和Mat之间的转换 3 颜色空间 RGB HSV4 基本图形的绘制 二 opencv xff08 core
  • VSCode 整理格式快捷键

    Shift 43 Alt 43 f
  • 【情人节特辑】相机也成双——直观理解对极几何中的四个重要矩阵(外参矩阵、内参矩阵、基本矩阵、本质矩阵)

    祁子禹 引言 在奔逸不羁的童年 xff0c 笔者对理科知识的好奇无际无边 某天曾在外婆家的煤棚子里一通乱翻 xff0c 缴获了大舅学生时代的几何光学课本 xff0c 不料遭遇开幕雷击 xff1a 人的眼球好比照相机 xff0c 我们要为革命