【立体视觉(四)】之极线校正与双目视觉

news2024/11/23 19:18:39

【立体视觉(四)】之极线校正与双目视觉

此为个人学习笔记,在各处借鉴了不少好图好文(参考文献在文末),主要是对相关知识进行梳理,以期形成自己的体系。文字表述东拼西凑,符号公式手动输入,若有错误烦请指出。

一、极线校正

在这里插入图片描述
在前面学习了对极几何和对极约束,通过对极约束,可知对于左视图的一个像素点 p 1 p_1 p1 ,可以计算出右视图中 p 1 p_1 p1 同名点 p 2 p_2 p2 所在的那条极线 l 2 l_2 l2 。这就为我们确定 p 2 p_2 p2 坐标大大减少了搜索空间,如果对于左视图的每个待匹配像素,都去计算它对应的那条极线,在待匹配像素很多的时候,可想而知计算量会非常大。

通过观察可以发现:极线 l 1 l_1 l1 和极线 l 2 l_2 l2 (可以称极线 l 1 l_1 l1 和极线 l 2 l_2 l2 为一个极线对)都在同一极平面上,也就是说极线 l 1 l_1 l1 和极线 l 2 l_2 l2 上的像素都满足同一个对极约束公式。当极平面绕基线 O 1 O 2 O_1O_2 O1O2 转动时,所得的极线可以涵盖视图上所有像素点。

如果将极线上的像素重新排列,把同一极线上的像素排列到同一行,那么我们就可以通过行号来确定同一极线对的像素,此时左视图像素点 p 1 p_1 p1 的同名点 p 2 p_2 p2 一定在相同行号的那一行像素中,它们只有列坐标差异,称之为视差 d = c o l ( p 1 ) − c o l ( p 2 ) d=col(p_1)-col(p_2) d=col(p1)col(p2) )。

这就是极线校正做的工作,更专业的解释:极线校正就是经过一系列变换把双目立体视觉几何结构校正为平视双目标准几何结构,即左右相机的成像平面在同一个平面上且是垂直对齐的。

在这里插入图片描述

一)Fusiello校正法

极线校正使得稠密匹配变得简单许多。极线校正方法可以分为非定标校正和定标校正。非定标校正是指不需要相机标定的
内外参数即可进行校正如Hartley 算法,定标校正则是利用预先得到的相机内外参数完成校正,如Fusiello 法、Bouguet 法。这里先学习一下简单易懂易实现的Fusiello校正法。

极线校正就是经过一系列变换(旋转相机和重新定义像平面)把双目立体视觉几何结构校正为平视双目标准几何结构。本质是重新定义投影矩阵 M = K [ R ∣ t ] = K [ R ∣ − − R O ] M=K[R|t]=K[R|--RO] M=K[Rt]=K[RRO],其中矩阵 K 、 R 、 O K、R、O KRO 分别表示相机的内参矩阵、旋转矩阵和相机光心坐标。

Fusiello校正法通过旋转相机①重新定义旋转矩阵 R n R_n Rn,让新的像平面平行于相机基线。②重新定义像平面内参 K n K_n Kn,使双相机有同样的内参,保证左右像平面共面。(这里的下标 “ n _n n” 取 “new” 之意,下同。)

在这里插入图片描述
如上图所示,图像坐标系 u u u 轴与基线 O 1 O 2 O_1O_2 O1O2 平行,左右影像对应的焦距 f f f 和主点坐标相同。

1. 转换矩阵计算

1)计算旋转矩阵 R n R_n Rn

旋转相机使左右像平面互相平行且均平行于相机基线,其本质在于重新定义相机坐标系,Fusiello 方法所定义的新坐标系如下:

(1)为了保证像平面与相机基线平行,新相机坐标系的X 轴需与基线平行,即 X X X 轴的基向量如下式所示:
r x = ( O 1 − O 2 ) / ∣ ∣ O 1 − O 2 ∣ ∣ r_x=(O_1-O_2)/||O_1-O_2|| rx=(O1O2)/∣∣O1O2∣∣
(2)为了使纠正后的影像范围与原影像范围尽可能保持一致,新相机坐标系的Y 轴采用与原相机坐标系的 Y Y Y 轴相近的方向,即 Y Y Y 轴的基向量如下式所示:
r y = R Z × r x r_y=R_Z \times r_x ry=RZ×rx

