【计算机视觉】3D视觉

文章目录

我的《计算机视觉》系列参考UC Berkeley的CS180课程,PPT可以在课程主页看到。

一、基本问题

我们的最终目标是根据一系列图像构建出整个3D世界。显然,仅凭一张图像是不够的,因为不同大小的事物放在不同的距离拍出来的图像可能是一模一样的。因此,我们需要至少两张图片来理解深度。人眼就是根据双眼所见的细微差别经过大脑处理后感知深度的。

在多视角几何中,我们需要考虑下面几个问题:

  1. 结构:物体的真实3D坐标是多少?
  2. 对应关系:给定一张图片中的一个点,它在其他图片中对应哪一个点?
  3. 运动:给定两张或多张图片的对应点,这些图片之间的相对相机参数(平移、旋转)是多少?

“对应关系”和“运动”是先有鸡还是先有蛋的关系,知道一个就可以推出另一个。

二、三个坐标系

我们需要考虑三个坐标系:

  1. 世界坐标系;
  2. 相机坐标系;
  3. 图像坐标系。

他们之间的转换关系如下图所示。

下面我们用数学语言描述这些转换关系。

我们有世界坐标 X w = [ x w y w z w ] \boldsymbol{X}_w=\begin{bmatrix}x_w\\y_w\\z_w\\\end{bmatrix} Xw= xwywzw ,相机坐标 X c = [ x c y c z c ] \boldsymbol{X}_c=\begin{bmatrix}x_c\\y_c\\z_c\\\end{bmatrix} Xc= xcyczc (原点在光圈处),以及图像坐标 x i = [ x i y i ] \boldsymbol{x}_i=\begin{bmatrix}x_i\\y_i\end{bmatrix} xi=[xiyi]。从 X w \boldsymbol{X}_w Xw X c \boldsymbol{X}_c Xc的转换是3D到3D的坐标变换,从 X c \boldsymbol{X}_c Xc x i \boldsymbol{x}_i xi的转换是3D到2D的投影。

X w \boldsymbol{X}_w Xw X c \boldsymbol{X}_c Xc的转换

X w \boldsymbol{X}_w Xw X c \boldsymbol{X}_c Xc的转换是3D坐标到3D坐标的平移+旋转。一旦涉及平移,就必须使用齐次坐标(homogeneous coordinates)了——需要加一维。平移矩阵是一个 3 × 3 3\times 3 3×3的正交矩阵,向量 t \boldsymbol{t} t是一个3维的平移向量。图中的Extrinsic Matrix是两个操作的结合,它被称为相机的外参。外参共有6个自由度:3个平移自由度+3个旋转自由度(围绕各轴分别旋转)。

记Extrinsic Matrix为 T w 2 c T_{w2c} Tw2c。已知 X w \boldsymbol{X}_w Xw,可以通过 X c = T w 2 c X w \boldsymbol{X}_c=T_{w2c}\boldsymbol{X}_w Xc=Tw2cXw [ x c w c z c ] = R [ x w y w z w ] + t \begin{bmatrix}x_c\\w_c\\z_c\end{bmatrix}=R\begin{bmatrix}x_w\\y_w\\z_w\end{bmatrix}+\boldsymbol{t} xcwczc =R xwywzw +t来计算 X c \boldsymbol{X}_c Xc。已知 X c \boldsymbol{X}_c Xc,也可以通过 X w = T w 2 c − 1 X c \boldsymbol{X}_w=T_{w2c}^{-1}\boldsymbol{X}_c Xw=Tw2c1Xc [ x w y w z w ] = R − 1 ( [ x c w c z c ] − t ) \begin{bmatrix}x_w\\y_w\\z_w\end{bmatrix}=R^{-1}\left(\begin{bmatrix}x_c\\w_c\\z_c\end{bmatrix}-\boldsymbol{t}\right) xwywzw =R1 xcwczc t 来计算 X c \boldsymbol{X}_c Xc

X c \boldsymbol{X}_c Xc x i \boldsymbol{x}_i xi的转换

这里的情况稍复杂一些,不仅涉及相机坐标到像平面坐标的投影,还涉及到像平面坐标和最终图像坐标的对应关系。

