IOS-计算机视觉与增强现实-全-

IOS 计算机视觉与增强现实(全)

原文:Computer Vision and Augmented Reality in iOS

协议:CC BY-NC-SA 4.0

一、计算机视觉导论

本章将重点讨论什么是计算机视觉,我们为什么需要它,该技术的发展,它的不同应用,以及它如何用于增强现实。

什么是计算机视觉?

视觉是分析和解释感兴趣的场景和物体的能力。人类视觉已经被研究了数百年,以了解视觉过程是如何工作的。人类视觉过程是理解起来最复杂的过程之一。事实上,直到今天,视觉科学家还没有找到视觉过程如何工作的完整答案。然而,视觉科学家关于人类视觉过程如何开始的发现,以及除此之外的一些发现,激发了计算机科学家开发我们今天所知的计算机视觉。视觉研究人员和科学家描述,视觉过程始于眼睛处理光信号,并将它们转换为场景和图像,供大脑视觉皮层分析和解释。20 世纪 50 年代视觉研究的突破发现,视觉过程始于检测图像的简单结构和边缘,随着视觉信息变得更加复杂,这有助于建立更详细的解释。突破性的视觉研究激发了计算机科学家开发预处理计算机视觉算法,我们今天使用它来启动每个计算机视觉任务。与今天的典型计算机相比,人脑的计算速度明显低于计算机的计算速度,然而人脑执行视觉任务的速度比任何计算机都快得多,也明显好得多。因此,研究人员开发计算机视觉算法的灵感一直来自于视觉在自然界的进化。

计算机视觉是研究和开发使计算机能够处理、分析和解释数字图像的技术的领域。今天,计算机视觉应用可以在多个行业中找到,例如工业机器人、医学成像、监控等等。所有这些应用都有一个主要任务,那就是处理、分析和解释数字图像的内容,以执行与行业需求相关的任务,这在本书的其余部分将被称为视觉任务。视觉任务是需要处理、分析或解释数字图像和视频内容的任何类型的任务。作为参考,视频是一系列数字图像,通常由每秒 30–60 幅数字图像组成,也称为帧。

计算机经常显示数字图像。当一幅数字图像作为输入输入给计算机时,计算机将其作为二维像素阵列读取;也可以定义为二维矩阵。一个图像矩阵由 M 列和 N 行组成。以像素为单位的图像大小可以通过求 M 列N 行 ( M × N )的乘积来确定,其中 M 是图像的宽度, N 是图像的高度。像素位置通过其在矩阵中的 xy 坐标( x,y 来识别。计算机图形和数字图像中的坐标系与典型的笛卡尔坐标系略有不同;数字图像中的原点(0,0)从图像的左上角开始。因此 x 从左到右递增, y 从上到下递增(见图 1-1 )。

img/496594_1_En_1_Fig1_HTML.jpg

图 1-1

数字图像坐标系

在灰度数字图像中,像素值可以用各种格式表示;然而,最常用的格式是 8 位(1 字节)无符号整数,范围从 0 到 255,其中 0 为黑色,255 为白色。0 到 255 之间的任何值定义不同的灰度(见图 1-2 )。

img/496594_1_En_1_Fig2_HTML.jpg

图 1-2

转换为矩阵的灰度图像

图 1-2 展示了一幅 16 × 16 的灰度图像,该图像被转换成以 8 位无符号整数表示的像素值。

在彩色数字图像中,像素值必须用三种颜色指定,即红色、绿色和蓝色,这三种颜色代表 RGB 颜色空间。因此,像素值被表示为三个数字的向量,其中每个数字的范围从 0 到 255。随着数字的增加,每种颜色的亮度增加,也称为颜色强度。例如,如果给定的像素值是(255,255,255),这意味着红色、绿色和蓝色强度(或亮度)被设置为它们的最高值,这定义了一个白色像素(参见图 1-3 )。

img/496594_1_En_1_Fig3_HTML.jpg

图 1-3

RGB 颜色空间和颜色强度示例

在图 1-3 中,你可以看到颜色强度如何影响最终的颜色。颜色强度越高,产生的颜色越亮。

虽然呈现数字图像似乎是一项计算机友好的任务,但计算机视觉需要更复杂的处理来解释、分析或操纵数字图像的内容。计算机视觉由两个核心应用组成:操纵数字图像处理数字图像以执行视觉任务。处理数字图像包括图像增强、恢复、重建和压缩。图像增强和恢复通常用于改善失真图像的质量。图像重建利用来自不同角度的一组二维图像来重建三维图像。然而,一些使用深度学习的实现试图从单个二维图像重建三维图像。图像压缩用于将图像转换为更有效的表示形式,以最大限度地减少存储空间的使用。另一方面,处理数字图像可以使用一些图像处理技术来执行匹配、描述或识别图像内容的视觉任务。匹配和描述图像内容的过程主要依赖于将图像分割成更小的部分,并将分割部分与其他模板图像进行比较,并测量分割部分与模板图像之间的关系(参见图 1-4 )。

img/496594_1_En_1_Fig4_HTML.jpg

图像学分:racol _ studio/free pik。图 1-4

模板匹配抽象示例

图 1-4 展示了一个模板匹配算法的样本结果。

计算机视觉工作原理概述

为了让计算机执行视觉任务,例如人脸检测,它需要执行几个较小的任务才能达到目标任务。例如,为了执行视觉任务,计算机通常必须执行各种数字图像预处理技术,例如灰度处理、边缘增强和检测、噪声去除、图像恢复、插值和图像分割。图像预处理是每项视觉任务的第一步,它对视觉任务的成功与否起着至关重要的作用。预处理的目的是提取给定图像中有价值的部分,并去除不想要的失真。有价值的部分有助于开发给定图像中像素、形状和表面的有用描述。正如我们前面提到的,像素值由 1 字节的整数(当它在灰度图像中时)或表示 RGB 颜色空间的整数向量(当它在彩色图像中时)定义;并且每个像素值具有代表颜色亮度的不同强度等级。给定图像中强度的变化提供了关于图像中形状和表面结构的线索。

在预处理阶段,我们试图在不知道图像内容的情况下,使用诸如噪声去除、边缘增强和图像分割等技术来提取这些信息。噪声去除是平滑图像以减少和消除不想要的噪声/失真的过程。然而,有时噪声去除技术最终会模糊图像;在这种情况下,边缘增强技术就派上了用场。边缘增强通过增加两个区域边界之间的强度等级差异来帮助提高图像边缘的清晰度(见图 1-5 )。

img/496594_1_En_1_Fig5_HTML.jpg

图 1-5

边缘增强/检测示例

左边的图像是原始图像。右边的图像是应用边缘增强技术后的结果图像。您可能已经注意到,右边的图像似乎“勾勒出”了狗的边缘,这可以用于各种视觉任务,如图像分类。

图像分割是将图像分成称为片段的较小部分的过程。分段用于分别处理图像的各个部分,因为在许多情况下,图像具有不止一个有助于识别图像内容的独特对象或特征。图像分割被认为是预处理和处理图像之间的中间步骤,用于目标检测或分割分类(见图 1-6 )。

img/496594_1_En_1_Fig6_HTML.jpg

图 1-6

抽象计算机视觉流水线

对数字图像进行预处理后,处理步骤就开始了,在许多情况下,它可能涉及诸如特征提取、纹理分析和模式识别等技术。根据每个视觉任务,你会选择更相关的技术来执行任务。例如,要执行图像分类任务,您可以使用特征提取技术来提取给定图像片段中的独特特征。在图像分割过程中提取图像的片段。一旦从图像片段中提取了独特的特征,它们就被用于找到与预定义的或标记的图像片段相匹配的独特模式;带标签的图像片段是在人工监督下手动定义的一段图像(图 1-7 )。

img/496594_1_En_1_Fig7_HTML.jpg

图 1-7

带标签的图像片段示例

找到与标记片段的精确匹配的过程称为特征匹配;寻找独特模式的过程被称为模式识别。图 1-6 展示了一个抽象的计算机视觉流水线,以及当计算机执行视觉任务时,给定图像通常要经历的过程。关于不同的图像处理技术的进一步细节将在整本书中被覆盖。

为什么我们需要计算机视觉?

自从全球数十亿用户可以访问互联网以来,许多人已经能够捕获、制作和发布富媒体内容,如图像、视频和动画图像(也称为 gif)。用户生成的内容定义了我们今天所知道的互联网,每天发布的富媒体内容的数量正在快速增加。今天,仅 YouTube 出版商就贡献了每分钟 300 小时的视频;也就是每周 300 万小时的视频。没有人能以这种速度观看这么多视频。YouTube 和许多允许用户在其平台上生成内容的类似公司面临的挑战是,对数十亿用户生成的图像和视频进行索引、分类和归类,以向观众提供他们会观看的最相关的内容。典型的软件无法正确处理所有这些内容的分类;大多数现有的方法依赖于发布者的文本输入,例如视频标题、描述、关键词等。然而,在许多情况下,发布者的文本输入可能是不相关的;并且它们的内容可能包含不应该向特定年龄组显示的不适当或暴力的场景,或者许多观众想要选择不观看这样的内容。唯一能够实现大规模图像和视频索引、分类和归类的技术是计算机视觉。YouTube 等公司需要计算机视觉来索引和分类大量的富媒体内容。除了对图像和视频进行分类,计算机视觉还可以用于

  • 向有视觉障碍的用户和客户提供图像和视频的视觉描述。

  • 过滤不适合特定年龄组的内容。

  • 警告观众图像或视频中包含的场景和内容的类型。

  • 检测被篡改的图像和视频,这些图像和视频可能会对被篡改内容中的查看者或人员造成伤害。

除了计算机视觉可以解决的与互联网相关的问题,各行各业还有许多其他问题需要计算机视觉技术来解决。现在,您可以发现计算机视觉技术集成在我们日常交互的许多事物中,如收银系统、监控系统、生物扫描仪、医疗设备、交通工具等。

  • 收银系统集成了计算机视觉技术,以实现自助结账亭。

  • 监控系统使用图像和视频增强算法来检测和分析监控图像和视频的内容。

  • 生物扫描仪使用边缘检测和增强技术来收集和分析生物信息(即指纹、面部特征、眼睛特征...等等)。

  • 医疗设备利用各种计算机视觉技术,如图像重建和恢复,从医疗设备和扫描仪中检索有用的信息。

这份清单可以列出好几页,展示计算机视觉的所有不同应用。事实上,在过去的十年中,对计算机视觉技术的需求一直在增长。顶级公司正在他们的产品中采用这项技术,新公司也开始提供基于计算机视觉的产品。计算机视觉技术的影响是无限的,在接下来的几年里,它将被世界上更多的行业和组织所采用。你可能已经看到了计算机视觉应用未来的最初迭代,例如自动驾驶汽车、自主制造和通过增强现实的教育。

2019 年,公司对增强现实、虚拟现实、计算机视觉工程师的需求增长了 1500% (State of Software Engineers,Hired.com)。计算机视觉将在接下来的几年里对社会产生巨大影响,并需要更多的技术贡献者,这本书将通过让软件工程师和对计算机视觉感兴趣的人成为这一革命性技术发展的一部分来实现。

计算机视觉的演变

1959 年,一位神经生理学研究者对猫的视觉系统进行了几次实验。实验将电极放置在猫大脑的主要视觉皮层,研究人员在向猫呈现各种图像时观察视觉皮层的神经反应(图 1-8 )。

img/496594_1_En_1_Fig8_HTML.jpg

图 1-8

胡贝尔和威塞尔的实验

随着实验的进行,研究人员注意到当看到新图像时,猫的神经反应出现了一种模式。研究得出结论,在视觉皮层中有简单和复杂的神经元。视觉过程从检测图像的简单结构和边缘开始,以帮助建立更详细的解释。随着视觉信息变得更加复杂,视觉皮层依赖于复杂的神经元来解释图像的剩余细节。这项研究后来成为计算机视觉领域最有影响力的研究之一。它启发计算机视觉研究人员实现了今天所谓的图像预处理。

1966 年 7 月,麻省理工学院人工智能实验室的教授西蒙·派珀特发起了“夏季视觉项目”该项目被分配给麻省理工学院的本科生,以开发模式识别技术,试图使机器能够看到。这个项目是一个非常乐观的计划,在一个夏天开发我们今天所知道的计算机视觉。在 20 世纪 60 年代,有各种各样的尝试来开发计算机视觉系统;然而,研究人员最终意识到,这样一个项目需要几年,如果不是几十年,才能实现。50 年后的今天,计算机视觉仍处于研发阶段。

自 20 世纪 60 年代以来,计算机视觉已经发展成为我们今天在许多应用中看到的技术。计算机视觉领域的一项开创性研究是在 20 世纪 70 年代,当时的研究重点是对象识别。物体识别的最初迭代是抽象和简单的,以证明物体识别的概念。该实现使用简单对象(如圆柱体和立方体)的线条连接来标识它们。在接下来的几十年里,研究人员和工程师开发了传统计算机视觉的核心技术,包括两个主要阶段:

  1. 图像预处理

  2. 图像处理

图像预处理阶段集中于增强图像颜色和边缘,以帮助检测给定图像中的简单结构。处理阶段使用经预处理的图像来执行以下处理技术中的一种或多种:

  • 图像压缩

  • 图像增强

  • 图像恢复和重建

  • 模式匹配和识别

尽管传统的图像处理技术(如前面列出的那些技术)自开发以来已经使用了几十年,但仍有一些问题是这些技术无法单独解决的,例如在非常不寻常或意想不到的环境中识别对象,如手写单词、数字和从不寻常角度捕捉的对象图像(图 1-9 )。

img/496594_1_En_1_Fig9_HTML.jpg

图 1-9

物体的正常与异常图像

因此,在 20 世纪 80 年代,各种开创性的研究发表了。这项研究建议使用简单和复杂“神经元”的人工网络,可以识别某些模式。这种人工网络今天被称为人工神经网络(ANN)。神经网络是一种计算模型,旨在识别给定的一组标记数据(在这种情况下为标记图像)中的模式。网络使用给定的图像来识别模式并预测每个图像的结果。一旦网络预测了图像的结果,它就将其预测与分配给该图像的标签进行比较。比较阶段使网络能够从其初始过程中的错误中“学习”,然后多次执行相同的过程,直到网络提供更准确的结果。神经网络通常需要大量的标记数据来提供非常好的结果。因此,在早期,由于缺乏数据,神经网络没有发挥其全部潜力。

在 21 世纪初,一群计算机视觉研究人员启动了一个名为 ImageNet 的大规模图像数据集,该数据集包含数百万张图像和超过 20,000 个类别。ImageNet 的灵感来自于计算机视觉领域对更多数据的需求。它使最先进的神经网络模型的开发成为可能,对今天看到的高级计算机视觉应用产生了巨大影响。神经网络及其变体被认为是深度学习领域的一部分,深度学习是机器学习的一个子集。因此,当神经网络用于执行视觉任务时,我将把它称为基于深度学习的计算机视觉。

传统与基于深度学习的计算机视觉

自从计算机视觉领域出现以来,传统的计算机视觉就一直存在。传统的计算机视觉技术已经使用了几十年来有效地执行视觉任务。传统技术帮助开发了许多今天常用的算法,如尺度不变特征变换(SIFT)和加速鲁棒特征(SURF)。像 SIFT 和 SURF 这样的算法由于其高效的性能和准确的结果,已经成为开发当今增强现实技术的基础部分。然而,在某些情况下,由于缺乏准确性,传统的计算机视觉技术并不是最佳选择。在这些情况下,最好的选择通常是使用基于深度学习的技术。深度学习以多种方式用于执行复杂的视觉任务,如图像分类。在图像分类方面,基于深度学习的方法通常优于传统方法。图像分类是将图像内容分类到不同类别的过程。例如,最流行的图像分类问题之一是对猫和狗的图像进行分类。当一个软件呈现一只猫的图像时,它应该以很高的准确度将其归类为一只猫。在深度学习之前,这个任务几乎不可能完成;然而,深度学习推动了计算机视觉可能实现的极限,并成功地使计算机能够以高准确度区分猫和狗。如果没有速度极快的计算机和数百万张猫狗图像的数据集,这是不可能的。你可能想知道为什么深度学习需要快速的计算机和大量的数据。嗯,答案就在深度学习是什么以及它如何真正工作的背后。深度学习是机器学习的一个子集,主要建立在人工神经网络(ann)上,人工神经网络是一种受人脑运作方式启发的计算模型。与人脑类似,人工神经网络由几个计算“神经元”组成。神经网络中的人工神经元执行简单的计算操作,与网络中其他连接的神经元进行通信以做出决定。每个神经元与另一个神经元的连接都有一定的强度。神经元之间连接的强度称为权重(见图 1-10 )。

img/496594_1_En_1_Fig10_HTML.jpg

图 1-10

前馈人工神经网络模型

图 1-10 展示了一个由三层组成的简单神经网络——(1)输入层,(2)隐藏层,(3)输出层:

  1. 输入图层由多个输入组成,其中每个输入代表给定数据集的一个唯一要素。

  2. 隐含层是一组神经元,根据权值以一定的方式进行计算和处理。

  3. 输出层是神经网络中的最后一层,它接收来自前一个隐藏层的最终结果。

一组神经元代表一个神经网络隐层,典型的深度学习算法由多个神经网络隐层组成。人工神经网络包括两个阶段,学习阶段和执行阶段。在学习阶段,神经网络利用带标签的数据集来“学习”数据及其描述(也称为标签)之间的相关性。在我们的例子中,带标签的数据集由一组图像组成,每个图像都有内容描述。当给神经网络一个带标签的图像时,它会尝试处理隐藏层中的图像,并将标签的预测作为输出返回。一旦输出被返回,神经网络通过使用各种称为目标函数的函数将其与原始标签进行比较来对其结果进行“分级”。如果等级没有超过某个阈值,它将通过调整神经网络中神经元之间连接的权重来从中“学习”。神经网络通过向自身提供相同的输入来继续学习,并且网络的权重随着学习而调整。这个过程重复多次,直到神经网络的“等级”超过所需的阈值。“学习”和调整权重的过程称为误差反向传播,也称为反向传播。概括来说,这里是一个典型的人工神经网络“学习”新事物所经历的步骤的简单有序列表:

  1. 接收带标签的输入

  2. 尝试预测输入的标签

  3. 将预测标签作为输出返回

  4. 将预测标签与实际标签进行比较

  5. 给结果打分

  6. 调整神经元之间的连接强度,也称为权重

  7. 重复该过程,直到最终等级超过阈值

增强现实中的计算机视觉

增强现实(AR)是一种通过摄像头实时反馈来增强或显示物理世界中的数字对象的技术。为了在物理世界中显示数字对象,我们需要实时理解和检测物理世界中的对象。在某些情况下,对象可以是特定的模板。在其他情况下,它可以是水平表面,如桌子和地板,也可以是垂直表面,如墙壁和门。为了能够检测物体和表面,我们需要使用计算机视觉技术来显示物理世界中的数字对象。有三种主要类型的增强现实:基于标记的、无标记的和地理位置增强现实。基于标记的 AR 需要特定的预定义模板来显示数字对象。例如,一本书或一本杂志中的一页可以有一个特殊的图标,因此当相机检测到该图标时,它会显示一个映射在该图标或页面上的数字对象(图 1-11 )。

img/496594_1_En_1_Fig11_HTML.png

图 1-11

基于标记与无标记的 AR

与基于标记的 AR 不同,无标记 AR 不需要任何特殊的预定义模板来显示数字对象。相反,它可以使用各种计算机视觉技术将数字对象放置在任何水平或垂直表面上。在许多情况下,地理定位 AR 依赖于基于标记或无标记的 AR,并集成了位置传感器技术,以根据视觉和位置数据显示物理世界中的数字对象。

今天的增强现实主要是通过移动设备,更具体地说是智能手机来实现的。尽管已经有各种尝试通过开发定制硬件和设备来整合沉浸式 AR 体验,如微软的 HoloLens、Magic Leap 眼镜和谷歌眼镜,但消费者适应使用新的和不熟悉的硬件还为时过早。因此,智能手机是向消费者介绍 AR 的完美工具。在移动 AR 的早期,使用二维码或模板图像等标记是增强物理世界中数字对象的主要方式。为了实现这一点,需要模式识别和姿态估计等技术。模式识别是一种技术,它依赖于描述在给定图像中查找和分析的特征的预定义数据集。姿态估计使用检测到的图案基于摄像机角度模拟三维姿态(见图 1-12);这项技术用于根据摄像机的视角从各个角度观察三维物体。

img/496594_1_En_1_Fig12_HTML.jpg

图 1-12

身体姿态估计

基于标记的增强现实允许任何拥有智能手机的用户互动和使用这项技术;然而,对于日常使用来说,具有物理标记的要求是不可扩展的,也是不实际的。因此,无标记增强现实因其易用性和可及性而更具潜力。在无标记 AR 发展的早期,需要双摄像头来重建物理世界。

摘要

在这一章中,我们阅读了计算机视觉的历史。灰度和彩色图像进行了比较。我们还研究了为什么我们需要计算机视觉及其评估。我们还看到了前馈人工神经网络的简化架构。最后,我们看了增强现实。

总之,计算机视觉是人工智能(AI)的一个领域,它使计算机和系统能够从数字图像、视频和其他视觉输入中获取有意义的信息,并根据这些信息采取行动或提出建议。如果人工智能使计算机能够思考,那么计算机视觉使它们能够看到、观察和理解。

计算机视觉的工作原理与人类视觉非常相似,只是人类领先一步。人类视觉的优势在于,它可以训练如何区分物体,它们有多远,它们是否在移动,以及图像中是否有问题。

在下一章,我们将看看增强现实和不同类型的增强现实。

二、增强现实简介

这一章将着重于什么是增强现实,技术的发展,以及它的不同应用。

什么是增强现实?

几十年来,人类总是使用某种技术来可视化数据、讲述故事、教育学生,甚至娱乐。数据可视化对于许多组织和个人更好地理解信息和做出决策至关重要。讲故事在让观众参与到活动中起着重要的作用。教育对于今天的学生塑造未来至关重要。娱乐形式可以是电子游戏、运动和音乐会。所有这些都是通过增加物理世界中的数字对象并使消费者能够与它们互动而变得更加互动的活动的例子。为了成功地增强物理世界中的数字对象,我们必须将光投射到定制的形状中,并将其显示在物理对象上。然而,这种方法需要大多数消费者不常用的附加硬件,例如屏幕投影仪和全息投影仪。需要额外的硬件来“增加”物理世界中的数字对象的事实使得该技术不太容易获得,并且由于所需硬件的高价格标签而难以扩展。随着计算机视觉的发展,更多的研究人员和工程师一起开发各种技术,以增强物理世界中的数字对象,并实现与计算机交互的新方式,从而开发出我们今天所知的增强现实。

增强现实是通过在物理世界中重建和显示交互式数字对象来开发交互式用户体验的领域。在开发增强现实技术和应用的过程中,我们需要考虑三个核心概念:

  1. 物理世界重建和映射技术

  2. 数字物体投影技术

  3. 新的人机交互指南

增强物理世界中的数字对象并与之交互的早期方法之一是由计算机研究人员米隆·克鲁格开发的一个项目,他使用相机的实时视觉数据并投影计算机界面,以与物理世界中的数字计算机组件进行交互(图 2-1 )。

img/496594_1_En_2_Fig1_HTML.png

图 2-1

video place–AR 的开始

许多其他方法也依赖摄像机的实时视觉数据来理解场景;但是数字组件的投影总是在变化。一些尝试创造了耳机和眼镜,将数字组件投射到可佩戴的小屏幕上。其他人会将摄像机的实时视觉数据传输到计算机屏幕上,并通过屏幕与数字组件进行交互。随着计算机视觉技术的发展,以及在便携式屏幕上提供实时反馈的相机设备变得越来越受欢迎,越来越容易被消费者使用,我们今天所熟悉的增强现实技术开始发展。除了开发计算机视觉和数字对象投影技术来实现增强现实,使增强现实对人类友好并易于使用对于实现该技术的全部潜力至关重要。计算机视觉、硬件和人机交互研究人员和工程师多年来一直在共同努力,创造最终的增强现实体验,这导致开发了今天在手机中看到的最常见的增强现实形式。

如今,智能手机,如 iOS 和 Android 设备,是让用户体验增强现实的主要设备,因为大多数智能手机都有强大的摄像头、传感器和地理定位硬件。通过利用智能手机中硬件提供的信息,我们可以通过增强现实为用户提供身临其境的娱乐体验。智能手机中提供足够信息来实现增强现实的硬件包括单镜头或多镜头相机、加速度计、陀螺仪、磁力计和地理定位传感器(图 2-2 )。

img/496594_1_En_2_Fig2_HTML.jpg

图 2-2

单镜头照相机

单镜头相机从一个角度提供场景的视觉数据,这有助于检测和跟踪场景中表面的简单特征。另一方面,多镜头相机从两个不同的角度提供视觉数据,这有助于检测和跟踪场景中的深度,深度跟踪可以实现更准确的真实世界距离测量。加速度计、陀螺仪和磁力计都是惯性测量单元(IMU)的一部分,可以测量设备的加速度,并估计其速度、距离、方向和重力。地理定位传感器提供有关设备位置和地理坐标的信息,这使得能够在特定位置区域增加和“锁定”数字对象(图 2-3 )。

img/496594_1_En_2_Fig3_HTML.jpg

图 2-3

地理定位传感器测量

如前所述,在开发增强现实技术时,我们需要考虑三个核心概念,第一个概念是物理世界重建和映射,也称为场景重建。场景重建是一项计算机视觉任务,其核心目标是将视频帧重建为三维场景。这种视觉任务对于将数字对象放置在房间的特定部分以及使用从重建的三维场景中检索的特定坐标值来识别对象在物理世界中的位置是必不可少的。

为了执行这项视觉任务,我们需要从单镜头或多镜头相机中检索视频帧。由于缺乏深度信息,从单镜头相机检索的视频帧将使重建场景更加困难;然而,由于一种被称为运动结构(SfM)的计算机视觉技术,场景重建可以通过单镜头相机进行。SfM 是一种使用二维图像阵列来检测图像阵列中的独特特征并重建三维场景的技术(图 2-4 )。与单镜头相机不同,使用来自多镜头相机的图像进行场景重建的挑战性稍低,因为我们可以从两个或更多个图像中估计深度,并使用深度数据重建三维场景。

img/496594_1_En_2_Fig4_HTML.png

图 2-4

来自运动模型的结构

虽然在某些情况下使用仅视觉技术的场景重建可能是足够的,但是在许多情况下,来自手持移动电话的视觉数据由于过度运动和不可预测的照明条件而失真,导致大的误差容限,并且在某些情况下不能实现场景重建。在这种情况下,可以在当今大多数移动电话中找到的惯性测量单元(IMU)将与视觉数据一起使用,以产生可能的最佳场景重建。当视觉数据因任何原因失真或延迟时,从 IMU 设备检索的信息(如方向和加速度)非常有用,因为 IMU 数据的提供频率高于视觉数据,这有助于检测运动和环境中任何微小或显著的变化。这种 IMU 数据与视觉数据对齐,以计算设备的初始速度和物理坐标。

在计算机视觉和增强现实领域,使用 IMU 数据和来自相机的视觉数据来执行场景重建和其他物理世界测量任务是一种常见的方法。事实上,它通常被称为视觉惯性里程计,简称 VIO。VIO 最初被开发用于空中机器人,如无人机和车辆,以实现自主应用。随着该技术从仅依赖多镜头视觉数据发展到单镜头视觉数据,其应用不断增加,并最终在智能手机上实现了增强现实。VIO 的增强现实应用主要围绕“无标记 AR”,这使得在不需要“标记”的情况下增强物理世界中的数字对象 AR 标记是唯一标识的对象或图像,用于增强数字对象;这可以是二维码、书籍中的图像或人/动物的身体部位,如脸、手和脚。为了实现基于标记的增强现实,需要各种视觉任务,例如物体姿态估计、注释和地标检测。

不同类型的增强现实

目前常用的增强现实有几种类型;这包括基于标记、无标记和基于地理位置的增强现实(AR)。所有这三种类型的核心目标都是增强物理世界中的数字对象;然而,用于实现每种类型的技术各不相同。此外,每种类型的应用都有不同的用途。例如,基于标记的 AR 需要先前定义的图像特征,我们可以使用这些特征来增强数字对象。一个常见的使用案例是面部过滤器。AR 人脸过滤器增加检测到的人脸上或周围的数字对象,并跟踪人脸运动,以相应地改变数字对象的位置(图 2-5 )。

img/496594_1_En_2_Fig5_HTML.jpg

图 2-5

人脸检测和地标估计

为了实现 AR 人脸过滤器,我们需要执行计算机视觉任务,如人脸检测和人脸标志检测/跟踪。人脸检测是从给定图像中分割和检测人脸的过程。面部标志检测是检测面部特征并跟踪变化的过程,例如眨眼、嘴巴张开/闭合和面部表情。通过实时结合关于面部的两种信息,我们将能够成功地增强面部的数字对象。除了使用检测到的面部作为标记之外,还有依赖于各种其他标记的其他方法,例如简单的 QR 码、独特的图像和定制的物理对象(即,瓶子、杯子、帽子等)。).用于实现其他基于标记的增强现实方法的处理技术源自特征检测、跟踪和姿态估计的计算机视觉概念。随着我们在本书末尾更接近实现过程,我们将更深入地描述用于实现基于标记的 AR 的算法。

