Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >小白系列(5)| 计算机视觉:3D立体视觉

小白系列(5)| 计算机视觉:3D立体视觉

作者头像
一点人工一点智能
发布于 2023-09-08 03:28:04
发布于 2023-09-08 03:28:04
4700
举报

作者:DrMax

编辑:东岸因为@一点人工一点智能

01 介绍

本文中,我们将讨论立体视觉,这是一种使用两个或多个摄像机来生成全视场三维测量的机器视觉技术。

02 什么是立体(3D)视觉?

计算机立体视觉是从二维图像中提取三维信息的过程,例如由CCD相机产生的图像。它结合每个视角中物体的相对位置,来融合多个视角的数据。因此,我们在高级驾驶辅助系统和机器人导航等应用中使用立体视觉。

这类似于人类视觉的工作原理。我们大脑同时整合来自两只眼睛的图像,从而产生三维视觉:

尽管每只眼睛只产生二维图像,但人脑可以通过结合两个视角并识别它们之间的差异来感知深度。我们称这种能力为立体视觉。

03 感知深度

假设有左右两个摄像机,它们都产生了场景的二维图像。设

为场景中一个真实世界(三维)物体上的一个点:

为了确定生成的三维图像中

的深度,我们首先在左右两个二维图像中找到与其对应的两个像素点

。我们可以假设我们知道两个摄像机的相对位置。计算系统使用相机之间的相对距离的先验知识,通过三角测量来估计深度

人脑的工作方式也是如此。它感知深度和三维形状的能力被称为立体视觉。

04 计算机系统如何实现立体视觉

我们需要估计每个点的深度,从而从二维图像中生成三维图像。从那里,我们可以确定点的相对深度并得到深度图:

深度图是一种包含了从一个视点分离场景物体表面的数据的图像(或图像通道)。这是在3D计算机图形和计算机视觉中表示场景深度的常见方式。我们可以在上述图像的左下角看到深度图的一个示例。

05 立体视觉的几何基础

对极几何是立体视觉的几何学基础。3D点与它们在2D图像上的投影之间存在多种几何关系。这些关系是基于针孔相机模型开发的。我们假设可以使用这些关系来表示法线。

当一个3D物体在图像中被捕捉(投影)时,它被投影到一个2D(平面)投影空间中。这种所谓的“平面投影”会导致深度的丢失。

两个立体图像之间的视差是物体的表观运动。如果我们闭上一只眼睛,然后迅速睁开,同时保持另一只眼睛闭着,我们会观察到靠近我们的物体移动得很多,而距离我们较远的物体几乎不动。我们将这种现象称为“视差”。

5.1 方向向量

在对极几何中,方向向量是从图像中的一个像素点发出的一个三维向量:

方向向量,顾名思义,是光线从哪个方向到达像素传感器的方向。因此,这条线携带了所有可能成为图像中2D像素候选源的3D点。在上图中,方向向量

起源于点

,它是与场景中的3D点

对应的“左侧”2D像素。

5.2 方向向量的交点

场景中一个3D点的方向向量会在从不同视角拍摄的图像中投射出相应的2D点。因此,一对立体图像将会有从表示3D场景中共同的3D点的2D像素发出的方向向量。方向向量上的所有点都是候选源。由于两个向量只能在一个唯一的点上相交,我们将交点视为源点。

在上图中,左图和右图的方向向量(分别为

)在单个源点

处相交。这个场景中的3D源点是光线从中投射出左图像的像素

和右图像的像素

的点。

5.3 深度计算

我们假设我们知道相机之间的距离,并且相对于物体和相机之间的距离来说,这个距离非常小。在这个假设下,我们可以通过三角测量确定空间中的3D点的位置。深度是在连接两个相机的线上的垂直投影:

上面的图像显示了从连接两个相机的线上的点的实际深度

。让我们注意到线段

和线段

之间的角度并不完全是90度。然而,在现实中,线段

相对于

来说非常小。这导致线段

和线段

之间的角度近似为90度。由于我们通过三角测量确定了

的位置,并且我们知道相对距离

,我们可以使用勾股定理计算深度

由于

相对于