对于相机坐标到像平面坐标的投影,我们在上一篇文章讲针孔相机的时候已经推过一个式子,这里我们就不必考虑负号了,直接写出 x i = f x c z c y i = f y c z c x_i=f\cfrac{x_c}{z_c}\\ y_i=f\cfrac{y_c}{z_c} xi=fzcxcyi=fzcyc这里假设相机坐标系的 z z z轴和像平面垂直。

此外还有像平面到图像传感器(即图像本身)的对应关系。假设像平面的度量单位是毫米,图像的度量单位是像素,那么就存在这两种单位之间的转化关系;有时水平和竖直方向上像素密度还不一样(横纵比不是1:1),所以需要两个值 m x , m y m_x,m_y mx,my来描述这种密度。像平面的原点往往对应图像的中心,即 ( 0 , 0 ) (0,0) (0,0)不一定对应 ( 0 , 0 ) (0,0) (0,0),所以还需要有一个平移 ( o x , o y ) (o_x,o_y) (ox,oy)。设图像的坐标(单位:像素)为 [ u i v i ] \begin{bmatrix}u_i\\v_i\end{bmatrix} [uivi],则 u i = m x x i + o x = f x x c z c + o x v i = m y y i + o y = f y y c z c + o y u_i=m_x x_i+o_x=f_x \frac{x_c}{z_c}+o_x\\ v_i=m_y y_i+o_y=f_y \frac{y_c}{z_c}+o_y ui=mxxi+ox=fxzcxc+oxvi=myyi+oy=fyzcyc+oy其中 f x = m x f f_x=m_x f fx=mxf f y = m y f f_y=m_y f fy=myf。我们想要把这个关系表示成矩阵乘法,但是矩阵乘法无法描述除法,所以又要用到齐次坐标。我们知道,齐次坐标 ( x , y , w ) T (x,y,w)^T (x,y,w)T等价于二维坐标 ( x w , y w ) T \left(\cfrac xw, \cfrac yw\right)^T (wx,wy)T,所以我们可以用齐次坐标解决除法的问题。设 ( u i , v i ) T ≡ ( u ~ i , v ~ i , w ~ i ) T (u_i,v_i)^T\equiv (\tilde u_i, \tilde v_i, \tilde w_i)^T (ui,vi)T(u~i,v~i,w~i)T ≡ \equiv 代表等价关系),我们只需把 w ~ i \tilde w_i w~i设置成 z c z_c zc u ~ i \tilde u_i u~i设置成 f x x c + o x z c f_x x_c+o_x z_c fxxc+oxzc v ~ i \tilde v_i v~i设置成 f y y c + o y z c f_y y_c+o_y z_c fyyc+oyzc即可。这样我们就得到了以下矩阵: [ u i v i ] ≡ [ u ~ i v ~ i w ~ i ] = [ f x 0 o x 0 0 f y o y 0 0 0 1 0 ] [ x c y c z c 1 ] \begin{bmatrix}u_i\\v_i\end{bmatrix}\equiv\begin{bmatrix}\tilde u_i\\\tilde v_i\\\tilde w_i\end{bmatrix}=\begin{bmatrix}f_x&0&o_x&0\\0&f_y&o_y&0\\0&0&1&0\end{bmatrix}\begin{bmatrix}x_c\\y_c\\z_c\\1\end{bmatrix} [uivi] u~iv~iw~i = fx000fy0oxoy1000 xcyczc1 如果像素不是正方形而是平行四边形,还得加一个倾斜变换(skew) s s s K = [ f x s o x 0 0 f y o y 0 0 0 1 0 ] K=\begin{bmatrix}f_x&s&o_x&0\\0&f_y&o_y&0\\0&0&1&0\end{bmatrix} K= fx00sfy0oxoy1000 这里的 K K K就是Intrinsic Matrix,他被称为相机的内参。这样,内参 K K K就有5个自由度: f x , f y , o x , o y , s f_x,f_y,o_x,o_y,s fx,fy,ox,oy,s

投影矩阵