无标记 AR 是一种健壮的技术,不需要任何先前的环境知识;然而,它需要某些硬件来实现。在无标记 AR 开发的早期,实现无标记 AR 所需的硬件类型通常不为消费者所拥有,例如立体相机和高级 IMU 设备。随着 AR 研发的增加,我们看到了各种方法来最大限度地减少不常用硬件的使用,而是依赖于消费者可以广泛接触到的硬件,如低成本 IMU 设备和单镜头相机,这些设备在今天的智能手机中很常见。在上一节中,我们简要介绍了当今大多数手机如何使用视觉惯性里程计技术实现无标记 AR,这种技术利用从 IMU 设备和摄像头检索的信息来执行场景重建,以及其他支持无标记 AR 的计算机视觉任务。无标记 AR 应用是无限的,更有创意和影响力的应用有很大的空间。今天,无标记 AR 可以用来测量物理对象,并模拟物理世界的体验。这些应用对教育、设计、旅游等许多行业都产生了巨大的影响。总之,无标记和基于标记的增强现实基本相同,但由于每种技术的限制,它们的应用完全不同。尽管这两种增强现实方法有着极其不同的应用,但它们可以同时用于实现更复杂的增强现实体验,这就导致了基于地理位置的增强现实。

基于地理位置的增强现实将无标记和基于标记的增强现实与地理位置数据相集成,以在特定的地理位置坐标中增强和“锁定”数字对象(图 2-6 )。

img/496594_1_En_2_Fig6_HTML.png

图 2-6

基于地理位置的 AR

摘要

在本章中,我们讨论了一些与增强现实相关的基本概念。之后,讨论了不同类型的增强现实。

AR 可以定义为一个包含三个基本特征的系统:真实和虚拟世界的结合、实时交互以及虚拟和真实对象的精确 3D 注册。

任何基于 AR 的工具的核心组件是处理器、传感器、输入设备,主要是显示器。显示器可以是智能手机、手持设备、智能眼镜或头戴式显示器(HMD)。输入设备是照相机或网络摄像机。传感器包括陀螺仪和加速度计。

在下一章,我们将详细了解图像和视频处理的基础知识。

三、图像和视频处理基础

本章将重点介绍图像和视频处理的基础知识,包括所需的数学知识、标准算法、实现选项,以及在 C++应用中实现一个实际例子。

数学概述

自从第一台计算机发明以来,数学一直是计算机工作的基础。事实上,计算机的早期应用之一是在需要在短时间内计算复杂数学问题的业务中。随着计算机硬件能力在过去几十年中开始改善,计算机在短短内可以完成的复杂计算量急剧增加,使计算机能够轻松执行图像和视频处理,从而使计算机能够用于高速和高计算能力的应用,如图形处理和音频处理。在前面的章节中,我们简要回顾了图像是如何显示、渲染和处理的。在这一节中,我们将介绍支持当今图像和视频处理(也称为计算机视觉)和人工智能技术的数学基础。

虽然计算机视觉和人工智能有着密切的关系,但它们对数学的侧重略有不同。下面的雷达图总结了这一论点。在下面的情节中,你可能会看到与人工智能/深度学习相比,计算机视觉如何融合数学的不同分支。计算机视觉对概率和统计的利用远远超过深度学习(图 3-1 )。

img/496594_1_En_3_Fig1_HTML.jpg

图 3-1

计算机视觉与机器学习

虽然计算机视觉和深度学习有很多共同点,但它们的主要侧重点却截然不同。我们在计算机视觉方面的主要目标是调查和分析图像或视频,提出建议,并验证它们。