R z R_z Rz 表示远相机坐标系的 Z Z Z 轴。
(3)新相机坐标系的Z 轴分别与 X X X 轴、 Y Y Y 轴正交,即 Z Z Z 轴的基向量如下式所示:
r z = r x × r y r_z=r_x \times r_y rz=rx×ry
(4)根据新相机坐标系的三个基向量获得最后的旋转矩阵 R n R_n Rn

R n = [ r x T r y T r z T ] R_n=\begin{bmatrix} r_x^T \\r_y^T\\r_z^T \end{bmatrix} Rn= rxTryTrzT

2)计算内参矩阵 K n K_n Kn

获得旋转矩阵后,可依此对左右像平面进行旋转,旋转后的像平面互相平行且均平行于基线,但是相机焦距的不同会导致两平面不共面,因此需要统一相机参数,即计算统一的新内参矩阵 K n K_n Kn。为了尽可能保证新内参矩阵与原内参矩阵保持一致,新内参矩阵使用左右影像原内参矩阵的平均数,并将其中的倾斜因子设定为0,即:

K n = ( K l + K r ) / 2 K_n=(K_l+K_r)/2 Kn=(Kl+Kr)/2
将计算获得的 R n R_n Rn K n K_n Kn 进行组合, 获得核线纠正后新的投影矩阵:
M n = K n [ R n ∣ − R n O ] M_n=K_n[R_n|-R_nO] Mn=Kn[RnRnO]

3)计算转换矩阵 T T T