把各种变换汇总在一起,就形成了投影矩阵(projection matrix)。 [ u i v i ] ≡ [ u ~ i v ~ i w ~ i ] = [ f x 0 o x 0 0 f y o y 0 0 0 1 0 ] [ R 3 × 3 t 3 × 1 0 1 × 3 1 ] ⏟ 3 × 4 投影矩阵 [ x w y w z w 1 ] \begin{bmatrix}u_i\\v_i\end{bmatrix}\equiv\begin{bmatrix}\tilde u_i\\\tilde v_i\\\tilde w_i\end{bmatrix}=\underset{3\times 4\text{投影矩阵}}{\underbrace{\begin{bmatrix}f_x&0&o_x&0\\0&f_y&o_y&0\\0&0&1&0\end{bmatrix}\begin{bmatrix}R_{3\times 3}&\boldsymbol{t}_{3\times 1}\\\boldsymbol{0}_{1\times 3}&1\end{bmatrix}}}\begin{bmatrix}x_w\\y_w\\z_w\\1\end{bmatrix} [uivi] u~iv~iw~i =3×4投影矩阵 fx000fy0oxoy1000 [R3×301×3t3×11] xwywzw1 投影矩阵共有5+6=11个自由度。

尺度模糊问题

还有一个问题:如果我们把整个世界(包括相机)都放大很多倍,那么拍出来的照片仍然是一模一样的。想要从照片重建世界并且要有精确的尺度,就必须知道世界中某个物体的大小(例如图中的冲浪板是2.1m)。这也就解释了为什么投影矩阵有12个元素但是只有11个自由度。

三、相机标定

那我们如何求得相机的内外参呢?这时候就需要用到相机标定(camera calibration)。基本思路是知道世界中一些物体的3D坐标以及它们在图片上的坐标,通过线性回归(最小二乘法)拟合出投影矩阵。

虽然是拟合矩阵,但也可以转化为一般的多元线性回归问题:

用最小二乘法就可以求出投影矩阵了。知道了投影矩阵,能不能分别求出内外参呢?答案是可以的。注意到内参 K K K只有前三列有非零元,所以令前三列为 U U U,将 K K K分块为 K = [ U 3 × 3 ∣ 0 3 × 1 ] K=[U_{3\times 3}|\boldsymbol{0}_{3\times 1}] K=[U3×303×1]。这样再和外参 [ R 3 × 3 t 3 × 1 0 1 × 3 1 ] \begin{bmatrix}R_{3\times 3}&\boldsymbol{t}_{3\times 1}\\\boldsymbol{0}_{1\times 3}&1\end{bmatrix} [R3×301×3t3×11]相乘就得到了 U [ R ∣ t ] + 0 [ 0 ∣ 1 ] = U [ R ∣ t ] U[R|\boldsymbol{t}]+\boldsymbol{0}[\boldsymbol{0}|1]=U[R|\boldsymbol{t}] U[Rt]+0[0∣1]=U[Rt]。注意 R R R是一个正交矩阵, U U U是一个上三角矩阵,所以可以对投影矩阵的前三列进行QR分解(用格拉姆-施密特正交化方法就可以完成),从而求得 U U U R R R,再对投影矩阵的第四列左乘 U − 1 U^{-1} U1即可得到 t \boldsymbol{t} t

四、立体视觉

X c \boldsymbol{X}_c Xc x i \boldsymbol{x}_i xi,可以用内参矩阵 K K K乘以 X c \boldsymbol{X}_c Xc算出来。但是反着来呢?知道图像上的点,能不能知道它在相机坐标系对应哪个点呢?不能,因为只知道两个坐标( u i , v i u_i,v_i ui,vi),是不能求出三个坐标的。相机坐标系里一条直线上的所有点都对应像平面上的一个点。

通过图中的公式可以看出,从2D到3D只能得到一条直线,该直线可以表达为关于 z z z的参数方程,但是 z z z可以取任意正数。

那么怎么得到深度 z z z的确切值呢?这时候就需要两张或以上的照片了。人眼的工作方式就是如此。我们先考虑最简单的情况:拍摄两张照片的两个相机光轴是平行的(相当于两个相机的像平面共面)。知道了相机之间的距离,相机的焦距,以及景物的同一个点分别对应在两张照片上的坐标,就可以用相似三角形求解出深度 z z z了:

也就是说,相机移动一定距离的情况下景物在照片中移动距离的多少可以为景物的深度提供信息。移动的越多,说明景物离相机越近;反之越远。比如开车时看见路边的树在动,但是太阳却不动。深度与移动的距离成反比。

那么我们怎么自动求出景物在图片中移动的距离呢?也就是说,给定一张图片中的一点,如何求出它在另一张图片中对应哪个点呢?此时我们不知道景物的深度,但景物在第一张图片中的坐标使得我们能够确定景物在某一条直线上。景物在另一个相机(眼睛)的像平面上的坐标是由 该相机的投影中心到景物的射线 与 其像平面 的交点决定的。假设从第一个相机的投影中心到到景物的射线为 l 1 l_1 l1(左图中左边的黄线),第二个相机……的射线为 l 2 l_2 l2(左图中右边的黄线),两个相机/眼睛投影中心之间的直线为 l 3 l_3 l3,则 l 2 l_2 l2 l 1 l_1 l1 l 3 l_3 l3都有交点,说明 l 2 l_2 l2在由 l 1 l_1 l1 l 3 l_3 l3确定的平面 P P P上。不论景物深度如何,从第二个相机到景物的射线(图中的多条蓝线)与第二个相机像平面的交点总是在平面 P P P上,也就是在平面 P P P和像平面的交线上。因此景物在第二张图片中可能出现的位置一定是一条水平的直线。

因此我们只需要在第二张图片的那一条水平线上搜索就可以了( y y y与第一张图片一致,只枚举 x x x)。我们可以考虑一个滑动的小窗口,其中心在那条水平线上,与第一张图片景物对应点周围的窗口匹配,匹配度用归一化互相关(Normalized Cross Correlationn, NCC)来计算。我们希望窗口足够大,使得亮度有明显的变化;我们也希望窗口足够小,使得窗口中尽量不包含多个深度的景物。不过,这种方法能够奏效,景物必须有不重复的纹理(白墙、花纹重复的地毯就是大坑);而且近大远小也是一种阻碍,在它的影响下窗口在第二张图片中会有所变形。

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

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

相关文章

【1.2】神经网络:神经元与激活函数

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏: 神经网络(随缘更新) ✨特色…

基于nodejs+vue食力派网上订餐系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

负载均衡--Haproxy

haproxy 他也是常用的负载均衡软件 nginx 支持四层转发,七层转发 haproxy也可以四层和七层转发 haproxy:法国人开发的威利塔罗在2000年基于C语言开发的一个开源软件 可以支持一万以上的并发请求 高性能的tcp和http负载均衡2.4 1.5.9 haproxy&#…

【Linux】解决缓存锁问题:无法获得锁 /var/lib/dpkg/lock-frontend

今天在运行apt-get update更新软件包后,突然发现安装新的软件出现了这个报错:正在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 1855(unattended-upgr)持有。如图。 这个错误通常是由于其他进程正在…

【Linux】安装与配置虚拟机及虚拟机服务器坏境配置与连接

目录 操作系统介绍 什么是操作系统 常见操作系统 UNIX操作系统 linux操作系统 mac操作系统 嵌入式操作系统 个人版本和服务器版本的区别 安装VMWare虚拟机 VMWare虚拟网卡 ​编辑 配置虚拟网络编辑器 ​编辑 安装配置Windows Server 2012 R2 安装Windows Server 2…

[动态规划] (二) LeetCode 面试题 08.01.三步问题

[动态规划] (二) LeetCode 面试题 08.01.三步问题 文章目录 [动态规划] (二) LeetCode 面试题 08.01.三步问题题意解析解题思路1.状态表示2.状态转移方程3.初始化和填表顺序4.返回值 代码实现总结 面试题 08.01. 三步问题 题意解析 (1) 小孩可以跳1-3阶台阶 (2) 结果很大&…

python实验2 π的计算

π的计算 1. 圆周率的介绍2. BBP公式计算圆周率3. 蒙特卡洛方法计算π 1. 圆周率的介绍 圆周率π自古就是人们计算的问题,π到底是什么,圆的周长与直径的比值或者是面积与半径的平方之比,或者是使sinx0的最小正数x。所以每一种定义每一种理解…