这些似乎是用来揭示数据中隐藏的假设的方法,这些假设乍一看是不可见的。因此,为了比较和检验假设,我们必须完全依靠统计和概率概念(图 3-2 )。计算机视觉和机器学习都强调线性代数原理,因为它是所有复杂系统的起点。另一方面,多变量微积分与参数分析有关,这将是我们将在本书中进一步讨论的所有深度神经网络背后的驱动因素。

img/496594_1_En_3_Fig2_HTML.jpg

图 3-2

数学在计算机视觉中的应用

考虑一下这个。我们更喜欢数据挖掘技术中使用的数据是干净的,并且是根据方法论准备的。如果我们想要端到端地工作(计算机视觉+机器学习),我们应该学习和探索计算机视觉和人工智能应用所需的数学基础。

在计算机视觉和机器学习中,数学不是分析数据;它是关于理解正在发生的事情,为什么会发生,以及我们如何实验不同的变量来得到我们想要的结果。下图展示了给定变量的变化率;这也被称为上升超过运行,斜率公式,或有时被称为梯度。这允许我们从给定的输入中理解变化的上下文。

img/496594_1_En_3_Figa_HTML.jpg

变量变化率图

在处理给定图像时,任何线性方程的几何解释和直觉都是必不可少的。下面的公式是梯度公式的标准表示:

img/496594_1_En_3_Figb_HTML.jpg

变量变化率(微分)

这有助于我们破译这些令人费解的声明的解释。

好吧,让我们把重点转向理解为什么我们必须学习这些不同的数学分支,以及什么是直观学习它们的好来源。

图像处理基础

目前,最热门的研究领域之一是深度学习。深度学习是一种机器学习和人工智能(AI)技术,模仿人们如何获取某些类型的知识。深度学习算法建立在日益复杂和抽象的层次结构中,不像典型的机器学习算法那样是线性的。深度学习作为一个领域,融合了一系列学术学科,包括计算机科学(图形、算法、哲学、结构和建筑)、数学(信息检索、机器学习)、工程(机器人、语音、NLP、图像处理)、物理(光学)、生物学(神经科学)和心理学(认知科学)等等。

由于其跨领域的掌握,许多科学家认为机器视觉为人工通用智能铺平了道路,因为它代表了对视觉环境及其上下文的相对理解。

那么什么是计算机视觉呢?

正式教科书中的定义如下:

  • “从图像中构建对物理对象的明确、有意义的描述”(巴拉德&布朗,1982)。

  • “……从一个或多个数字图像中计算三维世界的属性”(特鲁科&维里,1998)。

  • “……根据感应到的图像对真实的物理对象和场景做出有用的决定”(索克曼&夏皮罗,2001)。

为什么选择计算机视觉?

最明显的反应是,这一研究领域的实际应用越来越多。这里仅举几个例子(图 3-3 ):

  • 面部识别:为了添加过滤器并在图像中识别你,Snapchat 和脸书使用面部检测算法。

  • 图片检索:为了找到合适的图片,Google Images 使用基于内容的查询。该算法探索查询图像的内容,并根据最相关的内容返回结果。

  • Gaming and controls: Microsoft Kinect is a brilliant commercial device that uses stereo vision in gaming.

    img/496594_1_En_3_Fig3_HTML.png

    图 3-3

    计算机视觉的应用

  • 监控摄像头在公共场所很常见,用于跟踪异常活动。

  • 指纹、虹膜和面部匹配是一些最流行的生物认证技术。

  • 视觉仍然是检测道路信号、灯和智能车辆的其他视觉特征的主要知识来源。

计算机视觉涉及视觉识别,如图像描述、定位和识别。

标准算法

由于神经网络和深度学习方法的最新进展,这些最先进的视觉识别技术的效率已经大大提高。这本书是学习深度学习架构以及它们如何用于尖端机器视觉科学的一个很好的平台。在本书中,我们将介绍五种最重要的计算机视觉策略,它们是:卷积神经网络、AlexNet、基于区域的卷积神经网络(R-CNN)和快速 R-CNN。此外,我们将介绍主要的深度学习模型和每个策略可以用于的应用。

图像分类

图像分类(图 3-4 )的目标如下:给我们一系列图像,这些图像都标有一个类别,我们被要求为一组新的测试图像预测这些类别,我们被要求计算我们预测的准确性。视点变化、大小变化、类内变化、图像变形、图像遮挡、照明条件和上下文混乱都是该活动呈现的问题。

img/496594_1_En_3_Fig4_HTML.jpg

图 3-4

图像分类

我们如何着手建立一个算法,可以将图像分成不同的组?计算机视觉领域的研究人员已经为这个问题设计了一个数据驱动的解决方案。他们为计算机提供每个图像类别的几个示例,然后创建学习算法,这些算法查看这些示例并了解每个类别的视觉外观,而不是试图在代码中明确确定每个感兴趣的图像类别看起来像什么。

换句话说,标记图像的训练数据集首先被馈送到系统,以相应地处理和创建分类模型。以下是影像分类流水线的正式版本:

  • 提供包含 N 个图像的训练数据集作为输入,每个图像标记有 K 个组中的一个;其中 N 是所有组中图像的总数,K 是分类模式中的组数。一个组代表图像所属的类别。

  • 然后,我们使用这个训练包来教分类器如何对图像进行分类。

  • 最后,我们测量分类器的输出,告诉它为一系列从未见过的新图像推断标签。这些图像的实际标签将等同于由分类器投射的标签。

卷积神经网络(CNN)是最常用的图像识别架构。当你提供网络图像,网络对数据进行分类时,这是 CNN 的一个常见用例。CNN 通常以输入“扫描仪”开始,它不是为一次处理所有训练数据而设计的(图 3-5 )。例如,当使用 CNN 时,您不会想要一个有 10,000 个节点的层,在其中输入一个 100 × 100 像素的文件。这将是非常低效的,并且在更大规模上是不实际的。

img/496594_1_En_3_Fig5_HTML.jpg

图 3-5

卷积神经网络

相反,您可以创建一个 10 × 10 的扫描输入层,将图像的前 10 × 10 个像素输入其中。传递数据后,将扫描仪向右移动 1 个像素,以输入下一个 10 × 10 像素。滑动窗口是这个过程的名称。

卷积层,而不是常规层,用于处理输入数据。每个节点只关心其紧邻的小区。由于可快速分割的输入因子,这些卷积层往往随着厚度的增加而收缩。除了卷积层之外,它们通常还有池层。最大池策略是一种流行的池策略,在这种策略中,我们取 2 × 2 像素,然后移动到具有最大某个属性的像素。

ImageNet 是一个包含近 120 万个高分辨率训练文件的数据集,用于训练当今大多数图像识别技术。将在没有初始注释(即,没有分割或标签)的情况下查看测试图像,并且将需要算法来创建标签,以显示图像中存在哪些对象。来自牛津、INRIA 和 XRCE 的领先计算机视觉小组在这个数据集上测试了一些当前较好的计算机视觉方法。通常,计算机视觉解决方案使用多级流水线,通过在早期阶段调整一些参数来手动调整。

第一届 ImageNet 竞赛的获胜者 Alex Krizhevsky (NIPS 2012)构建了一个由 Yann LeCun 开创的非常深度的卷积神经网络。它的架构中有七个秘密层,不包括任何最大池层(图 3-6 )。前两层是卷积层,最后一层是全局相关层。在每块秘密板中,激活函数都是经过校正的线性单位。这些部队比后勤部队更善于表达,训练速度也更快。此外,当附近单元的活动较强时,采用竞争归一化来消除秘密行为。这有助于力量的差异。

img/496594_1_En_3_Fig6_HTML.jpg

图 3-6

阿勒克斯网

在硬件方面,Alex 使用了两个 Nvidia GTX 580 GPU 来运行一个非常强大的卷积网实现(超过 1000 个快速小内核)。GPU 非常适合矩阵-矩阵乘法,并且有很大的内存带宽。这有助于他们在一周内训练网络,并在测试期间快速合并十个补丁的结果。随着内核越来越便宜,数据库越来越大,大型神经网络可以比传统的 CV 网络进步更多。

目标检测

输出特定对象的边界框和标记广泛用于描述图像中的对象。这不同于分类/定位挑战,在分类/定位挑战中,分类和定位应用于大量对象,而不是单个主要对象。项目边界框和非对象边界框是仅有的两种对象分组类型。例如,在汽车检测中,您必须检测给定图片中的所有汽车及其边界框(图 3-7 )。

img/496594_1_En_3_Fig7_HTML.jpg

图 3-7

目标检测

如果我们使用滑动窗口技术来识别和定位图像,我们需要将 CNN 添加到图像的几个不同部分。由于 CNN 将每种作物分类为一个实体或一个上下文,我们必须将 CNN 应用于大范围的位置和大小,这在计算上是昂贵的。

为了解决这个问题,神经网络理论家建议使用区域来代替,区域是图像区域,可能包括外观上“成团”的特征。

这是一个相对容易玩的游戏。R-CNN(基于区域的卷积神经网络)是第一个让它动起来的模型。在 R-CNN 中,我们首先使用选择性搜索算法来扫描输入图像中的潜在伪像,产生 2000 个区域建议(图 3-8 )。然后,在所有这些地区提案之上,我们运行一个 CNN。最后,我们将每个 CNN 的输出输入到一个 SVM 中来识别区域,并通过线性回归来收紧对象的边界框。

img/496594_1_En_3_Fig8_HTML.jpg

图 3-8

R-CNN 网络

本质上,我们将目标识别问题转化为图像分类问题。但是有几个弊端:准备时间长,需要大量的磁盘空间,推理往往比较迟缓。

快速 R-CNN 是 R-CNN 的直接后代,它通过执行两个增强来提高检测速度:(1)在提出区域之前执行特征提取,导致在整个图像上仅运行一个 CNN,以及(2)用 softmax 层代替 SVM,导致扩展用于预测的神经网络,而不是开发新的模型。

由于它只对一个 CNN 进行整幅画面的训练,所以 fast R-CNN 在速度上表现要好得多。另一方面,选择性搜索算法也需要很长时间来产生区域建议。

因此,更快的 R-CNN 被开发出来,并从此成为基于深度学习的对象检测的规范标准(图 3-9 )。它插入一个区域建议网络(RPN)来预测来自特征的建议,用一个快速的神经网络代替缓慢的选择性搜索算法。为了最小化整个推理过程的计算需求,RPN 用于确定“在哪里”寻找。RPN 快速有效地扫描每个位置,以决定该区域是否需要额外的处理。它通过产生 K 个包围盒建议来实现这一点,每个包围盒建议有两个分数,显示一个项目出现在每个站点的可能性。

img/496594_1_En_3_Fig9_HTML.jpg

图 3-9

快速 R-CNN

一旦我们有了地区想法,我们就直接把它们输入到快速的 R-CNN 中。最后添加一个汇集层、几个全连接层、一个 softmax 分类层和一个边界框回归器。

总体而言,更快的 R-CNN 在速度和准确性方面优于竞争对手。虽然未来的模型大大提高了检测速度,但只有少数模型能够远远超过速度更快的 R-CNN。换句话说,虽然更快的 R-CNN 不是最简单或最快的目标检测过程,但它仍然是最有效的方法之一(图 3-10 )。

img/496594_1_En_3_Fig10_HTML.jpg

图 3-10

更快的 R-CNN

近年来,全球目标检测模式已经朝着更简单和更强大的检测系统发展。作为在整个画面上共享计算的一步,像你只看一次(YOLO)、单次多盒检测器(SSD)和基于区域的全卷积网络(R-FCNs)这样的方法是可观察到的。因此,这些策略将它们自己从三个 R-CNN 技术的昂贵子网中分离出来。这些模式背后的关键原因是停止让不同的算法孤立地专注于它们各自的子问题,这可能会增加训练时间并降低网络精度。

在给定场景中跟踪单个兴趣点或几个物体的方法称为物体跟踪(图 3-11 )。它在历史上曾被用于视频和现实世界中的遭遇,在最初识别一个对象后做出发现。现在,它对于优步和特斯拉的自动驾驶汽车等自动驾驶应用非常重要。

img/496594_1_En_3_Fig11_HTML.jpg

图 3-11

目标跟踪

根据观察范式,目标跟踪方法可以分为两类:生成式和判别式。生成式方法,例如 PCA,使用生成式模型来解释可见特征并最小化重建误差。

鉴别方法将区分目标和背景;其精度更可靠,越来越取代传统的跟踪方式。通过检测进行跟踪是区分过程的另一个术语,深度学习属于这一类。为了通过检测实现跟踪,我们在所有帧中检测候选对象,然后使用深度学习在候选对象中对目标对象进行分类。堆叠自动编码器(SAEe)和卷积神经网络(CNN)是两种可以使用的简单网络模型。

深度学习跟踪器(DLT)是使用 SAE 监控任务的最常见的深度网络,因为它允许离线预训练和在线微调。该过程如下:

  • 通过对输入图像施加噪声并重构原始图像,堆叠去噪自动编码器将实现更鲁棒的函数表达能力。

为了创建分类网络,将预训练网络的编码部分与分类器结合,然后使用从原始帧收集的正样本和负样本来微调网络,以区分当前实体和过去实体。DLT 使用粒子过滤器作为运动模型,为当前帧创建候选补片。分类网络为这些小块产生似然性分数,这表明它们的分类有多可信,然后选择这些小块中最高的作为对象。

  • DLT 采用最小阈值方法进行模型更新。

由于在图像识别和目标检测方面的优势,CNN 已经成为机器视觉和视觉识别的标准深度范式。一般来说,大规模的 CNN 可以被训练成分类器和跟踪器。全卷积网络跟踪器(FCNT)和多域 CNN 是基于 CNN 的跟踪算法(MD Net)的两个例子。

  • FCNT 成功地分析和利用了 VGG 模型的功能图,这是一个预先训练的 ImageNet,产生了以下结果:
    • CNN 功能图可用于监控和定位。

    • 对于从上下文中区分特定对象的任务,CNN 功能图通常是模糊的或不相关的。

    • 较低层编码更具识别性的属性以捕捉类内变化,而较高层捕捉关于对象类别的语义概念。

根据这些结果,FCNT 构建了一个要素发现网络,以在 VGG 网络的 con v4–3 和 con V5–3 图层上选取最重要的要素地图。然后,它为从两个图层中分别选择的特征地图创建两个附加通道(称为 SNet 和 GNet ),以防止在有噪声的图层上过度拟合。GNet 捕捉对象的类别细节,而 SNet 将对象从看起来相似的上下文中区分出来。

为了获得对象的热图,在第一帧中用指定的边界框初始化两个网络,并且对于新帧,在前一帧中以对象位置为中心的感兴趣区域(ROI)被裁剪和传播。最后,分类器通过 SNet 和 GNet 接收两个热图进行预测,跟踪器根据是否有干扰物来确定哪个热图将用于产生最终的跟踪结果。FCNT 管线如下图所示(图 3-12 )。

img/496594_1_En_3_Fig12_HTML.png

图 3-12

卷积网络流水线

.

摘要

本章涵盖了计算机视觉的基础数学,包括线性代数和多变量微积分。还包括为什么要学习计算机视觉。本章涵盖的标准算法是图像分类、对象检测、实例分割和对象跟踪。它还包括计算机如何读取图像。

图像分类是根据特定规则对图像中的像素组或向量组进行分类和标记的过程。

对象检测是一种计算机视觉技术,它允许我们在图像或视频中识别和定位对象。

语义分割描述了将图像的每个像素与类别标签(例如花、人、道路、天空、海洋或汽车)相关联的过程。

在下一章中,我们将讨论面部检测/识别和身体检测/跟踪。

四、计算机视觉应用

本章将着重于各种计算机视觉应用,技术的演变,以及如何建立一个 C++视觉应用。

概观

在计算机视觉中,模拟人眼使计算机能够像人类一样处理和识别视频和照片中的事物,从风景到物体、运动等等。直到最近,计算机视觉还只是在小范围内运作。今天,深度学习已经赋予了我们在日常使用的许多软件中看到的高级计算机视觉。事实上,深度学习最受欢迎的一个分支是计算机视觉;因此,深度学习对于实现和执行复杂的计算机视觉操作起着至关重要的作用。

如果让你描述图 4-1 中的物体/事物,你可能会提到在这幅图中有“果汁、篮子、男孩、女孩、男人、女人、草等”然后,如果你被要求描述图片中发生的事情,你的答案很可能是“这是一个享受野餐的家庭”,不费吹灰之力。这是大多数六七岁以上的孩子都能完成的两个非常基本的任务。然而,在上下文中,这是一个非常复杂的过程。人类的视觉是我们视力中极其复杂的有机组成部分。我们的概念模型,我们抽象解释的概念,以及我们的机密事件,在我们生活中与宇宙的数十亿和数万亿次相遇中也被考虑在内。