来说非常大,角度

接近于

。长度

几乎相等(用

表示)。同样,长度

也几乎相等(用

表示)。应用勾股定理,我们得到

。解出点

的深度,我们得到:

由于

相对于

来说非常大,深度

接近于

06 计算机立体视觉的数学实现的关键概念

三角测量和视差图是计算机立体视觉所需的工具。在像素级别上,我们使用三角测量从一对立体图像的左右像素点中确定一个3D空间中的点。对于具有数百万像素点的大图像,我们使用视差图。

6.1 计算机视觉中的三角测量

计算机视觉中的三角测量是从其在两个或多个图像上的投影中确定一个3D空间中的点的过程。相机矩阵表示相机从3D场景到2D图像空间的投影函数的参数。三角测量方法的输入是检测到的图像点(

)的齐次坐标以及左右相机的相机矩阵。

三角测量方法的输出是一个以齐次表示的3D点。三角测量方法只是以抽象形式表示计算;在现实中,计算可能相当复杂。一些三角测量技术需要分解为一系列计算阶段,例如奇异值分解或确定多项式的根。闭合形式的连续函数是另一组三角测量技术。

另一类三角测量技术使用迭代参数估计。这意味着各种方法在计算时间和过程复杂性方面可能有所不同。中点法、直接线性变换和本质矩阵是我们用于三角测量的常见数学工具。

6.2 视差图

视差是左右图像之间一个点的投影的水平位移。相反,深度是位于真实3D世界中的点的深度坐标。

要从一对立体图像创建视差图,我们首先必须将左图像中的每个像素与右图像中的相应像素进行匹配。我们计算每对匹配像素之间的距离。我们使用这些距离数据生成一幅称为视差图的强度图像。

要计算视差图,我们必须解决所谓的对应问题。这个任务旨在识别立体图像中的像素对,它们是空间中同一个实际物理点的投影。立体图像的校正可以大大简化这个问题。通过这种转换,匹配点将位于同一水平线上,将2D立体对应问题转化为1D问题。这就是我们打破“维度诅咒”的方式。

块匹配算法是识别相关像素的基本方法。该算法的基础是在第一幅图像中围绕一个点的一个小窗口与第二幅图像中沿着单条水平线排列的几个小块之间的比较。用于窗口匹配的两个主要相似度度量是绝对差值之和(SAD)和平方差之和(SSD)。

视差与深度呈反比关系。我们通过使用相机的几何配置作为输入,将视差图进行三角测量,将其转换为深度图。

07 结论