Qt5.15:MinGW64位编译Oracle 19c数据库驱动及代码测试 - 安装时没有选Sources处理办法

文章目录 0 代码仓库1 环境以及条件说明2 准备一:下载Oracle 19c驱动,需要下载两个包,注意分x86和x642.1 32位2.2 64位2.3 新建目录并解压缩2.4 记录路径2.4.1 x86需要的路径2.4.2 x64需要的路径 3 准备二:下载Sources源代码的两种…

策略路由和路由策略

目录 策略路由 路由策略 策略路由和路由策略 策略路由 Step1:配置ACL,匹配流量 acl number 2010 rule 10 permit source 192.168.10.0 0.0.0.255 acl number 2020 rule 10 permit source 192.168.20.0 0.0.0.255 Step2:流分类traffic classifier jiaoxue //匹配…

Navicat for MySQL 视图创建使用方法

创建视图步骤: 点击新建;选择视图;点击视图创建工具;可以在左侧拖拽表到工作区;选择表字段进行连线

​Vue3响应式原理

目录 手动收集依赖通知更新 effect():更改数据后执行,更新依赖该数据的数据(依赖) track()收集依赖的effect()放进dep(set去重) 更新时触发trigger函数通知dep里所有effect()执行…

uniapp 中添加 vconsole

uniapp 中添加 vconsole 一、安装 vconsole npm i vconsole二、使用 vconsole 在项目的 main.js 文件中添加如下内容 // #ifdef H5 // 提交前需要注释 本地调试使用 import * as vconsole from "vconsole"; new vconsole() // 使用 vconsole // #endif三、成功

Ansible简介

环境 控制节点:Ubuntu 22.04Ansible 2.10.8管理节点:CentOS 8 组成 Ansible环境主要由三部分组成: 控制节点(Control node):安装Ansible的节点,在此节点上运行Ansible命令管理节点&#xff…

Android 系统架构

目录 Android 系统架构 1. Android 应用层 2. Android应用框架层 2.1 Activity Manager (活动管理器) 2.2 Window Manager (窗口管理器) 2.3 Content Provider (内容提供器) 2.4 View System(视图系统&a…

Leetcode刷题详解——搜索插入位置

1. 题目链接:35. 搜索插入位置 2. 题目描述: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。…

JVM调优(10)JVM的运行时数据区

一、概述 对于 C C 来说,在内存管理领域,JVM既拥有最高的权利,但是同时他们又是从事最基础工作的劳动人员,因为他们担负着每一个对象从开始到结束的维护责任。而对于Java来说,再虚拟机自动内存管理的帮助下&#xff0…

x210项目重新回顾之十七升级到linux4.19.114 +buildroot2018再讨论

代码参考https://github.com/colourfate/x210_bsp/ 他的是linux_4.10(dtb为 s5pv210-x210..dtb)我打算用linux4.19.114(dtb为 s5pv210-smdkv210.dtb) ,所以修改build.sh ------------------------------------------------------------------------------ 5 M…

STM32 CAN使用

STM32 CAN使用 简介各种通讯接口对比报文总线上的报文信息表示为几种固定的赖类型数据帧列表模式掩码模式配置CAN配置参数位时序 简介 控制器局域网CAN(Controller Area Network)是由德国博世公司为汽车应用而开发的多主机局部网络,用于汽车的监测和控制…

智能水厂运行与调控3D模拟仿真在线展示提高整个系统的协同效应

水厂在生活中的重要性不可忽视。它们提供清洁、安全的水源,满足人们饮用、洗浴、烹饪等基本需求,保障公共卫生,预防疾病传播;同时,水厂也促进经济发展,为工业生产和农业灌溉提供保障,吸引和支持企业的投资和…

phar反序列化学习

PHP反序列化常见的是使用unserilize()进行反序列化,除此之外还有其它的反序列化方法,不需要用到unserilize()。就是用到phar反序列化。 Phar phar文件 Phar是将php文件打包而成的一种压缩文档,类似于Java中的jar包。它有一个特性就是phar文…