img/496594_1_En_4_Fig1_HTML.jpg

图 4-1

彩色图像(RGB 图像)

数码相机呈现的图像的分辨率具有远超过人类视觉系统的细节。以非常高的精度,颜色的变化也可以观察和量化。但是从这些图片的内容中找出意义是计算机几十年来一直面临的挑战。

作为人类,我们很容易体验到我们周围世界的三维性质。与此同时,计算机视觉研究人员开发了数学方法来恢复摄影中物体的三维结构和外观。

计算机视觉的应用

计算机视觉在它处理的问题上有其相关性。这是数字世界最重要的发展之一。计算机视觉帮助车辆自动驾驶并感知周围环境。摄像机记录汽车的不同角度,并将信息输入计算机视觉软件,然后通过处理图像找到道路界限和交通灯,并实时检测与其他汽车、行人和物体的距离。在高速公路和街道上,自动驾驶汽车将导航,避免撞到障碍物,并将旅行者安全带到目的地。

计算机视觉的一个共同特征是人脸识别。我们通过计算机视觉技术将人们的面部照片与他们的身份进行匹配。在图像中,计算机视觉算法检测面部特征,并将这些特征与数据库中的面部轮廓进行比较。为了验证其所有者的身份,消费设备使用面部识别。为了标记用户,社交媒体应用使用面部识别。

在计算机视觉中,帮助平板电脑、智能眼镜和智能手机等计算机系统在现实世界图片中覆盖虚拟对象的技术在增强和混合现实中发挥着重要作用。AR 设备使用计算机视觉来识别现实世界中的对象,以在设备的显示器上定位虚拟对象。例如,AR 系统可以使用计算机视觉算法来检测对检测深度和测量以及定位非常重要的平面。

Google Photos 等在线照片库使用计算机的眼睛来检测照片,并根据主题类型自动对照片进行分类。比起为你的照片和解释加上标签,你会节省很多时间。该技术还允许用户通过键入他们想要的内容形式来扫描视频时间,而不是手动观看完整长度的视频。计算机视觉在健康科学的发展中也起到了至关重要的作用。计算机视觉算法可以帮助医疗自动化任务,包括识别皮肤图像中的癌性肿块。

其他更复杂的应用出现在计算机视觉中。例如,想象一个智能家庭监控摄像头,它不断地将您的家庭视频发送到云,并允许您在远程级别显示图像。你可以建立一个具有计算机视觉的云框架,以便当任何可疑的事情发生时,房子里发生火灾时,立即向你发出警报。这将节省你大量的时间,确保你可以用警惕的眼睛看到你的房子。美国军方现在正在用计算机视觉处理摄像机和无人机记录的视频内容。

如果您在此示例中更进一步,您会注意到保护程序仅存储视觉算法异常标记的视频。这将允许我们最小化存储在云中的内容的大小,因为您的大多数安全相机照片在几乎所有情况下都是无害的,不需要检查。

在有一些计算机视觉可以实现的深度学习活动之前,开发人员和人类操作员需要大量的主动性和手动编码。例如,如果你想识别一张脸,你必须采取以下步骤:

  1. 通过建立数据库,将各个主体的图像按照一定的格式收集起来。为图像添加注释,并为每张图片输入多个数据项,例如距眼睛的距离、鼻梁宽度、上唇距鼻子的距离,以及数百个定义每个人具体特征的进一步测量值。

  2. 捕捉图像。如果您正在使用图片或视频内容,您将必须捕获新文件。然后必须重新检查测量过程,以标记图片中的关键点。你还必须拍摄图像的角度。

该程序最终将与数据库中的匹配,并比较在新图像中找到的测量值,如果它们符合任何跟踪配置文件。事实上,这项工作是手工进行的,很少使用自动化,误差幅度仍然很高。

机器学习是解决计算机视觉问题的另一种方法。在具有机器学习功能的视觉应用中,开发人员不再需要为每个法规手动编写代码。取而代之的是,对“特征”的编程包括可以检测这种图像模式的较小的应用。该算法随后用于检测趋势、识别独特特征并使用统计学习算法(如线性回归、决策树和逻辑回归)检测对象。

深度学习提供了一种全新的学习机器的方式。深度学习依赖于神经网络,它可以克服任何可以用例子说明的问题。神经网络包含特定类别数据的多种表示形式,可以从这些示例中提取常见模式,并将其转换为有助于识别潜在数据项的数学方程。

构建深度学习程序只涉及选择一个预先构建的算法,或者创建一个具有预期检测的个人面部样本的算法。神经网络可以在没有附加功能和测量指令的情况下用适当的例子识别人脸。

深度学习是计算机视觉的一种非常强大的方法。在某些情况下,成功的深度学习算法的开发在于选择大量的指定训练数据和限制,例如神经网络形式、网络的神经层数以及训练网络的次数。深度学习和机器学习都比以前的形式更容易和更快地实现。

随着硬件和云计算基础设施的可用性和进步,深度学习被用于当前大多数机器视觉系统,如自动驾驶汽车、面部识别和癌症识别。

读取、写入和显示图像

使用像照片和文本这样的数字,计算机可以看到和处理一切。图片的读写对于任何计算机视觉项目都很重要。有了 OpenCV 库,这项工作就简单多了。

矩阵中的整数决定了该特定位置的像素强度。在上图中,我们在右侧显示灰度图片及其像素值强度等价物(图 4-2 ),在该示例中只有一个属性,即给定像素位置的黑色强度。OpenCV 中的 imread 函数读取 BRG 的图像。当实现 imread 函数时,我们可以选择以不同的形式读取给定的图像:彩色、灰度或不变。下面的列表演示了需要传递给函数的实际值:

  1. Cv2。IMREAD_COLOR

  2. Cv2。IMREAD _ 灰度

  3. Cv2.IMREAD_UNCHANGED

    img/496594_1_En_4_Fig2_HTML.jpg

    图 4-2

    2D 连续图像中行和列的分割

更改色彩空间

从某种意义上说,表达颜色的协议是一个颜色空间,这使得它们可以方便地再现。灰度图像对于单个像素具有一个像素值,然而彩色图像对于单个像素具有三个值,即通常称为 RGB 的红色(R)、绿色(G)和蓝色(B)。

在大多数情况下,计算机视觉使用 RGB 格式来处理图像。今天,OpenCV 库读取图像时的默认格式是 RGB,但是它以 BGR 存储图像数据,这与 RGB 相似,只是像素描述的顺序不同。因此,当使用 OpenCV 读取图片时,您必须将图像色域从 BGR 转换为 RGB(图 4-3 )。

img/496594_1_En_4_Fig3_HTML.jpg

图 4-3

图像的 RGB 分量

调整图像大小

对于机器学习任务,训练模型具有固定的输入大小。这同样适用于计算机视觉模型。训练我们的模型时,我们应该有相同大小的图像。OpenCV 提供了方便的方法来放大和缩小图像。当我们需要将图像转换为深度学习算法的输入形式以进行训练时,这些方法很有帮助(图 4-4 )。

img/496594_1_En_4_Fig4_HTML.jpg

图 4-4

图像的不同分辨率/比例

旋转图像

数据增强方法是最常用的方法之一,旋转是图像/数据增强中一种易于引入的技术(图 4-5 )。使用这种技术,我们将能够为我们的深度学习训练模型建立更多的例子。数据扩充使用可用的数据样本,并使用旋转和平移来构建它们的新副本。

img/496594_1_En_4_Fig5_HTML.jpg

图 4-5

图像旋转

逐位运算

“与”、“或”、“异或”和“非”是位运算。当我们想要从输入图像中移除我们想要的区域时,这些操作非常有用,并与遮罩一起使用(图 4-6 )。

img/496594_1_En_4_Fig6_HTML.jpg

图 4-6

位运算

我们可以使用分水岭算法来测量图像中的分割掩模,并在我们使用按位“与”运算来消除图像的背景并获取我们需要的区域之后,看到我们提供的图像。

检测边缘

边缘是非常有用的图像特征,可用于各种目的,例如图像识别和物体定位。图片中对象的边缘特征也可以通过深度研究模型来确定。它们也用于锐化图像(图 4-7 )。

img/496594_1_En_4_Fig7_HTML.jpg

图 4-7

图像的锐化

滤像

为了模糊图像,我们使用高斯滤波器,它根据相邻像素与被考虑像素的距离赋予相邻像素不同的权重(图 4-8 )。

img/496594_1_En_4_Fig8_HTML.jpg

图 4-8

原始图像和高斯核后的图像

为了应用高斯滤波器,核被用于图像滤波。使用核来确定图像的给定部分中的点积。当计算新的像素值时,像素内的核的中心重叠。附近的像素值乘以必要的内核值。与内核中心一致的值被分配给像素。

检测面部

OpenCV 支持基于 Haar 级联的对象识别。哈尔级联是基于机器学习框架的分类器,它测量各种特征,如边缘、线条等。机器通过视网膜检测人脸(图 4-9 )。

img/496594_1_En_4_Fig9_HTML.jpg

图 4-9

用于人脸检测的包围盒

计算机视觉算法

用于分类或识别照片的技术通常以一组用于预测特定类别的数据点来表示。图像标注是一个分类子问题,将整张图片标注为一个类别。使用图像标记技术,人类用一组类别手动标记整个图像。一旦我们有了一组带有标记图像的数据,我们可以应用匹配算法来比较新的未标记的用户输入图像与我们拥有的数据集。一旦找到匹配或相似的标记图像,我们返回适当的类别集。

你可以将一张特定的图片分成无数的组。考虑一个手动过程,在该过程中,图像被匹配,相同的图像按照相似的特征被分类,但是没有预先理解你在寻找什么。显然,这是一项艰巨的任务。为了更清楚,假设有成千上万的图像。为了有效地做到这一点,显然需要一个自动化系统。

许多对图像进行分类的任务需要对物体进行摄影。CIFAR-10 和 CIFAR-100 是两种常见的数据集,图片分别被分类为 10 组和 100 组。这些数据集符合行业标准,可用于公共领域。

深度学习中的图像分类

深度摄影识别的架构通常包含卷积层,成为卷积的神经网络(CNN)。对于 CNN 来说,在网络上有图像和细节被分成网络类别是很常见的。CNN 以一个输入“扫描器”开始,并不是所有的训练数据都被同时解析。例如,您可能不希望 10,000 个节点的图层处理 100 × 100 像素的图像。相反,您可以创建一个 10 × 10 的输入图层,接受第一个 10 × 10 的图像像素。输入下一个 10 × 10 像素,在输入传输之前将扫描仪向右移动 1 个像素。这种技术使这个过程更有效率。

目标检测

对象检测是一种机器视觉过程,它在图片或视频中找到并区分对象。对象的识别特别是在检测到的对象周围绘制边界框,以定位它们在给定场景中的位置(或者观察它们如何绕过它)。物体识别通常与图像识别相混淆,所以在我们继续之前,解释一下它们之间的区别是很重要的。图像识别,也称为图像分类,为图像指定一个名称。“狗”这个标志是用一只狗的图片来表示的。“狗”这个标记仍然适用于两只狗的图片。另一方面,目标识别会在每只狗周围绘制一个边界框,并将该框命名为“狗”其根据模型预测指定给定对象在哪里以及应该添加什么标记/标题。这样,目标检测提供的不仅仅是关于图像的识别/分类信息(图 4-10 )。

img/496594_1_En_4_Fig10_HTML.jpg

图 4-10

物体识别/检测

对象检测类型

目标识别通常可以分为机器学习方法和深度学习方法。

使用传统的基于机器学习的方法来分析图像的各种属性,例如颜色直方图或边界,计算机视觉技术被用于识别可能属于对象的像素类别。这些特征然后被集成到预测实体的位置和名称的回归模型中。然而,深度学习方法基于卷积神经网络(CNN ),用于识别必须单独提取的伪像。

由于深度学习方法已经成为对象识别的现代方法,这些是我们为了实现的目的将关注的技术。

目标检测的重要性

物体识别与其他相关的计算机视觉技术密不可分,如模式识别和图像分割,帮助我们识别和感知图像或视频场景。

然而,还是有潜在的差异。图像检测只为检测到的对象创建一个类别标签,而图像分割提供了对场景的组件的像素级描述。对象识别通过拥有识别图像或视频中的对象的独特能力而与这些其他实践相分离。然后,这允许你计算这些物体,并用识别某些主要区别的独特能力来映射它们;我们可以看到它是如何以多种方式整合的:

  • 统计观众人数

  • 汽车自动驾驶

  • 监控录像

  • 掩模的检测

异常检测

这显然不是一个完整的列表,但它包括了物体识别影响我们未来的一些主要问题。

目标跟踪

在任何给定的场景中,这适用于跟踪一个或多个移动物体(图 4-11 )。这在历史上是在原始对象被观察到跟踪真实世界的遭遇之后实现的。这是优步和特斯拉等公司将推出的自动驾驶汽车中非常重要的一部分。可以将对象检测分为两类:生成型偏向型。生成方法将描述可见特征,并在寻找对象时最小化重建错误。

img/496594_1_En_4_Fig11_HTML.jpg

图 4-11

对象检测包围盒

鉴别过程更加有效和准确。它可以用来区分问题和含义,是监控的首选方式。它与通过检测跟踪的名称相符合。

语义分割

将图像中属于同一对象类别的部分聚集在一起的方法称为语义分离或图像分割。图像的每个像素都有一种像素预览,因为它是按类别分类的。Cityscapes、PASCAL VOC 和 ADE20K 是这项任务的标准。平均 IoU 和像素精度指标通常用于测试模型。平均 IoU 用于测试模型。更准确地说,语义图像分割的目的是将图像的每个像素中描述的内容标记为相应的类别。这种方法被广泛称为密集预测,因为我们对图像中的每个像素进行预测。

需要记住的重要一点是,同一个类的实例是不分开的;我们只考虑每个像素的类型。换句话说,如果在输入图像的同一组中有两个对象,分割图不会自动将它们区分为单独的对象。存在一种不同类型的模型,称为示例分割模型,其区分同一类别的不同对象。

对于许多活动,细分模型是有帮助的。

自动驾驶的车辆

为了让自动驾驶汽车安全地进入我们目前的高速公路,我们需要为汽车配备必要的感知能力,以考虑周围的环境。

医学诊断图片

机器将改善放射科医生进行的研究,显著减少进行诊断测试所需的时间(图 4-12 )。

img/496594_1_En_4_Fig12_HTML.jpg

图 4-12

样本分割图像

实例分割

对于图像中的每个识别对象,实例分割区分对象的每个实例。

实例的分割给每个图像像素分配一个标记。它用于计算给定图像中项目的数量,以执行图像分割等任务。

要求

这里,对象检测的目的是识别特定的对象,并为每个实体实例放置一个边界框。

每个示例都是分段的。目标是定义一组固定类别中的每个像素,而不区分对象实例。

Mask R-CNN 是一种深度学习技术,它通过更专注于实例分割来扩展 R-CNN。

R-CNN 和更快的 R-CNN 有什么新的地方?

掩模 R-CNN 具有另一个分支,用于预测每个感兴趣的场或区域(ROI)中的像素到像素的分割。

R-CNN 不同步输入网络像素以获得更高的速度。R-CNN 更快地产生两个输出:

  • 类别符号

  • 每个申请者的偏移边界框

屏蔽 R-CNN 的三个输出是

  • 类别符号

  • 每个申请者的偏移边界框

  • 遮罩对象

用于分组和边界回归的屏蔽 R-CNN 和更快的 R-CNN 分支在这里找到。

为了删除图像特征,我们可以使用 ResNet 101 深度学习架构。

两者都使用网络区域建议来建立兴趣域(RPN)。

图像重建工作

想象一下,你有一张旧快照,随着时间的推移,碎片已经开始侵蚀。这是一张非常有价值的照片,所以你想找回它。那就是图片的还原。为了得到模型必须学会恢复和增强的图像的损坏副本,数据集通常会包含现有的图片。在 IBM 和 Pinterest 等企业的引领下,这两个领域都在大力投资计算机视觉研究。重要的是要记住,鉴于计算机视觉的所有优势,因为它因其黑盒决策而臭名昭著,所以仍然存在安全问题。这就是人们对计算机持怀疑态度的地方,这些计算机使用信息来预测他们的一举一动,并对他们的信用风险、健康状况和许多其他人类选择做出决定。然而,随着人工智能和安全需求的快速增长,我们应该希望解决某些问题,以补救我们的隐私问题。

实施视觉应用

a)人脸检测/识别