接下来就是校正过程,使用转换矩阵 T T T 来表达了某一像素在核线纠正前后图像像素坐标之间的转换关系,可以根据核线纠正前后的投影矩阵 M M M M n M_n Mn 计算获得,具体方法如下:
假设空间中的一点 P P P ,该点在新旧投影矩阵下的表达式为:
{ λ p = M P = [ Q ∣ − Q O ] P λ n p n = M n P = [ Q n ∣ − Q n O ] P Q = K P Q n = K n R n \begin{cases} \lambda p=MP=[Q|-QO]P\\ \lambda_n p_n=M_nP=[Q_n|-Q_nO]P \\ Q=KP\\ Q_n=K_nR_n \\ \end{cases} λp=MP=[QQO]Pλnpn=MnP=[QnQnO]PQ=KPQn=KnRn

其中, P P P 表示点 P P P 的齐次坐标表达式, p n p_n pn p p p 表示点 P P P 投影到新旧像平面下的齐次坐标,由于该方程为齐次方程,将系数 λ \lambda λ λ n \lambda_n λn 均设置为1,并将上式展开可得:
{ p = Q ( P − O ) p n = Q n ( P − O ) \begin{cases} p=Q(P-O)\\ p_n=Q_n(P-O)\\ \end{cases} {p=Q(PO)pn=Qn(PO)
根据旧影像坐标 p p p 和转换矩阵 T T T 计算新影像坐标 p n p_n pn 的公式为: p n = T p p_n= Tp pn=Tp ,即 Q n ( P − O ) = T Q ( P − O ) Q_n(P-O)= TQ(P-O) Qn(PO)=TQ(PO),由此可得转换矩阵 T T T
T = Q n Q − 1 T=Q_nQ^{-1} T=QnQ1
转换矩阵表征核线纠正前后同一像素之间的转换关系,根据原影像中的某一像素的图像像素坐标和转换矩阵,可以计算获得其在核线影像中对应的图像像素。
对于两个相机,根据公式可以计算各自的转换矩阵 T 1 、 T 2 T_1、T_2 T1T2

2. 核线影像生成

计算获得转换矩阵 T T T 后,可以得到某一像素点 p p p 核线纠正前后的图像坐标关系式为:
λ p = λ [ x y 1 ] = T − 1 [ x n y n 1 ] = T − 1 p n \lambda p=\lambda \begin{bmatrix} x\\y\\1 \end{bmatrix}=T^{-1} \begin{bmatrix} x_n\\y_n\\1 \end{bmatrix}=T^{-1}p_n λp=λ xy1 =T1 xnyn1 =T1pn

生成最终的核线影像具体步骤如下:首先建立一个新的影像,影像尺寸与原影像保持一致,遍历影像中的每一个像素点,根据上式计算其在影像中对应的像素坐标,并采用该像素的灰度值为其赋值。由于该坐标不一定为整数,因此需要进行灰度内插(常用双线性插值)。若影像为多波段(通道)影像,则分别对各波段(通道)进行内插即可。

在这里插入图片描述

二、双目视觉

这里简要介绍一下双目视觉。双目视觉是模拟人类视觉原理,使用计算机被动感知距离的方法。从两个或者多个点观察一个物体,获取在不同视角下的图像,根据图像之间像素的匹配关系,通过三角测量原理计算出像素之间的偏移来获取物体的三维信息。
在这里插入图片描述

利用双目视觉(相机)三维重建(估计深度)步骤如下:

  1. 双目标定
  2. 双目校正
  3. 双目匹配

双目标定是为了获取两个相机的内参(焦距,图像中心,畸变系数等)和外参(R(旋转)矩阵T(平移)矩阵。标定相关内容已经在上一文中学习了。注意双相机标定时,其中一台相机(一般为右相机)的外参是需要相对于另一台相机(左相机)的相对外参。

双目校正就是畸变校正加上核线校正(畸变校正在核线校正前)。

双目匹配(立体匹配)是双目深度估计的核心部分,即将左右相机图像上的对应点匹配起来,由此计算视差,得到视差图之后,可以利用相机标定得到的外参将视差值转换成深度值,从而获取目标场景的点云信息以进行场景的三维重建(这部分内容很多,后面学习)。


参考:
[1] Stereo vision: Algorithms and applications
[2] 李晟昊. 基于SURF约束的影像半全局密集匹配方法研究与应用[D].中国矿业大学,2022
[3] 立体视觉入门指南(6):对级约束与Fusiello法极线校正
[4] Epipolar Rectification

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

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

相关文章

css基础知识五:CSS中,有哪些方式可以隐藏页面元素?区别?

一、前言 在平常的样式排版中,我们经常遇到将某个模块隐藏的场景 通过css隐藏元素的方法有很多种,它们看起来实现的效果是一致的 但实际上每一种方法都有一丝轻微的不同,这些不同决定了在一些特定场合下使用哪一种方法 二、实现方式 通过…

【IC设计】ICC1 workshop lab guide 学习笔记——Lab 2 Design Planning Task1-4

文章目录 Lab 2 Design Planning2.1 Load the Design2.2 Initialize the Floorplan2.3 Preplace the Macros Connected to I/O Pads2.4 Perform Virtual Flat Placement Lab 2 Design Planning 2.1 Load the Design 进入lab2_dp目录并打开icc_shell,打开orca_lib.…

雪花去噪算法学习记录(一)之基础知识

在进行实验过程中,需要完成对雪天图像的处理,其中一个主要操作为去雪。相较于去雾,去雨模型,去雪模型相对较少,因此在研究时所能够借鉴的资料有限,这对我们的研究造成了一定困扰。 模型算法 DesnowNet网络…

[VPN]华为SecoClient客户端Linux使用

准备 安装环境:CentOS 下载安装包: # wget http://www.corem.com.cn/sites/default/files/tools/secoclient/secoclient-linux-64-7.0.2.26.run 安装 在root用户下,执行: # chmod x secoclient-linux-64-7.0.2.26.run # ./secoc…

瞎搞!你真的懂什么是ERP、中台、低代码吗?

企业数字化领域从来都不缺新概念 从制造资源计划到中台,企业MRP报表数字还没对齐,就要忙着“去烟囱”化; 从中台到低代码,企业“数据孤岛”还没打通,又要忙着“赋能数字化能力”给业务人员了。 这一来二去,…

已有仓库,上传代码,如果你是先写代码,想上传git上你可以这样操作

已有仓库,上传代码,如果你是先写代码,想上传git上你可以这样操作 第一步:初始化 git git init 第二步:添加文件 git add * 第三步:提交文件 git commit -m "完整项目可直接下载使用" 第四步:配置…

【MySql】MySql索引的操作

文章目录 索引结构问题聚簇索引与非聚簇索引索引操作创建主键索引唯一索引创建普通索引创建全文索引创建删除索引查询索引索引创建原则 索引结构问题 InnoDB 在建立索引结构来管理数据的时候,其他数据结构为何不行 链表:线性遍历,在效率上是不合适的 二叉搜索树&am…

如何用Jmeter提取和引用Token

1.执行获取token接口 在结果树这里,使用$符号提取token值。 $根节点,$.data.token表示提取根节点下的data节点下的token节点的值。 2.使用json提取器,提取token 变量路径就是把在结果树提取的路径写上。 3.使用BeanShell取样器或者BeanShell后…

在 Navicat Premium 中管理 MySQL 用户 | 第 2 部分:创建新用户

第 2 部分:创建新用户 第 2 部分:创建新用户 第 1 部分 中,我们学习了如何使用 Navicat Premium 用户管理工具保护 MySQL 的 root 帐号。本篇文章将集中介绍如何设置新用户的帐号详细信息、帐号限制和 SSL 设置。如果你想边学边用&#xff1…

做好用户体验设计 关键看5个方面

用户来了就走,用户吐槽不好用,用户留不住,好的功能没人用,这到底是怎么回事?问题关键在于好的用户体验设计,而做好用户体验设计,关键看5个方面: 1、是否有用 我们需要考量产品。对用…

如何用数字人技术让课堂活起来?番职院和3DCAT实时云渲染给出答案

2023年4月20日,广州市第二届智慧教育成果巡展活动在番禺职业技术学院(下文简称番职院)举行,本次活动的主题是智能AI助教—让课堂活起来。 活动现场,瑞云科技受邀展示了其自主研发的瑞云数字人课堂互动教学解决方案。数…

实时监控Active Directory用户登录操作

用户登录到其域计算机是任何企业中发生的日常活动。一开始,这可能看起来是一个简单的Active Directory事件,但分配了不同角色的管理员可以将这些有价值的数据用于各种审计,合规性和运营需求。组织需要审核“AD 用户登录日志”的详细信息&…

JavaWeb学习路线(5)——MyBatis

准备工作:JDBC 概念: JDBC(Java DataBase Connectivity),就是使用Java语言操作关系型数据库的一套API。JDBC使用数据库的五大步骤 //步骤一:注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"…

手机App弹窗的常用测试点

手机App弹窗是目前流行的一种内容展示形式,根据内容性质可以划分为消息、通知、广告、营销等等,展现形式也比较多变,刚上手测试特容易手忙脚乱,为了帮助新人能够快速入门,笔者在此将弹窗常见的测试点一一进行罗列&…

「网络编程」第二讲:网络编程socket套接字(三)_ 简单TCP网络通信程序的实现

「前言」文章是关于网络编程的socket套接字方面的,上一篇是网络编程socket套接字(二),下面开始讲解! 「归属专栏」网络编程 「笔者」枫叶先生(fy) 「座右铭」前行路上修真我 「枫叶先生有点文青病」「每篇一句」 I do…

maven-mvnd搞起来

maven-mvnd是Apache Maven团队借鉴了Gradle和Takari的优点,衍生出来的更快的构建工具,maven的强化版! maven-mvnd 在设计上,使用一个或多个守护进程来构建服务,以此来达到并行的目的!同时,mave…

FreeRTOS 创建任务

例子:创建一个任务,并在任务里面翻转LED 灯 1. 函数原型 BaseType_t xTaskCreate(TaskFunction_t pxTaskCode,const char * const pcName,const uint16_t usStackDepth,void * const pvParameters,UBaseType_t uxPriority,TaskHandle_t * const pxCreat…

STM32的定时器详解(嵌入式学习)

STM32的定时器详解 0. 前言1. Systick定时器概念工作原理时钟基准Systick练习 2. HAL_Delay函数分析3. 定时器基本概念定时器分类定时器组成计数器自动重装寄存器预分频器 定时器计数原理定时器练习 4. 软件定时器概念设计思想代码 0. 前言 想要了解STM32的时钟系统 点击这里跳…

【数据分享】1929-2022年全球站点的逐日平均风速数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 对于具体到监测站点的气象数据,之前我们分享过1929-2022年全球气象…

考上了!成为图技术大师的第一步!

好消息!! 自创邻科技GBCA课程开设以来 截至6月20日 已有近20名学员通过考试 获得GBCA认证证书! 距离成为图技术认证专家 跨出关键一步! 前不久,创邻科技为了让更多图技术爱好者能够快速了解、上手图数据库&#xff0c…