在本文中,我们了解了当代计算机如何实现立体视觉。我们从立体图像对中得到视差图。然后,我们计算视差图中每对匹配像素之间的距离。知道两个相机的精确位置可以计算深度图。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一点人工一点智能 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何在Redhat7.4的CDH5.15中启用Kerberos
温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。 Fayson的github: https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢 1.文档编写目的 ---- 在前面的文章中,Fayson介绍了《如何在Redhat7.4安装CDH5.15》,这里我们基于这个环境开始安装MIT Kerberos。关于在CDH中启用Kerberos也可以参考之前的文章《如何在CDH集群启用Kerberos》,《如何在Redhat
Fayson
2018/07/12
1K0
如何在CDH6.0.0-beta1中启用Kerberos
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github:https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢 1.文档编写目的 ---- 在前面的文章中,Fayson介绍了《如何在Redhat7.4安装CDH6.0.0_beta1》,这里我们基于这个环境开始安装Kerberos。关于CDH启用Kerberos的文章,前面Fayson也介绍过《如何在CDH集群启用Kerberos》和《如何在Redhat7.3的CDH5
Fayson
2018/07/12
8520
如何在Redhat7.3的CDH5.14中启用Kerberos
在前面的文章中,Fayson介绍了《如何在Redhat7.3安装CDH5.14》,这里我们基于这个环境开始安装MIT Kerberos。前面Fayson也介绍过《如何在CDH集群启用Kerberos》,当时的环境是Redhat6的,大家也可以看看Redhat6和7安装Kerberos有什么区别。
Fayson
2018/03/29
2.7K1
如何在CDH集群启用Kerberos
本文档中将KDC服务安装在Cloudera Manager Server所在服务器上(KDC服务可根据自己需要安装在其他服务器)
Fayson
2018/03/29
6.9K3
如何在CDH集群启用Kerberos
0477-如何在Redhat7.4的CDH5.16.1中启用Kerberos
在前面的文章中,Fayson介绍了《0470-如何在Redhat7.4安装CDH5.16.1》,这里我们基于这个环境开始安装MIT Kerberos。本文Fayson主要介绍如何而在Redhat7.4的CDH5.16.1中启用Kerberos。
Fayson
2018/12/25
9150
0477-如何在Redhat7.4的CDH5.16.1中启用Kerberos
0751-7.0.3-如何在CDP DC7.0.3中启用Kerberos
在前面的文章中,Fayson介绍了《0733-7.0.3-如何在Redhat7.6中安装CDP DC7.0.3》,这里我们基于这个环境开始安装Kerberos。Kerberos是一个用于安全认证的第三方协议,并不是Hadoop专用,你可以将其用于其他系统。它采用了传统的共享秘钥方式,实现了在网络环境下不一定保证安全的环境下,Client和Server之间的通信,适用于Client/Server模型,由MIT开发和实现。而使用CDP DC可以较为轻松的实现洁面后的Kerberos集成,本文Fayson主要介绍如何在Readhat7.2的CDP DC7.0.3环境中启用Kerberos。
Fayson
2020/02/24
1.5K0
0751-7.0.3-如何在CDP DC7.0.3中启用Kerberos
如何将CDH集群的KDC从RedHat7迁移到RedHat6
本篇文章Fayson主要介绍如何将CDH集群中的KDC服务从RedHat7迁移到RedHat6。
Fayson
2018/08/03
5700
如何将CDH集群的KDC从RedHat7迁移到RedHat6
在CDP集群启用Kerberos手册
Kerberos协议主要用于计算机网络的身份鉴别(Authentication), 其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务,即SSO(Single Sign On)。由于在每个Client和Service之间建立了共享密钥,使得该协议具有相当的安全性。
大数据杂货铺
2021/10/09
1.7K0
如何使用java连接Kerberos和非kerberos和kerberos的Spark1.6 ThriftServer
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github: https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢 1.文档编写目的 ---- 前面Fayson介绍了《如何在CDH中启用Spark Thrift》和《如何在Kerberos环境下的CDH集群部署Spark1.6 Thrift及spark-sql客户端》,本篇文章Fayson主要介绍如何使用Java JDBC连接非Kerberos和Kerberos环境下Sp
Fayson
2018/07/11
1.9K0
如何在Kerberos环境下修改启用HA的CDH集群HOSTNAME
Fayson在前面的文章《如何修改Kerberos的CDH集群的HOSTNAME》介绍了修改集群的HOSTNAME,在文章中并未提到集群启用HA的情况,本篇文章Fayson主要介绍在Kerberos环境下启用HA的CDH集群修改HOSTNAME。
Fayson
2018/11/16
6620
如何修改Kerberos的CDH集群的HOSTNAME
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github:https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢 1.文档编写目的 ---- 在集群安装初期由于未规范集群HOSTNAME,带来集群管理的不便,现需要将CDH集群的HOSTNAME统一规范化,在修改HOSTNAME的过程中需要注意什么?本篇文章Fayson主要介绍如何修改Kerberos环境下的CDH集群的HOSTNAME。修改集群所有主机的hostna
Fayson
2018/07/12
1.5K0
如何在CDH启用Kerberos的情况下安装及使用Sentry(一)
本文档主要讲述如何在启用Kerberos的CDH集群中安装配置及使用Sentry。
Fayson
2018/03/29
3.5K2
如何在CDH启用Kerberos的情况下安装及使用Sentry(一)
0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
受前段时间Oracle官宣的从2019年1月之后将不再提供免费的的JDK商业版本的影响,Cloudera开始开发基于OpenJDK的Hadoop平台,参考Fayson之前的文章《Java收费,Hadoop怎么办?》。今年11月29日,Cloudera才发布不久的CDH5.16.1正式提供OpenJDK的支持,参考Fayson之前的文章《0466-CDH5.16.1和CM5.16.1的新功能》和《0486-如何将Kerberos的CDH5.16.1从Oracle JDK 1.8迁移至OpenJDK 1.8》。同时12月19日发布的《0487-CDH6.1的新功能》和《0488-Cloudera Manager6.1的新功能》,也开始支持OpenJDK。本文Fayson主要介绍如何将CDH6.1从Oracle JDK迁移到OpenJDK。
Fayson
2019/11/28
1.1K0
如何配置Kerberos服务的高可用
在前面的文章中Fayson介绍过《如何在CDH集群启用Kerberos》,对于一个启用了Kerberos的正式生产系统,还需要考虑KDC的高可用。而Kerberos服务是支持配置为主备模式的,数据同步是通过kprop服务将主节点的数据同步到备节点。本文主要讲述如何配置Kerberos服务的高可用。
Fayson
2018/03/29
4K1
如何配置Kerberos服务的高可用
[1067]CDH6.3.2之Kerberos安全认证
Kerberos是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。这个词又指麻省理工学院为这个协议开发的一套计算机软件。软件设计上采用客户端/服务器结构,并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证。可以用于防止窃听、防止重放攻击、保护数据完整性等场合,是一种应用对称密钥体制进行密钥管理的系统。
周小董
2021/11/11
1.2K0
[1067]CDH6.3.2之Kerberos安全认证
如何在CDH启用Kerberos的情况下安装及使用Sentry(二)
使用beeline连接HiveServer2,创建columnread角色并授权test表s1列的读权限,将columnread角色授权给fayson_r用户组
Fayson
2018/03/29
3.6K0
如何在CDH启用Kerberos的情况下安装及使用Sentry(二)
如何在Kerberos环境的CDH集群部署Livy
在前面的文章Fayson介绍了《Livy,基于Apache Spark的开源REST服务,加入Cloudera Labs》、《如何编译Livy并在非Kerberos环境的CDH集群中安装》和《如何通过Livy的RESTful API接口向非Kerberos环境的CDH集群提交作业》,本篇文章主要介绍如何在Kerberos环境的CDH集群中部署Livy服务。
Fayson
2018/03/29
3.8K1
如何使用Java API访问HDFS为目录设置配额
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github: https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢 1.文档编写目的 ---- 在开发应用使用Hadoop提供的hadoop-client API来访问HDFS并进行本地调试,本篇文章Fayson主要介绍如何使用Java API访问Kerberos环境下的HDFS并为目录设置配额。 内容概述 1.环境准备 2.Kerberos环境为HDFS目录设置配额 3.
Fayson
2018/07/12
3.7K0
0592-5.16.1-如何配置Kerberos高可用
对于一个启用了Kerberos的正式生产系统,还需要考虑KDC的高可用。而Kerberos服务是支持配置为主备模式的,数据同步是通过kprop服务将主节点的数据同步到备节点。本文主要讲述如何在CDH5.16.1中配置Kerberos服务的高可用。在前面的文章中Fayson介绍过《如何配置Kerberos服务的高可用》,但无论是CDH还是OS版本到较低,本文也主要是为了更新文档。
Fayson
2019/04/28
1.7K0
0592-5.16.1-如何配置Kerberos高可用
如何在Kerberos环境下使用Flume采集Kafka数据写入HBase
在前面的文章Fayson也介绍了一些关于Flume的文章《非Kerberos环境下Kafka数据到Flume进Hive表》、《如何使用Flume准实时建立Solr的全文索引》、《如何在Kerberos环境使用Flume采集Kafka数据并写入HDFS》、《如何使用Flume采集Kafka数据写入Kudu》和《如何使用Flume采集Kafka数据写入HBase》。本篇文章Fayson主要介绍在Kerberos的CDH集群中使用Flume采集Kafka数据写入HBase。 内容概述 1.环境准备 2.配置Fl
Fayson
2018/07/12
1.1K0
推荐阅读
相关推荐
如何在Redhat7.4的CDH5.15中启用Kerberos
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档