这里的程序利用 OpenCV 库来检测 web cam feed 中的人脸,甚至是本地保存的视频剪辑。这里的代码实时识别或监控人脸。它借助预训练的 XML 分类器来实现这一点。面部特征已经被编程到该程序中使用的分类器中。为了检测各种对象,可以利用分类技术。

要运行程序,您需要执行以下操作:

  1. 在本地计算机上,必须配置 OpenCV。

  2. 在程序运行之前,必须定义分类器 XML 文件的路径。OpenCV 位置“OpenCV/data/haarcascades”包含这些 XML 文件。

  3. 捕获时,使用“0”作为值。要运行网络摄像头流,请键入 open (0)。

  4. 提供用于人脸检测的视频文件的路径,例如(capture . open(" path to video "))

履行

img/496594_1_En_4_Figa_HTML.jpg

在这部分代码中,您需要包含 OpenCV 目录中所需的头文件并加载分类器。

img/496594_1_En_4_Figb_HTML.jpg

之后,在执行之前更改“cascade.load”中的路径。

img/496594_1_En_4_Figc_HTML.jpg

使用 0 启动网络摄像头流。之后,将开始人脸检测。

img/496594_1_En_4_Figd_HTML.jpg

这部分代码使用级联分类器检测不同大小的人脸。

img/496594_1_En_4_Fige_HTML.jpg

这段代码通过检测形状在脸部周围画一个圆,并使用标量颜色作为绘图工具。

img/496594_1_En_4_Figf_HTML.jpg

这将从输入图像中检测眼睛。

img/496594_1_En_4_Figg_HTML.jpg

这里的循环将在眼睛周围画一个圆。

img/496594_1_En_4_Figh_HTML.jpg

如果检测到人脸,函数 imshow 将处理图像,如下图所示:

img/496594_1_En_4_Figi_HTML.jpg

b)身体检测/跟踪

跟踪是在视频中逐帧查找对象的过程。虽然这个意思看起来很直接,但在计算机视觉和机器学习中,跟踪确实是一个非常广泛的概念,它包括概念上相关但技术上不同的概念。例如,对象跟踪包含许多以下不同但相互关联的概念:

厚光流:这种算法有助于计算视频帧中每个像素内的运动矢量。

稀疏光流:卡纳德-卢卡斯-托马西(KLT)特征跟踪是这些算法中的一种,从图片中的一些特征点跟踪位置。

卡尔曼滤波:一种常见的信号处理算法是利用先验运动知识来预测运动物体的位置。导弹的制导是这个算法的第一个实现!“引导阿波罗 11 号登月舱降落到月球的机载计算机有一个卡尔曼滤波器,”根据这篇文章。

Meanshift 和 Camshift:使用这些算法可以找到密度函数的最大值。他们也在追踪过程中被雇佣。

单一物体追踪器:第一帧用一个矩形标记,以显示我们想要在这类追踪器中追踪的物体的位置。然后使用跟踪算法在后续帧中跟踪对象。在现实应用中,这种跟踪器通常与目标检测器结合使用。

寻找多种对象跟踪算法:当使用快速对象检测器时,最好从每一帧中检测几个对象,并使用跟踪算法来判断每一帧中的矩形是否与下一帧中的矩形相关。

检测与跟踪:如果你使用过 OpenCV 人脸检测,你会发现它是如何实时操作的,或者可以立即在每一帧中发现一张人脸。在初始位置跟踪有什么大不了的?让我们来看看为什么你需要跟踪一个片段中的物体,而不仅仅是重复检测。

跟踪比检测更快:跟踪算法通常比检测算法更快。解释很简单。在跟踪一个在前一帧中已经被观察到的对象时,我们有很多关于该对象存在的信息。我们现在了解了前一帧的位置,以及移动的位置和速度。因此,在即将到来的帧中,我们将利用所有这些知识来估计物体在即将到来的帧中的位置,或者在预测的位置上进行微小的搜索,以精确地放置物体。一个有效的跟踪算法可以使用它所知道的关于一个物体的所有知识,而一个检测算法总是从一个划痕开始。结果,当构建这种有效的方法时,对象检测算法通常每第 n 帧运行一次,跟踪算法用于 n-1 帧(n 减 1,其中 n 是视频中帧的总数)。在第一帧中检测到该对象后,您可以跟踪该对象。虽然当我们有额外的数据(例如,一大组图像或视频)时,跟踪具有优势,但如果物体在较长时间内在障碍物下移动或移动太快,跟踪算法无法保持它,它仍可能被丢弃和错过。对于跟踪算法来说,获得 bug 也是正常的,因为跟踪对象的边界框会逐渐远离这个 bug。检测算法经常被用来解决跟踪算法的这些问题。其对象的一个巨大例子是用于训练检测算法。因此,他们非常了解对象的特定类。另一方面,跟踪算法对于我们一直在跟踪的一个类的特定例子是最了解的。

当检测停顿时,跟踪将有所帮助:当在一个片段中使用面部检测器,但有一个物体遮挡了一个人的面部时,它很可能会失败。一个强大的跟踪算法,可以处理一定程度的变形。

通过跟踪来保存身份:对象检测产生一系列包含对象的矩形作为输出。另一方面,该项目没有标识。例如,检测红点的检测器可以发出矩形,表示在一帧中检测到的每个点,如这里的剪辑所示。这将在第一帧中产生一系列新的矩形。可以用在第一帧内的整个阵列中位于索引 10 处以及在第二帧中位于索引 17 处的矩形来描绘特定点。当在单个帧上利用检测时,我们没有指示哪个矩形指的是哪个项目。

OpenCV 跟踪 API

OpenCV 4 包含了一个跟踪 API,它为单个对象跟踪算法提供了各种各样的配置。BOOSTING、MIL、KCF、TLD、MEDIANFLOW、GOTURN、MOSSE 和 CSRT 是 OpenCV 4.2 中包含的八个跟踪器。在本节中,我们将进一步阐述每种配置的差异和优缺点。

待考虑:OpenCV 3.2 中只实现了以下六个跟踪器:BOOSTING、MIL、TLD、MEDIANFLOW、MOSSE、GOTURN。OpenCV 3.1 中实现了以下五个跟踪器:BOOSTING、MIL、KCF、TLD 和 MEDIANFLOW。BOOSTING、MIL、TLD 和 MEDIANFLOW 是 OpenCV 3.0 中实现的仅有的四个跟踪器。

更新:OpenCV 3.3 中的追踪 API 有所改进。当实现跟踪器时,建议在调用适当的 API 配置之前进行 OpenCV 版本检查。让我们看看实现跟踪算法时的设置和用法。为了开始实现追踪器,我们首先在一个数组中表示追踪器选项,以允许我们简单地在追踪器形式之间切换——BOOSTING、MIL、KCF、TLD、MEDIANFLOW、GOTURN、MOSSE 或 CSRT——如以下带注释的代码所示:

img/496594_1_En_4_Figj_HTML.jpg

在代码的开始,必须包含 OpenCV 和跟踪库,并在 OpenCV 3.4.1 中添加一个跟踪器类型列表。

img/496594_1_En_4_Figk_HTML.jpg

在此部分中,已经创建了一个跟踪器,将使用之前添加的所有跟踪器类型。

img/496594_1_En_4_Figl_HTML.jpg

在这部分代码中,视频被读取,您必须在 VideoCapture 中指定视频文件的路径。

img/496594_1_En_4_Figm_HTML.jpg

视频帧将在 while 循环中读取。然后,将创建一个边界框,然后根据跟踪器类型,它将在视频帧上显示适当的结果。

img/496594_1_En_4_Fign_HTML.jpg

最后,在跟踪完成并创建边界框后,该帧显示在屏幕上。函数 imshow 处理在用户界面中显示完全渲染的帧。if 语句处理按下退出键取消跟踪的情况。

在这一部分中,我们将介绍几种不同的跟踪算法。目的是获得每一个追踪者的真实知识,而不是一片高深的理论知识。

首先,我将介绍一些基本的跟踪概念。我们的跟踪目标是在精确跟踪(或几乎所有)先前帧中的对象之后,在整个当前帧中定位该对象。运动模型似乎只是一种很好的方式来说明你知道物体在后续帧中的位置和速度(速度+运动方向)。我们可以根据当前的运动模型来估计新的位置,除非我们不能检测或分析对象;因此,必须相对熟悉目标是什么,以便实时检测它的位置。您可以创建描述对象外观的外观模型。为了更准确地预测对象的位置,可以利用该外观模型在运动模型的预测位置的微小邻域内进行搜索。正面(对象)和负面(上下文)实例被馈送到分类器来训练它。让我们来看看不同的跟踪算法是如何解决在线训练问题的。

助推追踪器

该追踪器基于 AdaBoost 的在线版本,AdaBoost 是基于 Haar cascade 的人脸检测器的内部算法。在运行时,该分类器必须针对对象的正实例和负实例进行调整。对新帧中前一位置附近的每个像素运行分类器,并记录分类器的分数。对象的新位置是得分最高的位置。结果,我们现在又有了一个分类器的正面例子。因为接收到更多的帧,所以用新的信息修改分类器。

优点:它的算法已经有十多年的历史了,仍然在工作,但我想不出更好的目的来做这件事,因为还有其他专业的追踪器(MIL,KCF),它们按照类似的原理工作。

缺点:跟踪方面的输出一般。每当跟踪不起作用时,它并不总是能理解。

一千个追踪器

它类似于助推追踪器。主要区别在于,它不是只找到对象的当前位置作为正面例子,而是在当前位置周围的一个小社区中搜索许多可能的正面例子。在 MIL 中你不指定正反例;相反,您可以指定阳性和阴性“包装”积极袋的一系列照片并不完全由积极的例子组成。而是只要一张乐观包里的图就一定是很好的说明!在我们的示例中,正口袋包含基于对象当前位置的补丁以及来自其周围小社区的补丁。

优点:成绩优秀。它不会比增强跟踪器漂移得更多,所以当部分模糊时,它的表现令人钦佩。这可能是更好的跟踪器,除非你使用 OpenCV 3.0。但是,如果您使用的是更高版本,KCF 是一个不错的选择。

缺点:跟踪的误差没有准确记录。完全闭塞后,不愈合。

内核化相关滤波器(KCF)

前两个追踪器中讨论的思想在内核化校正过滤器追踪器中得到扩展。这种追踪器结合了 MIL 追踪器的多个阳性样本,包括广泛的相互作用区域。这项并行研究定义了一些有趣的几何参数,这个跟踪器使用这些参数来使跟踪更快、更精确。

优点:在准确性和速度以及报告跟踪失败方面,它优于 BOOSTING 和 MIL。如果您使用 OpenCV 3.1 或更高版本,我建议在大多数应用中使用这种方法。

缺点:完全梗阻后,不恢复。

媒体流跟踪器

探测器从内部计算一段时间内物体向前和向后轨迹之间的差异。它可以准确地检测跟踪误差,并通过减少前向/后向误差在剪辑序列中选取准确的轨迹。在我的实验中,我发现这种追踪器在运动很小且可预测时有效。该跟踪器可以检测跟踪失败的时间,并相应地停止,但是即使跟踪失败,其他跟踪器也会继续运行。

优点:出色的监控故障报告。如果一个运动是可预测的,并且没有收缩,这种技术非常有效。

缺点:运动很多的时候会失速。

GOTURN 跟踪器

它是整个跟踪器类中唯一使用卷积神经网络(CNN)的跟踪算法。我们知道 OpenCV 的文档“对预期的修改、光照变化和缺陷是可靠的”。

待考虑:GOTURN 使用的是 Caffe 模型,这是一个基于 CNN 的追踪器。

摩西跟踪者

MOSSE 代表最小输出误差平方和。当用单个帧初始化时,自适应相关用于对象跟踪,产生平衡的关联滤波。光照、长度、姿势和非刚性变形的变化不会影响 MOSSE 追踪器。

误差平方的最大平均比率通常用于识别变形,允许跟踪器停止和重新启动,只要对象出现,跟踪器就离开。它确实使用简单,可靠,而且比其他复杂的追踪器要快得多。然而,在准确性方面,它落后于基于深度学习的追踪器。

CSRT 跟踪器

在具有信道和空间可靠性的判别相关滤波器(DCF-CSR)中使用空间可靠性映射,以通过用于跟踪的框架将滤波器辅助改变到指定位置的部分。它只利用了两个标准特性(猪和颜色名称)。它还具有较低的帧速率(25 fps),但具有更好的对象跟踪可靠性。

c)图像到文本的分析

使用 C++ OCR 库,将图像转换为文本

OCR(光学字符识别)技术允许您将图像或扫描文档中的文本解释和翻译成人类可理解的文本。从优惠券上读取代码、创建可格式化的文本、自助商店、将印刷信息转换成数字版本等等,只是 OCR 的几个应用。市场上似乎有各种各样的 OCR 软件和库,但 OCR 测试的准确性至关重要。在这一节中,我将向您展示如何使用 C++来构建我们自己的 OCR 软件并将图像转换为文本。

使用 C++将图像页面转换成文本

让我们从一个场景开始,在这个场景中,图片包括几行文本。如果您有一本每页有大量文本行的扫描书,可能就是这种情况。在这种情况下,将图像转换为文本的步骤如下。

在字符串变量中,存储图像的方向。

创建一个缓冲区来保存 OCR 结果。

aspose::ocr::page(const char * image path,wchar t *buffer,size t buffer size)函数用于执行 OCR。

结果可以打印或保存到文件中。

下面的程序示例演示了如何使用 C++进行 OCR 并将图像转换为文本:

img/496594_1_En_4_Figo_HTML.jpg

使用 C++,对图像执行单行 OCR

在前面的例子中,我们转换了一个有多行文本的图像。当图片只有单行文本时,例如标题或标语,可能就是这种情况。在这种情况下,执行 OCR 的步骤如下:

  • 要设置图像的方向,请使用一个字符串变量。

  • 要保存 OCR 数据,请创建缓冲区。

  • aspose::ocr::line(const char * image path,wchar t *buffer,size t buffer size)函数用于执行 OCR。

  • OCR 结果可以保存或打印。

下面的代码示例演示了如何使用 C++对带有一小段文本的图片实现 OCR:

img/496594_1_En_4_Figp_HTML.jpg

在 C++中,将图像的特定区域转换为文本

您还可以配置 API,将 OCR 限制在图像的特定区域。在整个场景中,您可以通过在图像上绘制一个矩形来访问所需的区域。从图像的特定区域提取文本的步骤如下:

  • 在变量中,存储图像的方向。

  • 制作一个缓冲区来保存 OCR 结果。

  • aspose::ocr::page rect(const char * image path,wchar t *buffer,size t buffer size,int x,int y,int w,int h)函数用于执行 OCR。

  • 应该打印 OCR 结果。

下面的 C++代码示例演示如何将图像的特定区域转换为文本:

img/496594_1_En_4_Figq_HTML.jpg

五、自定义对象跟踪

在这一章中,我们将介绍如何通过测量背景场景的周期平均值,使用缩小的图像细节来实时跟踪运动和静止的物体。

概观

在处理剪辑流而不是单一的静态图片时,我们经常在脑海中有一个特定的对象或项目来跟踪整个视野。

计算机视觉中跟踪的基本问题出现在两种类型之一中;你将在许多场景中跟踪先前识别的物体或者跟踪未知的物体,根据它们的运动来识别它们。

此外,在跟踪中还有建模的问题。在最好的情况下,跟踪策略会一帧一帧地向我们发送对象实际位置的杂乱估计(图 5-1 )。建模帮助我们克服这一点。在测量一个被模糊评估的物体的轨迹时,已经有了几种有效的数学方法。这种策略可用于创建对象及其位置的二维或三维表示。

img/496594_1_En_5_Fig1_HTML.jpg

图 5-1

目标跟踪

实时目标跟踪

该主题说明了如何使用传统的网络摄像机来实时跟踪移动或固定的对象。当对象开始显示时,一种简单的跟踪方法是将预先指定的背景图片与相同的背景帧进行比较。这种情况发生在固定环境中,在这种环境中,尽管必须跟踪任何前景对象,但您仍可以理解背景图片,例如,室内、楼梯平台、工作场所、市场、车间等。如果一张纸在这种情况下移动或长时间保持不动,人们应该把它当作已经是一种情况的一部分,并把图片叠加到背景上,以防止额外的检测。如果背景对象被场景消除,同样适用。缺乏照明和需要调整凸轮位置都是这种方法的缺点。在这种情况下,您必须再次测量最新的背景。另一种选择是利用边缘算子来减少照明的调整。如果你想描述物体的身体而不仅仅是轮廓,你必须写一些额外的代码。

背景

640 × 480 像素的传统网络摄像头分辨率已经过时。如果您计划跟踪非常小的项目,您可以将其缩小大约三倍,以消除失真并大大提高处理器速度,而不会失去关键的跟踪能力。缩减步骤允许在对象跟踪中实现很高的处理速度。当没有物体时,它在 2 GHz 单核上以每秒 100 帧的速度运行,当有物体时,它以每秒 30 到 90 帧的速度运行。对象越大,测量斑点的每个像素需要的时间就越长。除了 ImageBlobs 类,本章和代码都依赖于以前的提交。

利用代码

通过设置摄像机和在视频预览中定义的帧捕获级别,以及在缓冲模式下使用 SampleGrabber 将帧捕获到内存中,开始视频捕获。首先,背景测量方法选择一个背景单选按钮。当您选择“启动跟踪”单选按钮框开始对象跟踪时,每一个记录的帧都应该组合在一起,还有一个平均背景帧,它将被计算并存储到一个名为 background 的 JPEG 文件中。我建议你把相机对准一个你认为能看到运动的方向。在处理相机失真或场景中出现的一些随机移动物体时,在很短的时间内测量背景。它们将通过平均背景计算被有效地消除。启动一个物体到你想要追踪的场景中,或者等待直到它们出现,除非它们是活动的。

图书馆

推荐对背景帧进行均值估计,因为它有助于提取出每个失真或小运动。

img/496594_1_En_5_Figa_HTML.jpg

以下类已添加到库中:

img/496594_1_En_5_Figb_HTML.jpg

在整篇人脸检测文章中,不是采用连续帧之间的差异,而是运动检测器内部的修改使我们能够调整背景帧,其中将对任何新的图片帧执行对比度。ImageResize 对象用于显示背景帧和最新的图像帧。首先,设置视频帧的大小和长度,包括 MotionDetector 对象的缩小因子:

img/496594_1_En_5_Figc_HTML.jpg

利用 zoom = 0.125f 将图片缩小三倍。如果已经完成了背景计算方法,调用 set background()函数:

img/496594_1_En_5_Figd_HTML.jpg

我们现在可以利用 detect()函数来计算与前景对象相对应的像素。

img/496594_1_En_5_Fige_HTML.jpg

您可以选择比较 RGB 值或灰色图片信息。当把物体转换成灰度值时,我们认为这对于相似的阴影是不可靠的。腐蚀和膨胀操作可用于覆盖对象斑点内的一些孔,这可能是因为背景和对象内的相同像素阴影而发生的,以及消除来自非常小的运动或非常薄的对象的噪声。从 ImageBlobs 对象,返回向量已被用于 blob 移除。使用一个类,你必须了解以下特性。

img/496594_1_En_5_Figf_HTML.jpg

首先,将对象的大小设置为缩小的图片尺寸。

img/496594_1_En_5_Figg_HTML.jpg

之后,您可以根据通过函数的 MotionDetector:: Detect()调用检索到的图片,开始测量 blob 到 find_blobs()。一个特征着眼于上下相邻的非零图片矢量分量,创建一个斑点。然后将当前发现的斑点数值分配给每个分量。例如,10×10 的矢量被用于图像矢量。

img/496594_1_En_5_Figi_HTML.jpg

img/496594_1_En_5_Figh_HTML.jpg

您可以利用img/496594_1_En_5_Figj_HTML.jpg通过检测来排除较小的斑点(例如,img/496594_1_En_5_Figk_HTML.jpg将使第三个斑点不被检测到)。

我们可以利用以下方法来获得所发现的斑点的特征:

img/496594_1_En_5_Figl_HTML.jpg

下面是一个 Blob 结构:

img/496594_1_En_5_Figm_HTML.jpg

因此,elements number 是存储在元素结构的组件数组中的整个 blob 中的元素的数量。

img/496594_1_En_5_Fign_HTML.jpg

一条线实际上是图像向量中的分量坐标,并且邻居包括其紧邻的相邻元素。

img/496594_1_En_5_Figo_HTML.jpg

调用 find blobs()时,我们可以使用 find bounding boxes()在 Blobs::bounding box 屏幕的 RECT 布局中包含的每个 blob 中测量一个边界框。在再次调用 find blobss()之前,必须使用 delete blobs()删除带有图片 blob 对象的 find blob。

find_blob()函数如下所示:

img/496594_1_En_5_Figp_HTML.jpg

在这里,我们将找到第一个非零条目:

img/496594_1_En_5_Figq_HTML.jpg

现在我们将在给定的代码中找到 blob。

add * neighbor()过程向上、向下、向左或向右寻找与当前斑点内的第 I 个分量相同的图像分量,然后将其附加到斑点分量阵列:

img/496594_1_En_5_Figr_HTML.jpg

Is_element_present()和 has _ neighbour()决定,除非这个相同的最新组件已经存在于 blob 内部:

img/496594_1_En_5_Figs_HTML.jpg

结论

我选择了一个固定的背景(图 5-2 )并使用我面前的物品进行了一些物体跟踪测试。我使用的背景如下所示。这在很长一段时间内是平均的。

img/496594_1_En_5_Fig2_HTML.jpg

图 5-2

背景

以每秒 66.67 帧的速度,跟踪了两个项目(显示器清洁器和移动设备)(图 5-3 )。

img/496594_1_En_5_Fig3_HTML.jpg

图 5-3

视频中的目标跟踪

以每秒 71.43 帧的速度,跟踪到一个移动能量连接器(图 5-4 )。由于脐带看起来很细,腐蚀和扩张技术人员没有观察到它。

img/496594_1_En_5_Fig4_HTML.jpg

图 5-4

视频中的目标跟踪

以下为几笔以及锁:每秒 90.91 帧(图 5-5 )。

img/496594_1_En_5_Fig5_HTML.jpg

图 5-5

跟踪不同的对象

在相当复杂的情况下,以每秒 29.41 帧的速度观察到三个不同的项目(图 5-6 )。

img/496594_1_En_5_Fig6_HTML.jpg

图 5-6

跟踪不同的对象

在 55.56 fps 时,跟踪到一个吉米·亨德里克斯和一个 9v 电源(图 5-7 )。

img/496594_1_En_5_Fig7_HTML.jpg

图 5-7

跟踪不同的对象

其他背景配置如下(图 5-8 ):

img/496594_1_En_5_Fig8_HTML.jpg

图 5-8

另一个复杂的背景

在 90.91fps 时,观察到许多 9v 电池在地毯上滚动(图 5-9 )。由于组件数量的限制,电池未被观察到。

img/496594_1_En_5_Fig9_HTML.jpg

图 5-9

另一个复杂的背景

在每秒 90.91 帧的时候,观察到了一个电池连接器,LCD-TFT 滤镜,9v 电池(图 5-10 )。一个微小的黑洞又一次没有被发现,这次是因为腐蚀和膨胀技术人员。

img/496594_1_En_5_Fig10_HTML.jpg

图 5-10

另一个复杂的背景

然后在 83.33 fps 之后,观察到蜡烛和手机(图 5-11 )。

img/496594_1_En_5_Fig11_HTML.jpg

图 5-11

另一个复杂的背景

当你观察一个更大的实体时,测量一个 blobs 的组件需要更长的时间。它也不能处理白色背景墙和桌子上物体的阴影。另一方面,高度突出的反射将被跟踪为与项目相关。

关注点

人们可以改进跟踪物体边界框位置的算法。如果某个区域在设定的持续时间内是固定的,则可以在背景场景照片中插入一个区域,从而将一个对象集成到场景中。(例如,很少有对象移动到某个场景,但保持不变。)

定制条形码生成器/阅读器

利用 C++,建立和读取条形码

在本章中,我们将向您展示如何用 C++编程创建条形码。您还将发现在 C++程序中构建条形码阅读器或扫描仪的方法(图 5-12 )。

img/496594_1_En_5_Fig12_HTML.jpg

图 5-12

定制条形码阅读器

信息以机器可以使用条形码读取的格式直观呈现。创新已被证明在各种各样的应用中是有益的,包括商店和市场中的自动检查系统。条形码现在可以用在大多数商品上。条形码越来越成功,导致了跨越几个领域的新应用。几年前,Aspose 认识到条形码的重要性,为不同的渠道推出了条形码生成器和阅读器 API。本章的目的是演示如何在 C++程序中使用条形码生成器和阅读器自动生成和解释条形码。

用于在 C++中生成和读取条形码的 API

假设,C++条形码确实是一个功能性 C++ API,允许用户构建和读取各种 1D 和 2D 条形码。它允许您通过条形码制作、配置和发送更高质量的图片。

以下是适用的条形码符号列表。用 C++编写的条形码将生成:

img/496594_1_En_5_Figv_HTML.jpg

img/496594_1_En_5_Figu_HTML.jpg

img/496594_1_En_5_Figt_HTML.jpg

使用 C++生成条形码

利用 Aspose 构建条形码:只需几行代码,就可以创建一个条形码。执行该程序的措施包括:

  • 创建条形码生成器类的对象。

  • 用条形码的编码形式和文本启动一个对象。

  • 使用条形码生成器->保存(System::String)过程,构建条形码。

下面的代码演示说明了如何在 C++中生成条形码:

img/496594_1_En_5_Figw_HTML.jpg

我们使用之前的代码生成的条形码如下所示(图 5-13 ):

img/496594_1_En_5_Fig13_HTML.jpg

图 5-13

定制条形码阅读器

利用 C++,产生一个 2D 条形码(QR 或其他)

我们在前面的实例中生成了一维条形码。我们来做一个二维条码,类似于二维码。制作 QR 条形码的步骤如下:

  • 创建条形码生成器类的对象。

  • Encode Types::用于配置对象。设置二维码的文本。

  • 使用条形码生成器->保存(System::String)过程,创建条形码图片。

下面的代码演示说明了如何用 C++创建 QR 条形码:

img/496594_1_En_5_Figx_HTML.jpg

用这个码,二维码确实会产生。

使用 C++,创建和定制条形码

您也可以调整条形码的显示。例如,您可以更改前景色、背景色、比例、边界类型和其他选项。用 Aspose 定制条形码的方法。下面列出了用 C++编写的条形码。

img/496594_1_En_5_Figy_HTML.jpg

  • 创建条形码生成器类的对象。

  • 条形码生成器->获取参数()方法用于达到条形码规格。

  • 定义你喜欢的规格。

  • 制作条形码并保存为照片。

以下编码演示说明了如何在 C++中创建个性化条形码:

img/496594_1_En_5_Figz_HTML.jpg

我们创建的可定制的 Aztec 条形码如下所示(图 5-14 ):

img/496594_1_En_5_Fig14_HTML.jpg

图 5-14

可定制的阿兹特克条形码

利用 C++,创建带字幕的条形码

标题可以出现在条形码的下方或上方。条形码图片中标题的内容和外观也可以自定义。下面的代码示例说明了如何在 C++中构建带标题的条形码:

img/496594_1_En_5_Fig15_HTML.jpg

图 5-15

这里可以看到包含上下标题的条形码

img/496594_1_En_5_Figaa_HTML.jpg

利用 C++,扫描和读取条形码

让我们看看如何使用 Aspose。用于 C++扫描和读取条形码的条形码。使用该功能的步骤如下:

  • 从条形码阅读器类创建一个实体。

  • 制作一个条形码阅读器示例,包括条形码及其符号的图片文件。

  • 要获取条形码的文本或形式,请使用条形码阅读器->Read()工具。

下面的编程示例演示了如何在 C++中搜索和解释条形码:

img/496594_1_En_5_Figab_HTML.jpg

C++用于读取具有几种符号体系的条形码

在大多数情况下,一张图片只包含一个条形码符号。即便如此,在某些情况下,一幅图片可以包括在相对相似的时期内来自若干符号体系的条形码。在这种情况下,您应该有一个条形码符号集,以便进行扫描和读取。下面的程序示例演示了如何使用 C++扫描带有多种条形码符号的图片:

img/496594_1_En_5_Figac_HTML.jpg

摘要

在本章中,您学习了如何使用 C++构建各种符号体系的条形码。通过 C++代码示例,讲述了条形码的扫描和读取。这些文档将帮助你理解所有关于 API 的内容。

六、使用 OpenCV 的增强现实

本章解释了如何通过测量周期平均背景场景,使用缩小的图像细节实时跟踪运动和静止对象。

概观

增强现实,也称为 AR,是一种允许我们在视野中看到虚拟物体和细节的技术。我们可以获得物体的细节,我们可以用增强现实来可视化。这通过结合真实世界的组件来改进屏幕。例如,如果我将手机指向一条街道,这将为我提供额外的信息,如餐馆、健身中心、医生等的名字。数字知识与人的世界的实时结合被称为增强现实。用户可以通过使用增强现实技术与自然环境中的虚拟对象进行交互。佩戴虚拟现实眼镜的人可以使用手机或平板电脑屏幕来查看他们正在查看的任何物体的细节。

这里讨论三种不同类型的 AR。

基于标记的 AR

数字世界与物理世界是相互联系的。我们必须知道,用户正在将摄像机对准特定的页面,以将教育动画直接显示在杂志的纸上。因此,系统最初应该从摄像头的实时视图中检测出您正在查看哪一页。这可以通过在页面上使用独特的图像或形式来实现。图像将被识别,动画将立即开始,跟踪页面上的正确位置。用户也可以将真实的书翻转过来,看看虚拟世界是否与页面的真实表面一致。标记是系统识别的可识别图像的名称。只要具有足够明显的视觉特征,几乎所有东西都可以用作标记。

无标记 AR

虚拟对象由用户移动。考虑一种增强现实技术,它允许你在起居室里放置虚拟家具。它使我们能够尝试不同的对象设计,以及位置组合。客户必须确定在这样的过程中将虚拟对象定位在哪里。它被称为“无标记增强现实”

基于位置的增强现实

虚拟世界存在于现实世界中。

增强现实技术通过基于位置的 ar 连接到特定的位置。假设你走在一条你不熟悉的公共道路上,从你的智能手机摄像头看到一个显示街道名称的虚拟街道标志,这就是基于位置的 ar。而且,与我们的 AR City 应用非常相似,这可以通过在您面前的实际路径上叠加路线来帮助您向位置移动。

基于标记的增强现实

在 OpenCV (C++)中使用 ArUco 标记创建增强现实

在本节中,我们将介绍什么是 ArUco 标记,以及如何在 OpenCV 中使用它们来执行基本的增强现实活动。长期以来,ArUco 标记已被用于虚拟现实、相机姿态预测和校准。让我们仔细看看它。

什么是 ArUco 标记?

ArUco 代表科尔多瓦增强现实大学(图 6-1 )。科尔多瓦大学是西班牙科尔多瓦的一所大学,也是它的发源地。

img/496594_1_En_6_Fig1_HTML.jpg

图 6-1

ArUco 标记器

以下是几个例子:

ArUco 标记是一个基准标记,放置在拍摄项目和场景上。这是一个二进制的正方形,有深色的背景和边框,还有一个白色的图案可以识别它。深色边框更容易看清。它有各种尺寸可供选择。为了有效检测,根据对象的大小以及场景来选择大小。虽然相当小的标记没有被识别出来,但简单地增加它们的大小将有助于它们被发现。

一个概念将是扫描这样的标记,以及在现实生活中使用它们。拍摄自然世界可以让你特别识别这些标记。当你是初学者时,你可能会想,“这对我有什么帮助?”让我们看几个例子。我们在文章中提到的例子中,把打印的和标记的大部分放在图像框的边缘。因此,当标记被特别识别时,您可以通过图片或剪辑来替换图像帧。一旦你切换相机,一个新的图像似乎有正确的观点扭曲。这种标记可以放置在仓库的路线上,两者都在机器人应用中安装了摄像头。由于每个标记似乎都有唯一的 ID,因此我们可以识别标记在仓库中的位置。每当机器人的摄像头识别出这些标记中的任何一个,它就能在仓库内精确定位。

使用 OpenCV 创建 ArUco 标记

利用 OpenCV,我们可以快速产生这样的标记。OpenCV 的 aruco 模块中有 25 个预定义的标记词汇表。字典的标记都包括相同的块大小轨道(44、55、66 或 77),因此每个词汇都有一组标记(50、100、250 或 1000)。

下面是展示如何识别和生成 Aruco 标记的 C++代码。我们必须使用阿鲁科模块。代码中的 PredefinedDictionary 显示了如何加载包含 250 个标记的字典。

img/496594_1_En_6_Figa_HTML.jpg

前面的 drawMarker 函数允许我们从一组 250 个 ID 范围从 0 到 249 的标记中选择一个具有特定 ID(第二个参数–33)的标记。产生的标记的大小由 drawMarker 函数的第三个参数决定。在前面的实例中,它可能会生成一个 200 × 200 像素的图片。将用于保存创建的标记的对象是第四个参数(在 markerImage 之前)。最终,密度参数指的是应该作为朝向形成的二进制模式的边界插入的块的数量。在前面的插图中,一个 1 位的边框将被插入到 66%生成的形状中,从而在一个 200 × 200 像素的图片中产生一个 77%位的图片(图 6-2 )。前面的代码将生成一个类似于下面所示的标记。

img/496594_1_En_6_Fig2_HTML.jpg

图 6-2

样品制造商

在大多数情况下,我们需要创建几个标记,将它们打印出来,并将它们放置在场景中。

ArUco 标记 检测:我们必须识别 ArUco 标记,然后在附加分析中使用它们,直到一个场景被它可视化。我们将在下面向您展示如何找到标记。

img/496594_1_En_6_Figb_HTML.jpg

首先,我们加载一个用于创建标记的相似词汇表。DetectorParameters 用于检测参数的起始集合:make something()。我们可以使用 OpenCV 在识别阶段调整许多参数。默认参数在大多数情况下都可以正常工作,OpenCV 建议您使用它们。因此,我们将保持相同的设置。标记的四个侧点通过每个活动标记检测来识别,顺序为左上、右上、右下和左下。这种矩形指针在 C++中被处理为点的向量,以及图片中的几个标记被组合成点的向量的向量。利用检测标记特征来寻找和检测标记的角。带有标记的场景图片将是第一个参数。用于创建标记的字典是第二个参数。被准确识别的标记将被保存为 markerCorners,或者它们的 id 将被保存在 markerIds 中。作为参数发送的还有之前创建的 DetectorParameters 实体。最终,被取消资格的成员被保留在被拒绝的候选人数据库中。

无论何时在场景中打印、剪切和插入标记,都要在标记的黑色边界上留一条白色边界,以便于识别。

增强现实应用

ArUco marker 的设计旨在克服一个问题,即只为广泛的应用(如增强现实)估计相机姿态。在本节中,我们将在一个增强现实应用中使用它们,该应用允许我们将每个当前场景叠加在当前图片或剪辑上。我们选择了一个场景,在有着如此巨大的图像框架的房子里,我们想要替换成最新的图像框架来观察它们在表面上的表现。之后,我们尝试将剪辑嵌入到电影中。我们通过打印、剪切和粘贴宽 ArUco 标记到图片区域的边缘来实现这一点,如图所示,然后录制一个剪辑。已经拍摄的剪辑可以在页面顶部的视频左侧找到。之后,我们逐一处理视频的每一帧。首先为每个图片检测标记。在下图中,已识别的标记以绿色显示。一个小小的红色圆环表示第一个点。通过顺时针导航标记的边界,您可以到达第二、第三和第四阶段。

img/496594_1_En_6_Figc_HTML.jpg

为了计算单应性,利用输入图像内的四个对应点以及当前场景图像(图 6-3 )。在我们之前的一篇文章中,我们讨论了单应性。单应性实际上是一种变换映射,是场景不同观点中另一个给定交叉点的参照点。

img/496594_1_En_6_Fig3_HTML.jpg

图 6-3

OpenCV 中使用 ArUco 标记的增强现实

在整个示例中使用单应性度量将新场景图片扭曲成由点击的图片中的标记所标识的四边形。在下面的代码中,我们演示了如何做到这一点。

img/496594_1_En_6_Figd_HTML.jpg

源点(pts src)是当前场景图片边缘点,而端点位置(dst src)是所点击图片内的相框内的匹配图像中心点。使用 OpenCV 函数 findHomography 计算输入点和目标点之间的单应性函数“h”。然后,使用单应矩阵将当前图片扭曲以融合到目标帧中。一个被屏蔽和复制的失真图片被粘贴到预定的帧中。该阶段在剪辑中的每一帧内一直持续。

在手机上使用视觉惯性估计的无标记增强现实

在增强现实(AR)中,真实世界环境的实时视图与计算机生成的虚拟内容相结合。在移动增强/虚拟现实(AR/VR)中,虚拟场景与现实世界的注册需要实时的六自由度(6-DoF)运动跟踪。即便如此,由于当今移动终端的计算能力有限,移动 AR/VR 中的用户体验将受到连续到达姿势之间的延迟的伤害。使用来自惯性传感器的高频和无源输出来实现移动 AR/VR 的到达姿态的实时精度。此外,传统的仅基于视觉的运动跟踪的鲁棒性也得到了改善,从而在存在运动模糊时提高了移动 AR/VR 效率。此外,开发了一个自适应滤波系统来自动处理不同的运动情况,通过平衡视觉-惯性融合过程中的抖动和延迟,允许实时的 6 自由度运动跟踪。AR 系统面临着特定的障碍,例如需要高质量的相机姿态估计,以及需要在资源最少的平台上运行。移动 AR 旨在以准确的姿势在现实世界的背景下制作虚拟对象。该设备必须能够使用移动计算来确定用户在哪里以及他们在看什么。

另一方面,移动虚拟现实允许用户和虚拟世界之间的各种交互和连接。在这里,我们展示了一个基于混合方法的完整系统,该方法使用 ORB 二进制特征和光流在消费者平板电脑上进行接近实时的操作。因此,移动 AR/VR 中最相关的问题之一是姿势跟踪,这涉及到实时测量用户的位置和方向。即便如此,由于移动设备的计算能力有限,移动 AR/VR 的实时运动跟踪仍然是一个瓶颈。基于标记或基于模型的方法只能利用场景的一些先验知识来执行 6-DoF 跟踪,而无标记运动跟踪可以在任何情况下操作。因此,未来无标记跟踪将在移动 AR/VR 中变得更加常见。

即便如此,由于高计算需求和多变的环境,移动 AR/VR 的实时 6-DoF 无标记运动监控的适用性和鲁棒性仍需要进一步研究。该设备采用自适应特征映射来增加可以使用的 ORB 特征的数量。“地图”被描述为特征描述符及其 3D 世界坐标的列表。所以每张地图都有一个由四个世界坐标组成的三维边界框。一旦计算出相机姿态,就可以将该边界框投影到图片框架中。

通过集成单目摄像机和惯性传感器,实现了基于传感器融合的移动 AR/VR 实时六自由度运动跟踪。提出了一种自适应滤波器架构,以平衡视觉-惯性融合过程中的抖动和延迟现象,允许对移动 AR/VR 进行实时平滑的 6 自由度运动跟踪。在这里,我们展示了如何通过所提出的特定于平台的优化来实现实时效率,以及如何使用两种现有的姿态估计算法来提高跟踪速度和范围。如果我们想在合成的 VR 世界中建立一种存在感,跟踪用户的姿势也是必不可少的。由于用户的 6 自由度姿势的细节,该设备将从用户的角度显示虚拟世界。同步定位和测绘(SLAM)是一种常见的无标记跟踪方法,可以在未准备好的环境中检测移动相机的 6 自由度姿态,允许手机 AR/VR 应用无需基准标记。

虚拟现实的增强现实(AR)子类

虚拟现实(VR)有一个子类叫做增强现实(AR)。用户收到的所有感官反馈都是在真正的虚拟现实应用中模拟的。在增强现实中,虚拟内容与现实世界的感官反馈混合在一起,产生一个组合版本的环境。这通常由当今的消费级移动设备来完成。该系统能够实现实时性能,使用计算机视觉技术分析来自手持摄像机或头戴式显示器(HMD)的实时视频输入,以评估摄像机在 3D 空间中的位置和方向(姿态)。使用这种姿势数据,虚拟增强可以无缝地合并到现实世界的视频流中。无标记 AR 可用于更普遍和特别的应用。无标记 AR 系统不依赖人工标记,而是利用环境中当前存在的自然特征。无标记 AR 最困难的方面是通过自然特征检测和匹配来接近相机姿态估计的计算需求。这个问题在手持移动设备中至关重要。一个校准的单眼是该设备工作所需要的。

几乎每个过程,包括地图制作,都是在线实时完成的,这限制了处理速度和内存。对于流水线中的每一点,都讨论了移动设备的计算限制,并使用一个 Android 实现来测试整个系统。当找到足够数量的良好匹配时,该设备尝试使用地图的已知 3D 坐标和 2D 帧位置来估计相机的姿态。在决定姿态时,考虑两种情况:来自描述符匹配的姿态和来自跟踪的内联体的姿态,混合系统的每种模式一个。尽管在匹配过程中实施了各种限制和阈值,但是仍然可能存在假阳性。这种糟糕的匹配可以构成对应关系的很大一部分,如果它们不被丢弃,恢复的相机姿态的准确性就会受到影响。目标是只使用正确的匹配来计算姿态。最大迭代次数通过反复试验来计算。由于 RANSAC 算法不是概率性的,相机姿态的可信度高度依赖于在最大可能迭代次数中选择四个正确点对应的可能性。虽然在 5000 次迭代后找不到内联器的风险微乎其微,但运行时间会太长。

修改地图后,最后一步是将恢复的姿态返回到 OpenGL,在那里它将用于生成模型-视图矩阵。任何 3D 增强都可以使用从精确的相机姿态获得的模型视图矩阵来绘制。有了足够的 3D 图形知识,一个人可以创建复杂的增强,融入他们的真实环境。我们的系统算法与其他候选算法进行比较,特别关注执行速度。笔记本电脑测试旨在展示当前笔记本电脑和智能手机/平板电脑之间的效率差距。由于光流不受所用检测器的影响,图像解码速度在三种实施方案中进行了测试——基于 CPU 的浮点和整数转换,以及我们新推出的基于整数的加速转换。

估计

首先定位被追踪的特征以进行计算是很简单的。系统的两种姿态估计方法(迭代和 EPnP)在时间上进行比较。因为迭代方法仅用于监测时的最小二乘估计,所以这是容易的。在找到合适的姿态之前执行的 RANSAC 迭代的次数决定了 EPnP 的计算时间。由于每个 AR 系统的目的都是创建一个流畅和交互式的用户体验,下面的图像通过用户视角的实时屏幕截图显示了系统的运行。在顶行中,一个 3D 立方体以三种不同的大小以及一个倾斜的角度被放大。在底部一行可以识别出三个独立的地图,根据所跟踪的地图绘制不同颜色的三角形。无标记虚拟现实系统可以在当今的移动设备上实时使用。

眼球功能检测器

ORB 函数检测器将使用 NEON 和 SIMD 引擎来实现,这是最紧迫的未来工作。如果系统以前的 NEON 实现有任何指示,这将显著提高系统的最坏情况执行速度,甚至可以在光流跟踪的基础上进行特征匹配,以提供更鲁棒的姿态估计。此外,随着移动硬件的进步,PC 实现中使用的加速方法将变得更加重要。通过 GPU 进行并行化是提高算法性能和速度的常用方法。NVidia 最近推出了 Tegra 4 处理器,该处理器将包括一个可编程的 72-CUDA 核心 GPU,使 CUDA 实现可以在手机上运行。随着性能的提高,可以添加额外的功能。目前,该设备无法在单个相机帧中识别多个地图;相反,它会选择查找分数最高的地图。在选择可能的地图之后,描述符匹配和姿态估计过程将分别应用于每一个地图。由于氖加速,匹配阶段足够快,可以重复几次而不会显著影响输出。

尽管姿势估计要慢得多,但通过使用 NEON 或 GPU 加速来加速特征检测,可以减轻多次进行姿势估计的影响。这将产生几个相机姿态,每个姿态都将被发送回 OpenGL 并单独增强。此外,需要实时相机跟踪性能来实现移动 AR/VR 的 SLAM 技术。移动 AR 的到达姿态的频率应该至少与标准视频帧速率(25 Hz)一样高,该视频帧速率通常被指定为实时输出的标准规则。对于非移动 VR 实时输出,本文档中也考虑了该规范。由于移动 VR 提供了比传统场景更好的实时效率,6-DoF 运动跟踪到达频率应该至少为 60 Hz。只有以这种方式,虚拟现实环境中的个人才会有愉快的体验。否则,用户会对 VR 环境中的延迟概念感到厌恶。据我们所知,当在移动设备上实时操作时,没有完整的 AR 系统包含本书中讨论的所有组件。在线地图开发和多地图支持是现有系统目前缺少的两个功能。

SLAM 过程

另一方面,特定的 SLAM 过程涉及计算整个图像的光度误差,在跟踪相机的同时执行密集(图像中的所有像素)或半密集(高梯度区域)重建,并且由于计算开销,实时性能需要 GPU 加速。市场移动设备的处理能力不足以进行直接实时摄像机监控。除了其高性能,基于特征的 SLAM 也被认为比直接 SLAM 更可靠。因此,本文中基于视觉的监控方法是基于特征的 SLAM 系统。然而,这些实时监控技术只在电脑上测试过。为了创建可以实时监控运动的移动设备,我们结合了各种图像处理技术来检测给定帧集中的关键特征,以通过产生单应矩阵来找到差异点。

即便如此,这种仅基于视觉的跟踪方法也存在较差的特征或运动模糊,使得难以监控重要的图像特征。此外,移动 VR 的帧率要求比智能手机 AR 大得多,以减轻模拟世界中的头晕现象。因此,前面的仅视觉跟踪方法对智能手机 AR 和 VR 都无效。可以使用其他传感器来进一步提高移动 AR/VR 的运动跟踪的鲁棒性和帧率。

惯性传感器可以作为主要运动捕捉传感器,为姿态估计提供高频和被动测量。通过视觉-惯性融合的六自由度运动监控已经被一些研究者所总结。基于各种融合框架,传感器融合解决方案可分为紧耦合或松耦合。紧耦合方法可以进行视觉和惯性测量单元(IMU)测量的系统融合,这通常会增加复杂性,而松耦合方法分别优化视觉和 IMU 监控,从而降低计算复杂性。包含广角单目摄像机和 IMU 的外部传感器模块用于这项工作,以增加摄像机的视野(FOV)。

单目摄像机

单目相机可以每秒 30 帧的速度采集 640 × 480 像素的图像流,IMU 可以每秒 250 帧的速度输出线加速度和角速度。没有使用 GPU 或其他加速方法来加速运动跟踪,以测试所提出的系统的效率。收集每个传入帧从前端特征提取到后端姿势优化的累计处理时间,以检查我们在智能手机中基于视觉的跟踪的处理效率。平均移动运动跟踪效率可以达到接近实时的精度。延迟趋势很明显,因为手机 AR/VR 的新过滤姿态强烈依赖于先前的姿态。

关键问题

因此,移动 AR/VR 的一个关键问题是如何在各种情况下进行实时运动跟踪,同时自动平衡抖动和延迟。对于现有的单目相机和惯性传感器,传入照片和 IMU 测量的帧速率是恒定的,导致视觉-惯性融合的相邻到达姿态之间的时间间隔恒定。结果,相邻姿势的位置变化被用于实时区分各种运动环境。

以下给出了对所提出的分段策略的广泛分析,以进一步解释所提出的自适应滤波器系统:

  • 抖动过滤:所以当移动 AR/VR 设备接近静止或逐渐运行时,相邻姿势之间的过渡几乎可以忽略。因此,在这种情况下,抖动现象占主导地位,而移动 AR/VR 用户的延迟现象可以忽略。这种阶段在本书中被称为抖动滤波。同时,到达姿态之间的实时距离目前足够小。

  • 适度过滤:在中等距离髓的工作中,当移动 AR/VR 系统的运动情况处于中等运动环境下时,这一阶段被称为适度过滤。

  • 延迟过滤:每当移动 AR/VR 系统经历快速运动时,相邻到达姿态之间的差异是显著的。当姿势没有按时到达时,消费者会注意到等待时间。因此,在移动 AR/VR 的这种情况下,延迟现象占主导地位,而在快速移动的情况下,抖动现象可以忽略。延迟过滤是这一点的术语。

按照前面的解释,相邻姿势之间的归一化距离可以用于馈送给所提出的自适应滤波器系统。因此,为了解决各种运动情况,决定适当的滤波器相位。为了有效地解决抖动和延迟现象,在抖动和延迟阶段使用二次函数来消除极端运动条件。此外,线性函数被称为适度滤波,以桥接移动终端上的抖动滤波和等待时间滤波阶段,从而降低计算复杂度。这些分段框架旨在估计理想的动态系统,从而为移动 AR/VR 抖动和延迟提供简单且次优的解决方案。因此,自适应滤波器机制可以管理实时运动的抖动和延迟。通过定性实验测试了所提出的移动增强现实/虚拟现实实时运动跟踪的有效性。以及基于移动 AR/VR 的实际运动场景的跟踪,以检查设备不确定性。视觉-惯性融合方法可以在 IMU 的帮助下很容易地提供高频到达姿态,尽管它容易由于移动中两个视觉帧之间 IMU 的组合误差而漂移。

建议的自适应视觉惯性方法

提出的自适应视觉惯性方法有几个优点。此外,根据 IMU 在短时间内的可靠姿态估计,当遭受运动模糊或纹理不良时,可以增强跟踪稳定性。为了进一步验证所提出的方法,进行了定量实验。所提出的方法的基础事实是从典型的目标模式获得的轨迹,其已知具有高精度。由于难以置信的模糊画面,智能手机 AR 仅基于基于视觉的运动跟踪容易崩溃。尽管如此,由快速运动模糊引起的跟踪丢失现象可以使用所提出的传感器融合相关跟踪方法来减轻。

虚拟现实帮助用户以各种方式与虚拟世界交流。因此,实时监控用户的姿势和行为对于 VR 设备来说至关重要。此外,VR 中运动跟踪的帧率高于 AR。或者,消费者将由于潜伏现象而生病。使用所提出的自适应视觉-惯性融合过程,可以实时实现细胞虚拟现实的平滑 6 自由度运动跟踪。使用安装在用户头部的建议的多传感器设备,可以实时观察用户的 6-DoF 运动。因此,当用户在现实世界中独立行走时,虚拟场景的焦点将会调整,以匹配真实的 6 自由度运动跟踪。

实时运动跟踪

实时运动跟踪对于任何 AR/VR 设备来说都是一个至关重要的问题,因此有多种方法可以实现这一性能。在基于标记的运动跟踪中,在计算观察者的相对姿态之前,设备必须首先检测和识别标记。尽管如此,标记必须提前放置在相关物品上或附近,并且在某些情况下并不总是可能这样做。此外,标记必须在整个移动 AR/VR 操作中保持可见,因为如果标记不可见,跟踪更有可能被破坏。相应的,另一种流行的移动 AR/VR 的运动跟踪系统是基于模型的方法。这种跟踪方法使用要跟踪的环境的先验模型。通常,这种先验知识包括真实场景的 3D 模型或 2D 模板。

摘要

这项工作提出了一种智能手机 AR/VR 的实时运动跟踪策略,比传统的基于视觉的无标记跟踪方法更有效。在该文献中开发了单目视觉-惯性融合,其可以在惯性传感器的帮助下有效地提高跟踪鲁棒性并提高帧率,从而为移动 AR/VR 提供实时和鲁棒的姿态到达。此外,提出了一种自适应滤波器系统来减轻异构传感器融合中的抖动现象,该系统可以根据各种运动环境改变滤波器权重,从而实现对两种技术的实时平滑运动监控。最后,在各种 AR/VR 场景下进行了实验,实验结果表明该方法是鲁棒和准确的。为了简化计算,本文提出了一种分段自适应框架,并获得了智能手机 AR/VR 实时运动跟踪的次优输出。即便如此,在跟踪输出中的分段点处会出现不稳定的过渡,因此未来的工作将集中在视觉-惯性融合的更连续的滤波系统上。

七、使用 ARKit 和 OpenCV 的增强现实

ARKit 一直是苹果最受欢迎的 iOS 11 功能之一。每天都有更多创新的增强现实应用被开发出来。在这个项目中,我们将专注于使用苹果的 ARKit 建立您的第一个增强现实项目,并在 Unity 中实现它。

为什么用 OpenCV 而不用 Core ML?

支持多种平台

虽然 Core ML 可能是仅支持 iOS 11 的 iPhone 应用的最佳选择,但无论何时您想要向后兼容或想要支持多个平台,您都必须为每个平台构建一个自定义方法或使用 OpenCV。

机器学习并不适合所有问题。尽管苹果公司为物体和场景检测等项目提供了几个免费的开源模型,但计算机视觉的领域远不止机器学习,OpenCV 是访问这些资源的最便捷方式。

ARKit 和 OpenCV 集成

通过委托调用,ARSession 允许直接访问当前帧数据。

img/496594_1_En_7_Figa_HTML.jpg

当一个新的框架变得可见时,这个函数被调用。我们可以从这里通过一个框架得到原始数据的 CVPixelBufferRef。虽然框架中的数据是以平面 YCbCr 格式给出的,但我们只需要灰度版本。我们错过了转换阶段,只捕捉 Y 帧,因为我们知道它是 YUV 格式。

我们是这样做的:

img/496594_1_En_7_Figb_HTML.jpg

我们只需要 Y 帧,它被放在第一位,如前所述。

为此,我们使用平面索引为 0 的img/496594_1_En_7_Figc_HTML.jpg技术,而不是标准的img/496594_1_En_7_Figd_HTML.jpg方法。

最终,由于我们获得的帧是在横向模式下,我们所要做的就是在移动它到任何 OpenCV magic 之前旋转它。

逻辑正在被重用。

如果你正在制作一个也支持 iOS 10 的增强现实应用,你可以通过改变 AVCaptureVideoDataOutput 的格式来适应 ARKit,从而使用前面的方法

img/496594_1_En_7_Fige_HTML.jpg

并使用 SampleBufferRef 获得相同的 CVPixelBufferRef。

img/496594_1_En_7_Figf_HTML.jpg

综上

虽然 iOS 11(以及更高版本)的安装基数一直在增加,但一个典型的增强现实应用无法单独集成苹果最新更新中包含的工具。然而,通过将我们从 ARKit 获得的帧数据与 OpenCV 集成,我们将能够构建看似令人信服的交互,因为它们使用 OpenCV 的底层实现和 ARKit 的便利方法和 API 真正增加了真实性。交互可以是从身体跟踪到深度分析的任何事情(图 7-1 )。

img/496594_1_En_7_Fig1_HTML.jpg

图 7-1

在 iOS 中使用 ARKit 进行身体跟踪

先决条件

我们需要一台 Mac 电脑来开发我们的程序,并需要一台 iOS 设备来运行它们,因为我们正在为苹果生态系统而构建。

五金器具

硬件方面需要一台兼容 macOS Catalina 的 macOS PC。身体监测程序也需要强大的苹果 A12 仿生 CPU 才能正常工作。以下 Mac 电脑和 iOS 设备有资格参加此促销活动:

img/496594_1_En_7_Fig2_HTML.jpg

图 7-2

符合此促销条件的 Mac 电脑和 iOS 设备

软件

您需要在 Mac 上安装以下应用来运行演示:

  • Unity3D 2019.1.5f1 带 iOS 构建目标

  • MacOS Catalina 10.15 (beta 版)

  • Xcode 11 (beta 版)

你的设备应该安装 iOS 13(测试版)或 iPadOS 13(测试版)。

如您所见,在撰写本文时,大部分程序仍处于测试阶段。请记住,设备可能会变得缓慢或不可靠,因此要采取额外的预防措施,以避免丢失重要数据。

逐步跟踪身体

让我们从 ARKit 魔法开始吧。在电脑上启动 Unity3D 2019.1,开始一个新项目(图 7-3 )。

img/496594_1_En_7_Fig3_HTML.png

图 7-3

Unity3D 2019

步骤 1:设置主要场景

Unity3D 将从创建一个空白场景开始。在添加任何可视元素或编写任何代码之前,我们必须首先导入必要的依赖项。ARKit 工具包包括骨骼跟踪功能。因此,ARKit 和 ARFoundation 依赖包必须被导入。使用 AR 会话和 AR 会话源对象创建一个新场景。这些对象控制着 iOS 摄像头,同时还提供了过多的 ARKit 功能。

img/496594_1_En_7_Fig4_HTML.jpg

图 7-4

使用应用

此外,创建一个新的 C#脚本,并将其附加到一个名为人体跟踪(HumanBodyTracking.cs)的空游戏对象。

应该是这样的

img/496594_1_En_7_Fig5_HTML.png

图 7-5

应用的前端

步骤 2:建立骨架

我们现在可以开始实现交互性了,视觉部分已经就位。在 HumanBodyTracking.cs 脚本中添加对 ARHumanBodyManager 类的引用。分析摄像机数据以检测人体的主要脚本是 ARHumanBodyManager。

img/496594_1_En_7_Figg_HTML.jpg

我们将使用一些简单的 Unity3D 球体来表示关节。每个球体代表一种不同类型的关节。要逐帧修改关节数据,添加一个 C# Dictionary 类。

img/496594_1_En_7_Figh_HTML.jpg

最后,添加对框架用户界面的引用。关节将使用球体对象,骨骼将使用线条对象。

img/496594_1_En_7_Figi_HTML.jpg

第三步:找到被跟踪的尸体

这是指南中最重要的部分!多亏了 ARKit,身体追踪从未如此简单或有效。您只需使用 ARHumanBodyManager 对象订阅“humanBodiesChanged”事件。

img/496594_1_En_7_Figj_HTML.jpg

奇迹发生在事件处理程序中。事件参数包括关于被跟踪的主体的信息。这是你得到尸体的方法:

img/496594_1_En_7_Figk_HTML.jpg

这不是小菜一碟吗?现在,让我们把它们放在一起,展示我们在之前的迭代中构建的 Unity 用户界面的框架。

请注意,截至本文撰写时,ARKit 只允许跟踪一具尸体。

第四步:展示骨架

接下来的代码行更新相机空间中的关节位置。球体和线条覆盖在来自 iOS 设备的摄像头馈送的顶部。

img/496594_1_En_7_Figl_HTML.jpg

苹果支持 92 种不同类型的关节(指数)。但是这些类型的关节很少被跟踪!它们相邻关节的位置被用来推断它们中的大多数。为了方便起见,我选择了 14 种接头类型,以便我可以与 Kinect 摄像头进行公平的比较。

这就是适当关节的连接方式和人体骨骼的形成方式:

img/496594_1_En_7_Fign_HTML.jpg

img/496594_1_En_7_Figm_HTML.jpg

关节在 3D 空间的位置和旋转由 ARKit 提供!这就是如何在 2D 屏幕空间中更新球体的比例、位置和旋转:

img/496594_1_En_7_Figo_HTML.jpg

就是这样!让我们在真实的 iOS 设备上构建并测试我们的应用!

步骤 5:创建和部署

最终,我们必须在真实的设备上构建和测试这个项目。我们不能在 macOS 上测试我们的代码,因为 ARKit 只在 iOS 和 iPadOS 上可用。在 Unity 中选择文件➤构建设置。选择 iOS 构建目标后,单击构建按钮。您必须为生成的项目选择一个保存位置。耐心等待,直到 Unity 的构建过程完成。Unity()将创建一个 Xcode 项目。xcodeproj)。使用 Xcode 11 beta,打开项目。如果您使用旧版本的 Xcode,您会得到一个错误,并且您的项目不能正常运行。给出你的 iOS 开发凭证,连接你的 iOS 13 设备,然后在项目启动后点击运行按钮。项目将以这种方式部署到设备上。

完成后,将摄像机对准一个人,就可以看到 3D 覆盖图出现在被跟踪的身体上!

ARKit 3 中的人脸追踪

img/496594_1_En_7_Fig6_HTML.jpg

图 7-6

ARKit 3 中的人脸追踪

用户级别:基本

自从增强现实被引入行业以来,它已经为我们提供了为移动技术用户开发交互式和令人兴奋的机会的能力。AR 可以以多种方式节省我们的时间,包括检查我们理想的沙发在公寓中的外观,确定选择的油漆颜色是否适合室内,甚至立即试穿新的化妆品。

人脸追踪是 iPhone X 和更新版本上 ARKit 3 的一个强大功能。我们可以快速创建应用,用合适的组件试穿珠宝、口红或眼镜。在这个例子中,我们将专注于最后一个选择:创建一个 AR 应用,通过简单的框架颜色转换来试戴眼镜。

ARKit 3 的设置和规格

由于 iPhone X 中引入的 A11 仿生芯片是 ARKit 3 进行 AR 面部跟踪所需要的,我们将需要这个系统或一个更新的系统来使我们的例子工作。我们的项目需要 Unity 2019.1 或更高版本来利用 ARKit 3 的所有功能,如多面追踪。我们需要在构建项目后安装所需的 ARKit 包。由于 ARKit for Unity 自 2019 年 7 月起已包含在 ARFoundation 捆绑包中,我们需要从窗口菜单打开软件包管理器并安装以下软件包:

  1. avfoundation

  2. AR 子系统

  3. 所有必需的人脸跟踪脚本的 AR 人脸跟踪

  4. 用于跟踪姿势驱动程序脚本的 XR 传统输入辅助对象

将项目迁移到 iOS 平台,并在安装后设置播放器配置,这是一个很好的想法。在播放器设置窗口中将目标最低 iOS 版本设置为 11.0,因为 ARKit 3.0 需要最低 11.0 的 SDK 版本。

在同一个窗口中,从 Architecture 下拉列表中选择 ARM64,因为 ARKit 仅支持 64 位设备。您还需要指定相机使用描述,这是当应用请求批准使用系统相机时将出现的脚本。你可以把文字改成任何你想要的,比如“ARKit 3 人脸检测。”

增强现实中的会话对象

一旦项目被正确设置,我们就可以开始创建必需的 AR 会话对象。最初,我们在场景中创建一个 ARSession 游戏对象,并向其添加两个脚本:一个 AR 会话脚本和一个 AR 输入管理器脚本。

然后,使用 AR 会话起源脚本和 AR 界面管理器,我们创建 AR 会话起源对象。由于 ARKit 很少使用设备的前置摄像头——它只用于面部跟踪/识别场景——面部管理器脚本至关重要。在 AR 会话源中有一个用于摄像机脚本的空字段。

让我们将主摄像机对象放在 AR 会话源对象中,然后在 AR 会话源脚本中引用它。将需要三个脚本:

  • 带跟踪的姿势驱动程序(在跟踪的姿势驱动程序中,将姿势源更改为“彩色摄影机”,并启用“使用相对变换”)

  • AR 相机历史

  • AR 相机管理器

你有没有发现在 AR 会话起源脚本的 AR 面部管理器中有一个面部预设的空字段?这就是我们将用来想象我们的基于 AR 人脸的眼镜的预设。

预制 AR 眼镜

我们需要制作一个新的游戏对象,我们将其命名为 GlassesPrefab。我们需要做的第一件事就是给它附加两个组件。第一个是 ARFace 变量,它将为我们提供已经识别的人脸点数据。第二个是 ARGlassesController,这是一个脚本,负责根据 ARFace 更新的数据定位眼镜。

img/496594_1_En_7_Fig7_HTML.png

图 7-7

ARFace 应用

之后,我们将需要在预设中构建一个游戏对象,它将附加到我们的眼镜网格上,我们将使用 ARGlassesController 来操纵它。预设的最终形式应该类似于上图所示。被操纵的网格必须作为一个子对象保存在我们的预设中。ARFaceManager 控制预设的位置,ARFace 顶点是与检测到的面相关的特征的局部点。

ARGlassesController 类

img/496594_1_En_7_Figp_HTML.jpg

img/496594_1_En_7_Figq_HTML.jpg

img/496594_1_En_7_Figr_HTML.jpg

ARKit 3 中的 ARFace 数据和人脸检测

程序很简单:当 ARFaceManager 检测到一张脸时,它会发送新的 ARFace 数据。由于我们的控制器链接到 ARFace 的更新案例,每当检测到一组新的人脸点坐标时,脚本就会更新眼镜的位置。

顶点阵列索引通常应用于人脸上的相同特征点;唯一根据一个人的面部特征而变化的是整体位置和面部网格。我们将眼镜对准顶点指数 16,结果如下。

img/496594_1_En_7_Figt_HTML.jpg

img/496594_1_En_7_Figs_HTML.jpg

颜色选择器

我们喜欢在一个简单的 UI 中使用连接到按钮的 ColorController 脚本来调整帧的颜色,所以我们将 ARGlassesController 设置为一个 singleton,以便 ColorController 可以在场景中任何时候访问它。

img/496594_1_En_7_Figu_HTML.jpg

SetFrameColor 函数链接到场景中每个颜色按钮的 Click 事件,允许我们在单击按钮时将帧颜色更改为控制器中指定的颜色。

摘要

上述说明适用于增强现实人脸跟踪应用。这只是增强现实和 ARKit 中许多可能应用的一个例子。ARKit 面部跟踪 API 可用于构建更复杂的应用,不仅适用于时装和化妆品,还适用于工业和企业应用,如员工身份识别和用户认证。今天的苹果为我们提供了复杂和多功能的工具,可以支持成千上万的应用。鉴于未来公司将更多地投资于增强现实硬件和软件,我们很高兴看到这项技术在不久的将来如何发展,以及苹果在不久的将来将在硬件和软件方面提供什么。

posted @ 2024-08-19 15:49  绝不原创的飞龙  阅读(8)  评论(0编辑  收藏  举报