玩转3D视界 —— 3D机器视觉及其应用(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-01 20:21:10

点击下载

作者:刘佩林 等

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

玩转3D视界 —— 3D机器视觉及其应用

玩转3D视界 —— 3D机器视觉及其应用试读:

前言

这是一本介绍3D机器视觉及其应用的书。在写这本书时,我和我的团队刚刚研发了基于时间飞行(ToF)法的3D相机,并期待着我®们的3D相机——SmartToF有规模化的应用。而在推广3D ToF应用的过程中,我们意识到,系统、全面地介绍3D机器视觉技术对3D应用的推广至关重要,遂着手编写这本《玩转3D视界——3D机器视觉及其应用》,希望能和广大从事机器视觉技术的同仁在“3D视界”中一起“玩”起来。

我们希望通过本书让更多进行机器视觉研究的同仁了解3D机器视觉,方便他们构建3D机器视觉的知识体系,因而在书中我们介绍了3D传感器、3D数据处理、3D物体识别与建模等多个层面的基础知识和算法。本书涉及光学、电子技术、信号处理、模式识别等领域的知识,虽无法全面完整地介绍所有知识点,但我们努力对构建3D机器视觉的知识体系所需的基础知识进行了介绍,本书可作为一本入门书籍。

本书也可以作为3D机器视觉开发者的应用指南。当前,各大手机厂商先后在手机中植入3D相机,3D机器视觉应用的帷幕已经拉开,面向3D视觉的海量应用亟待开发。目前,2D机器视觉已在各行各业中得到了应用,相比之下,3D机器视觉领域还缺乏完善的软件开发环境和数据资源,需要从事机器视觉研究工作的同仁共建3D视觉的开发环境,面向应用实现各种3D算法的软、硬件。在本书中,我们®介绍了自己开发的SmartToF的开发环境架构,一方面,使读者能在此基础上快速实现和验证自己开发的3D算法;另一方面,为构建特定领域3D机器视觉软件系统提供了架构参考。

我们力求通过本书让读者了解3D机器视觉的基本原理、方法,与此同时,我们也介绍了目前存在的问题,以期和相关同仁共同探讨3D机器视觉技术的未来。每个新技术的发展都遵循一定的规律,3D机器视觉技术也是如此。当前3D机器视觉正处在应用的起步阶段,还有各种问题需要解决,如3D传感器的电信号处理、光源控制及光照环境自适应等,要实现智能3D相机,为每台机器人装配“慧眼灵瞳”,还需要各位同仁共同努力。

王伟行、王俊、贾佳璐、潘光华、金成铭、陈琢、郭维谦等人参与了本书的初稿及后续修订工作,他们对本书的创作起到了非常大的作用,再次向他们表示衷心的感谢。在本书出版过程中,电子工业出版社的编辑王群也给予了很多帮助,在此也向她表示谢意。

由于作者水平有限,书中难免有错误和不当之处,欢迎业界专家、读者给予批评和指正。刘佩林第1章 引言1.1 何为“3D视界”

3D是Three Dimensions的缩写。与2D(Two Dimensions,2D)平面相对应,3D空间就是三维的立体空间。

提到“3D”,很多人的第一反应可能是电影院里的3D电影,游戏迷想到的或许是3D游戏。3D电影是利用人眼的双目视差特性,将两个影像进行叠加,从而产生3D立体效果;而3D游戏则是构建一个3D立体空间,其中所有的基础模型都是3D立体模型,游戏场景更加真实。这些应用侧重的是感官上的3D特效,而我们所说的“3D视界”,不仅包括这些,还涵盖了对客观存在的现实空间的3D度量,如设计师设计的各种家装3D模型,以1∶1的比例还原真实物体的尺寸。另外,很多人都玩过Xbox体感游戏,而Xbox游戏机的体感周边外设Kinect,实际上就是一种3D相机。除此之外,苹果手机的“Face ID”面部解锁、近些年发展迅猛的3D打印等都是典型的3D应用。

计算机视觉作为人工智能的一个分支,侧重的是视觉方面的研究,通过相机获取图像,然后利用计算机对采集的图片或视频进行处理,最终实现用机器代替人来进行测量和判断等。从20世纪50年代至今,计算机视觉已经有了几十年的发展历史。20世纪60年代,Roberts尝试通过计算机提取3D多面体,开始了对3D计算机视觉的研究;20世纪70年代,马尔计算视觉理论被提出后,各种计算机视觉的理论和方法不断涌现;20世纪90年代,计算机视觉得到进一步发展,尤其是多视几何理论的提出,极大地加快了3D视觉的研究进程;到21世纪,深度学习崛起,席卷了计算机视觉各研究领域。总体来说,目前计算机视觉的体系架构和理论方法都相对成熟,业界已经有很多进入市场的应用,如OCR车牌识别、人脸识别、行为分析等。

这些应用基本上都是基于2D视觉的,而在现实场景中,2D视觉技术存在一定的局限性,难以满足实际的应用需求。

首先是光照的影响。与3D图像相比,基于RGB图像的研究和应用更加依赖纯图像特征,所以在光照条件较差的情况下,效果都会非常差。这一点,大家在平时使用手机相机拍照时应该深有体会。

其次,2D相机无法直接测量物体的物理尺寸,通常需要一些额外的标定操作。基于2D相机采集的图像,可以检测一些平面的形状,但很难得到其他物理特征,如物体倾斜角度、物体位置、物体体积等。这一点带来的影响在后续的章节中会陆续提到。

此外,2D相机依赖目标之间的对比度,很难检测同色背景中的同色物体,无法区分具有相同颜色的物体。

还有一点是物体运动带来的影响。由于2D相机只能检测平面特征,当物体沿着传感器的光轴方向移动时,虽然可以通过时域特征和近大远小的特点检测到物体的运动,但无法精确获得其运动轨迹。同时,还存在另外一个问题,就是在识别物体时需要使用尺度不变的特征。

综合以上几个方面,我们可以发现,2D视觉技术虽然已经普及,但在实际应用时仍然存在诸多约束。而且,在本质上,我们所处的世界是立体的,仅使用2D视觉去感知3D世界显然是不够的,因此,3D视觉的应用十分必要。1.2 如何玩转3D视界

玩转3D视界需要具备哪些知识呢?“工欲善其事,必先利其器。”要想玩转3D视界,必须要有一台能够获取3D数据的设备,也就是这里要给大家介绍的3D相机。目前市面上常用的3D相机很多,根据测距原理的不同可以分为三种,分别是双目立体相机、结构光相机和飞行时间(Time-of-Flight,ToF)相机。其中,双目立体相机是双摄像头,结构光相机和ToF相机则是单摄像头。结构光相机发射的是结构化的光源,如光点、光线、光面等,而ToF相机则是向目标物体发射脉冲激光或连续波激光。每种相机的测距方式都有各自的特性,在不同的应用场景中也各有优劣,三种3D相机的选择也需要根据具体的需求而定。

本书基于ToF相机,介绍配套的底层开发工具包SDK和算法开发平台DMAPP。DMAPP平台是上海数迹智能科技有限公司(简称“上海数迹”)开发的算法平台,支持多平台、多语言开发,支持Windows、Linux、Android多种操作系统,同时支持Python、C、C++等多种编程语言。开发者在使用时只需要调用封装好的函数,可减少基础算法的学习时间,降低实现难度,有效提高工作效率。

准备好设备和平台后,若想要快速高效地完成任务,大家必须对数据的存储结构、不同数据结构的特性等有深入的了解,这样才能更好地利用数据、表示数据。或许你已经了解过传统的数据结构,如堆栈、树、队列等,但3D数据结构与这些不同,3D数据的表示方法通常比较直观且易于理解,其中还有一些是2D数据的扩展。常见的3D数据表示方法有很多,如点云、体素、多边形网格等,而最容易理解的就是深度图了。深度图是一种类似于灰度图的表示方法,不同的是,深度图的每一个像素记录的是物体距离相机镜头的实际距离值,而不是灰度值。而且深度图可以通过前面提到的3D相机直接得到,不需要进行其他额外的转换和处理。不同的3D数据结构之间可以互相转换,不同的数据表示方式有各自适用的应用场景,例如,体素可以用于医学成像、美术设计等场景。大家在深入理解3D数据后,可以根据应用场景自由地选择不同的数据表示方法,甚至可以自己构建新的方法。

但以上内容还不足以支撑我们玩转3D视界,因为我们要面对一个很现实的问题,那就是数据本身并不是理想的。如果你之前学习过图像处理的相关知识,就会知道,在2D图像处理的过程中会存在噪声和冗余等问题。同样,在3D数据的采集过程中,总会因为各种不可控的因素,导致采集的数据中存在噪声或误差。例如,当某个像素的深度值受到干扰而产生误差时,在转换成点云后,该点会出现在点集外部,这种就是飞散点,是我们不希望看到的。

3D相机采集的数据必然会存在误差,这些误差从来源上可以分为两类:系统误差和非系统误差。系统误差是由相机本身的内部结构引起的,而非系统误差则是由外部因素造成的。为了消除这些误差或者减少噪声对后续应用的干扰,需要采用滤波器。滤波器的设计和数据表示方法有关,基于深度图的滤波器和传统的2D滤波器类似,常见的有空域滤波器和时域滤波器,空域滤波包括高斯滤波、中值滤波、双边滤波等,时域滤波包括滑动平均滤波、自适应帧间滤波等。此外,还有基于点云的滤波器,其针对映射到3D空间中的点云,如体素滤波器、统计过滤器、半径过滤器等。滤波器可以在一定程度上减少图像噪声的干扰,而数据的冗余则需要通过数据压缩来解决。无效的冗余信息的剔除、高传输效率和低空间占用率是未来3D应用领域的基本需求。3D数据的压缩也可以分为两类:深度图的压缩和深度视频序列的压缩,但目前都还处于发展阶段,远不如2D图像压缩算法成熟,本书所述内容仅供大家学习和参考。1.3 本书的主要内容1.3.1 章节内容

本书的每一章都对应一个主题,从底层的数据结构到信号处理,再到上层应用,不断加深,循序渐进。同时,在应用部分,每章最后都配有对应的实践例程,供读者参考和学习。

本书后续分为两个部分,共六章。

第一部分是基础知识篇,包括对常用的3D相机、3D数据表示和3D数据处理的介绍。

● 第2章介绍了常用的3D相机,对双目相机、结构光相机、ToF相机的测距原理和标定补偿等内容分别进行了详细讲解。重点介绍了ToF 3D相机,包括P-ToF与CW-ToF的特性、重要的参数、误差与校正等,并对三种相机的特性进行了对比,介绍了三种相机各自适用的应用场景。在第2章的最后,介绍了适用于各种3D相机的通用开发平台——DMAPP。

● 第3章介绍了3D视觉常用的数据表示方法,包括深度图、点云、体素、三角剖分和3D数据存储格式。对每种数据格式的结构、生成方法、特性进行了详细介绍,利用每节讲解的知识,最终生成3D打印的模型。

● 第4章介绍了3D数据的处理和压缩。数据处理包括针对深度图和点云的噪声滤波处理,深度图滤波包括高斯滤波、中值滤波、双边滤波及两种简单的时域滤波;点云滤波部分介绍了滤除飞散点的直通滤波器、统计滤波器、半径滤波器及在下采样时使用的体素滤波器。数据压缩部分介绍了适用于单帧深度图和深度视频序列两类不同场景的压缩方法。

第二部分是3D应用篇,包括3D几何测量与建模、3D物体分割与识别、3D活体检测与动作识别。

● 第5章介绍了基于ToF相机的测量应用的主要步骤及其中涉及的主要算法,包括预处理、边缘检测、轮廓检测、形状检测、3D测量等,还介绍了基于RGB-D的3D重建的主要步骤及涉及的主要算法。

● 第6章介绍了3D物体的分割与识别。应用背景主要是基于智能服务机器人执行任务的小型场景,通过平面检测方法实现目标物体的分割。物体分割是目标识别的基础,对于分割后的目标物体,通过提取物体的几何形状属性特征、结构属性特征进行匹配、学习,从而完成物体几何形状的识别与分类。此外,针对复杂场景中的多物体分割与识别,为了应对前景物体与背景高度融合及点云数据噪声性、稀疏性和无序性的挑战,通过融合RGB-D数据来设计神经网络,学习不同物体的3D特征,最终实现物体的语义识别。

● 第7章主要介绍了3D技术在活体检测与动作识别中的应用,从人脸识别、人体骨架识别、跌倒检测和手势识别四个方面进行介绍,包括相关概念、原理、算法设计与代码实现。学习完本章之后,读者能够自己实现一些简单的应用。1.3.2 应用介绍

在3D视觉应用部分,本书围绕如下四种应用展开介绍。

应用一:3D测量

3D测量,顾名思义,就是指利用计算机视觉对待测物体进行几何测量,得到物体的3D尺寸、面积、体积等。3D测量在我们日常生活中的应用非常广泛。例如,在物流行业中,通过测量包裹的几何尺寸,优化运输过程中的空间利用率,降低人力成本;在工业生产中,需要对元器件进行长度测量和体积测量等。与传统的接触式测量相比,基于3D视觉的测量更加智能且高效。用户只需使用3D相机拍摄几张图片,就可以计算出目标的3D尺寸。而且,3D相机还具有体积小、功耗低的特点,适合移动便携式测量设备和嵌入式设备的开发。

应用二:3D重建

3D重建是计算机视觉中一个非常重要的领域。基于计算机视觉的3D重建分为基于2D相机的重建和基于3D相机的重建两类。早期,在3D相机尚未普及的时候,3D重建技术通常以多幅2D图像为输入,需要进行相机标定等额外操作。而基于3D图像的重建因为输入简单、使用便捷,近几年逐渐成为新的研究热点。尤其是随着深度学习的发展,基于单幅深度图的3D重建也取得了显著成果,但该方法往往需要一些先验知识或者约束条件来辅助重建。

应用三:智能服务机器人

前面两个应用更侧重于智能化的工业生产,未来,智能化还会走进家家户户,如智能家居、智能服务机器人等。其中,智能服务机器人近年来得到了越来越多的关注,人们期望借助其搭载的3D相机来帮助用户完成家庭场景中的日常活动,如摆放物品、避障移动等,这就要求机器人具有感知环境和识别目标物体的能力。高鲁棒性、高精度的物体识别是智能服务机器人系统的关键,虽然基于2D图像的物体识别在特定场景中取得了不错的效果,但视角、尺度和光照等因素的变化仍会导致物体识别失败,这也说明了2D图像特征对3D真实世界的物体和场景的描述依然不够。此应用聚焦智能服务机器人执行任务的场景,实现基于3D图像的物体识别与分割。

应用四:3D人体动作识别

智能服务机器人进入市场还需要一定时间,但智能家居已经出现在我们的生活当中。例如,已经出现可以用手势控制的抽油烟机,只需要挥一挥手就可以开关抽油烟机,实现无接触式交互。智能家居的实现依赖本书介绍的3D人体行为识别。人体行为识别是一个很广泛的研究领域,本书选择其中四个课题进行介绍,分别是人脸识别、人体骨架识别、跌倒检测和手势识别。人脸识别涉及人工智能和生物特征识别等多个领域,其目的是实现人的身份识别与鉴定。人体骨架识别的目标是自动定位场景中人体的主要关节点位置,这也是许多高层次图像理解任务的关键步骤。基于骨架检测可以识别许多人体动作,如后续的跌倒检测等。手本身也是由多个关节构成的,是一个具有高自由度的物体,手势识别是指识别用户的手部动作,通过手势识别的结果,向计算机发送不同的指令,让计算机理解人类的行为,实现便捷智能的人机交互。1.4 面向的读者

学习本书之前建议读者具备以下知识。

● 数字图像处理。本书是介绍3D视觉的书,其中很多知识都与图像处理技术相关,如滤波算法、边缘提取算法等。这些名词的具体含义,本书不再做具体介绍。

● Python、C++语言基础。本书大部分例程都是以Python语言为基础的,所以建议读者熟悉这门编程语言。Python语言相对比较易懂,各种第三方库也比较容易安装。读者需要知道如何配置Windows下的Python环境,尤其要熟悉NumPy、OpenCV的使用。本书还有少部分的代码是用C++语言编写的,所以建议读者了解C++语言,要求不是很高,了解类的概念,会写简单的C++代码即可。

● 机器学习。本书会用到很多与机器学习相关的知识,如支持向量机、随机森林,还有一些与神经网络相关的知识。这部分内容可能需要读者花费一些时间去学习。

如果你没有具备以上知识,可能会在学习本书的过程中会遇到一些困难,尤其是与机器学习相关的部分。所以建议读者在学习本书之前,先掌握以上知识。对于正在阅读本书的作者,我们有理由相信你已经具备这些知识了。

本书中所使用的SDK已经上传到Github上,读者可访问https://github.com/smarttofsdk/sdk或www.smarttof.com/sdk获取相关资源,同时可以了解针对本书提供的深度相机开发板的信息。

如果没有深度相机,你也不用担心,可以访问https://github.com/smarttofsdk/3DWorld获取本书中的全部例程及相应数据集。

最后,希望大家能够在阅读本书的时候感受到3D的乐趣,体会到3D的魅力,也希望大家在学习之后能够玩转3D视界!第2章 3D视界的硬实力与软实力——3D相机与开发平台

主要目标

● 了解3D相机的分类方式及三种3D相机的应用场景。

● 理解三种3D相机的测距原理及各自的特性。

● 掌握三种3D相机的使用方法。

● 了解DMAPP开发平台的功能与使用方法,为后续开发做准备。2.1 概述

3D视觉涉及传感器、照明设备、计算软件、系统设计、应用端的相机模组及软件开发环境,每个环节都有巨大的科研和经济潜力。巧妇难为无米之炊,丰富可靠的数据是研究与开发的前提。为了获取3D数据,走进3D世界,本章将与大家一起学习和了解3D相机及对应的开发平台。

在了解各种3D相机之前,本节先为读者简单介绍一下光学测量的分类。光学测量的方法分为主动测距法和被动测距法,如图2.1-1所示。顾名思义,主动测距法就是人为地、主动地发射能量信号,利用物体表面的反射特性及信号的传播特性实现对物体3D信息的测量;被动测距法没有人为的信号发射过程,而是利用自然光在物体表面反射形成的2D图片进行3D重建。实际上,随着技术的不断发展,为了适应昏暗的环境,有些双目相机也增加了主动光源进行补光,以提高测量精度和扩大测距范围,但我们认为这种光源在测距过程中并未起到直接的作用,所以我们仍然把带有补光光源的双目相机归为被动测距的范畴,在本书中,我们讨论的双目相机均指普通的无补光光源的双目相机。图2.1-1 光学测量方法的分类

按照相机的数量,被动测距法分为单目测距法、双目测距法和多目测距法。其中,单目测距法有两种,一种是聚焦法,一种是离焦法,聚焦法利用相机焦距可变的特性,变化焦距使被测量物体处于聚焦位置,然后利用成像公式计算出被测量物体与相机之间的距离;离焦法则不需要被测量物体处于聚焦位置,而是根据标定好的离焦模型计算物体与相机之间的距离。双目测距法是在两个视点观察同一个场景,然后利用匹配算法计算两个图像像素的位置偏差来进行3D测距。多目测距法可以理解为双目测距法的一种扩展,就是在多个视点观察同一个场景,进行多次匹配计算以实现距离的测量。单目测距法简单、成本低廉,但存在精度不高、测量范围小等问题;双目立体视觉与人眼结构类似,因此双目测距法测距精准;多目测距法虽然精度更高,但是匹配也更复杂,多个相机的摆放也更困难。综合考虑精度和复杂度,目前被动测距的主流方法是双目测距法,所以我们对双目相机进行详细讲解,具体在2.2节中介绍。

主动测距法根据测距原理分为结构光法、飞行时间法和激光三角测距法。激光三角测距法利用主动光源、被测物体和检测器的几何成像关系来确定被检测物体的空间坐标,该方法主要用于工业级应用;结构光法可以根据投用光束的形态分为光点法、光条法和光面法,光面法是目前应用较广的方法;飞行时间(ToF)法是将激光信号发射到物体表面上,通过测量接收信号与发射信号的时间差计算物体表面到相机的距离。基于以上两种原理的相机目前已经成为消费级产品。我们将分别在2.3节和2.4节对两种消费级3D相机——结构光相机和ToF相机进行详细介绍。

每种测距方法都有自己的特性,在不同应用场景下具有明显的优劣势,我们应该根据实际需求选择合适的3D相机来获取数据。希望通过本章的介绍,能够让大家了解一些常用3D相机传感器的技术原理、存在的误差及校正方法,并通过对比其特性,了解各自适用的场景。

只有高精度、高性能的硬件设备是远远不够的,如何获取3D数据,并将其真正地应用于科研、工业等领域呢?想要实现这些,我们还需要有成熟稳定的开发与应用平台,本章的2.6节将会为大家介绍适用于各种3D相机的开发平台——DMAPP开发平台。2.2 双目相机

在自然界中,绝大部分动物有两只眼睛,有的甚至更多,但没有只有一只眼睛的动物,这是生物经过长期的生存竞争和进化之后的结果。因为两只眼睛观察世界的角度不同,所以看到的场景会有微小的差别,大脑接收到这种差别后,通过中枢神经系统的分析处理,可以判断物体的远近,因此感知到的世界就会是立体的,所以用双眼观察到的信息会更加精细和准确。

随着图像处理技术和计算机视觉技术的发展,2D的图像信息已经不能满足需求,人们希望计算机拥有获取物体3D特征的能力,于是双目相机应运而生。双目测距法是一种被动测距方法,双目相机获取图像的过程就是简单的拍照过程,因此成本较低。2.2.1 双目相机原理

一个典型的双目相机由一组(2个)摄像头和计算机处理模块组成,双目测距法是由左右相机拍摄不同角度的场景,将其传输到计算机中,由计算机处理模块计算对应的视差,进而得到深度值的测距方法。如图2.2-1所示为具有视差的两幅图像的叠加图。空间中某一点的双目视差为该点在左右图像中位置的差别,双目视觉基于图像处理技术,通过立体匹配获得空间中的点在两幅图像中的对应点,进而得到空间点的视差。图2.2-1 具有视差的两幅图像的叠加

双目相机感知深度的能力是形成立体视觉的基础,这种能力是由“视差”提供的,换句话说,视差是实现立体视觉的条件。例如,当我们用一只眼睛去观察周围时,虽然在大部分时候并不会有什么问题,但穿针引线等细活往往很难完成,因为此时没有视差存在,所以我们无法获得准确的距离信息。

那么双目相机是如何利用视差感知深度的呢?这要从双目的成像

[1]过程说起。如图2.2-2所示为双目立体视觉原理图,两相机镜头的间距(基线)为b,对于人眼的双目系统,基线距即为双眼眼球的距离;相机坐标系的原点O位于相机镜头的光心;左右图像坐标系的原点为相机光轴与像平面的交点O和O。12图2.2-2 双目立体视觉原理图

实际上,相机的成像平面在镜头后f处(f为相机焦距),为便于理解,在图中将成像平面绘制在镜头前f处。选取世界坐标系与左相ccc机坐标系重合,空间中一点P(x,y,z)在左右图像中相应的坐标分别为P (u ,v)和P(u ,v)。左右相机坐标系x轴及左右111222图像坐标系的u轴分别重合,且相机坐标系的x轴与图像坐标系的u轴平行,那么由几何约束关系可知,PP与OO平行,于是点P和点12121P的v坐标相同,即v=v。212

由图2.2-2中的空间几何关系得到点P的3D空间坐标与2D像素坐标之间的关系:ccc

其中,f为相机焦距,(x,y,z)为点P在左相机坐标系(世界坐标系)中的坐标,P和P在对应图像中像素位置的差别(P点的12视差)为

由公式(2.2.1)与公式(2.2.2)可得点P的坐标表达式为

公式(2.2.3)中的未知量仅有视差d,所以只要得到P点的视差,就可以求出其空间坐标。利用视差计算深度的过程称为“三角化”。

但是在以上的推导过程中出现的视差都是图像坐标系中的视差,是以实际距离为单位的,如mm、cm等。但是在一张图片中,我们只能知道一个像素在第几行、第几列,也就是只知道其在像素坐标系中的位置,因此基于图像得到的视差也只能以像素的个数为单位。那么如何实现以像素为单位的视差与以实际距离为单位的视差的转换呢?这就涉及图像坐标系和像素坐标系的变换。

图像坐标系和像素坐标系的位置关系如图2.2-3所示。图像坐标系为O-uv,像素坐标系为O-xy。两者的原点不重合:像素坐标系的IP原点一般在最终形成的图像的左上角处,图像坐标系的原点在像素坐标系中的坐标为 (x ,y)。此外,由于相机感光器件的分辨率一00定,所以两者的坐标变换为线性的。图2.2-3 图像坐标系和像素坐标系的位置关系

图像坐标系中的点 (u,v)和像素坐标系中的点 (x,y)的对应关系为

其中,(x ,y)为图像坐标系的原点在像素坐标系中的坐标,00P和P为相机感光器件在单位长度内包含的像素个数,单位为xy“pixel/length”,如在Nikon D610相机中,P=0.168pixel/μm,xP=0.167pixel/μm。y

为了得到某一点在像素坐标系中的视差,首先需要进行立体匹配,即得到空间中的点在左右图像中的对应位置。人眼的匹配在观看场景物体的同时自然发生,以至于我们根本不会意识到此过程;但双目相机与人眼不同,需要经过专门的立体匹配过程才可得到左右两幅图像中的对应点。双目立体匹配是双目视觉领域最复杂的问题,将在2.2.2节重点介绍。2.2.2 立体匹配方法

立体匹配是双目立体视觉中最困难也是最关键的步骤,其效果直接决定了重建结果的好坏,目前国内外在双目立体匹配方面已积累了大量研究成果,提出了很多立体匹配算法。根据算法运行时匹配约束的作用范围,可将其分为局部立体匹配算法、全局立体匹配算法和半全局立体匹配算法。其中,局部立体匹配算法计算量较小、运行速度较快,能满足实时性要求,但是匹配精度无法保证;全局立体匹配算法准确性较高,但是计算速度慢,不适合实时运行;半全局立体匹配算法在匹配效果和复杂度方面性能居中。

2.2.2.1 局部(Local)立体匹配算法

局部立体匹配算法又称为基于窗口或基于支持区域的立体匹配算法,如图2.2-4所示,该算法独立地对左图像中的每个像素设定一个合适大小的窗口,然后依据一定的相似度测量准则,在右图像中寻找[2]与此窗口最相似的子窗口,该子窗口所对应的像素即为匹配点。图2.2-4 局部立体匹配算法

由于双目相机得到的图像具有2.2.1节中所述的“P和P(匹配12点)的v坐标相同”的约束,所以匹配点一定是同一行的像素点;且右图像的拍摄位置偏右,所以同一空间点在右图像中的对应点一定会偏左;此外,寻优过程一般会设置一个最大搜索范围maxoffset。对于左图像的每一像素,从右图像的同一位置开始,计算同一行内左侧maxoffset个像素的相似程度,并从中寻找最相似的像素作为匹配点,匹配点与初始搜索位置的距离就是视差。

但是现在得到的视差是以像素为单位的,可利用2.2.1节中的公式(2.2.4),得到以实际距离为单位的视差。

常用的相似度测量准则有灰度差的绝对值和(Sum of Absolute Differences,SAD)、灰度差的平方和(Sum of Squared Differences,SSD)、归一化交叉相关(Normalized Cross Correlation,NCC)等。

算法复杂度分析:根据前面的分析,局部匹配需要为左图像中的每个像素设置支持窗口,并在右图像中匹配最接近的支持窗口,计算相似度要求遍历两个窗口内的所有像素。在局部匹配算法中,支持窗口一般为滑动性支持窗口,也就是说,每个像素都会依次与同一行中最大搜索范围内的所有像素进行比较。假设支持窗口的边长为kernel,规定匹配点的搜索范围为maxoffset,那么复杂度为O(H×W×2maxoffset×kernel)=O(H×W×maxoffset),其中,H和W分别是图像的高度和宽度,需要说明的是,O(·)表示与括号内的变量同量级的变量,所以当kernel不为1时,以上等式仍成立。

2.2.2.2 全局(Global)立体匹配算法

相比于局部立体匹配算法,全局立体匹配算法引入了相邻像素视差之间的约束关系,保证相邻像素之间视差的变化较平缓,这就是其中“全局”的含义。该算法定义了由数据项和平滑项组成的能量函数,能量函数的自变量为左图像中各像素的视差,也就是说,在使用全局立体匹配算法之前,需要给定各像素初始的“试探性”视差。

在给定视差之后,每个像素的数据项表示在该视差下的匹配代价,也就是该视差对应的右图像中的像素与此像素的相似度,视差与右图像中像素的对应关系:假设该像素在左图像中的坐标为 (u ,1v),视差为d,则对应的右图像像素的坐标为(u-d,v)。与局部111立体匹配算法不同,最终得到的视差对应的相似度不一定是最大的,因为还会有“平滑项”的影响;平滑项表示该像素的视差与邻近点视差的差别,邻近点是指该像素邻域内的点,这里的“差别”一般用“差的绝对值和”来度量。

整个全局匹配过程就是求解能量函数最小时各像素的视差值。计算过程:根据当前输入的视差值,计算出各像素的数据项和平滑项,从而得到当前的全局能量函数,然后逐步调整视差输入,重新计算能量函数,直到能量函数的值最低,此时的视差输入即对应最佳匹配。

算法复杂度分析:能量函数在2D图像中寻找最优解的问题是多项式复杂级别的非确定性问题,即NP-complete问题,非确定性问题是只能用假设—验证的方法解决的问题,在实际中需要进行迭代求解;与此相对,确定性问题就是可以直接求解的问题。[3]

2.2.2.3 半全局立体匹配算法(Semi-Global Matching,SGM)

局部立体匹配算法快速简单,全局立体匹配算法精度高,半全局立体匹配算法在一定程度上结合了二者的优点,该算法数据项的计算与全局匹配算法类似,而将平滑项的计算简化到若干个(一般为8个或16个)一维路径上去,将计算得到的视差的平均值作为最终的视差,从而避免了2D平面上的计算,提升了效率,同时将非确定性问题转化为确定性问题。对于每个一维路径,某一像素的平滑项只与该路径上的前一像素的视差有关,而全局立体匹配中的平滑项与该点邻域内的所有点均相关,因此半全局立体匹配算法既不需要给定初始视差,也不需要迭代,从而大大简化了计算。假设使用8个一维路径计算平滑项,其中的四个路径如图2.2-5所示,另外四个路径与该四个路径方向相反,图中圆圈代表像素,箭头代表像素视差依次计算的顺序,每个圆圈的能量函数由它本身确定的数据项和它与前一个圆圈共同确定的平滑项给出,该能量函数取最小值时的视差为该像素的最终视差。图2.2-5 半全局算法的四个路径

算法复杂度分析:数据项计算复杂度等同于局部算法;对于平滑项,在每一搜索路径上都只保证当前像素与前一像素视差接近,所以单个搜索路径计算平滑项的复杂度为O(H×W×maxoffset),算法总2的复杂度为O(H×W×maxoffset×(kernel+N))=O(H×W×maxoffset),半全局立体匹配算法的复杂度与局部立体匹配算法的复杂度为同一数量级。

以上三种算法在不同的场景和目标下均有各自的应用。局部立体匹配算法简单地将相似度作为匹配的唯一准则,而未考虑相邻像素视差的平滑问题,所以其运行速度最快,而准确度却无法保证,所以适用于对匹配准确性要求不高的场景。全局立体匹配算法保证了像素视差与周围像素视差的平滑变化,使得各点视差不再孤立,但是这也导致了视差无法独立求解,需要进行全局假设和迭代,所以运行速度非常慢,而准确度很高,适用于对准确性要求很高的非实时系统。半全局立体匹配算法使用若干次一维平滑来代替全局平滑,既保证了相邻视差的平滑性,又使得计算量不至于太大,所以半全局立体匹配算法是目前商业软件中使用最多的立体匹配算法。

在各类3D相机中,双目相机的结构最为简单,只需两个普通的相机和一个处理器,所以其成本也较低;并且双目相机直接采集环境光来形成图像,所以在室内和室外均可使用。

但是双目相机也有一些固有的局限,其中最重要的是计算量的问题。双目相机采用纯视觉的方法,需要逐像素进行匹配,因此双目匹配算法的计算量普遍较大;而且双目相机对光照非常敏感,在光照较强(会出现过度曝光)和较暗的情况下,匹配算法的效果都会急剧下降。

另外,双目相机不适用于单调、缺乏纹理的场景。因为双目视觉根据视觉特征进行图像匹配,所以对于缺乏视觉特征的场景(如天空、白墙、沙漠等),会出现匹配困难甚至匹配失败的情况。纹理丰富和纹理缺乏的场景对比如图2.2-6所示。图2.2-6 纹理丰富和纹理缺乏的场景对比

对物体本身特征的依赖是双目视觉的一大固有问题,为此人们想到了主动向场景中投射特征化光源的方法——结构光法,结构光自带大量特征点,从而可以摆脱对物体本身特征的依赖。2.3 结构光3D相机

2.2节讲解了通过双目测距获取深度的方法,但是在双目测距中,基于图像匹配的方法有一个很大的难点,由于其光源是环境光或者白光这类没有经过编码的光源,图像识别完全依赖于被拍摄物体本身的特征点,导致匹配的精度和准确性很难保证。双目测距是一种被动测距方法,它获取的图像是被动接收物体反射的自然光得到的,因此缺少特征点,那么我们可不可以通过主动投射包含丰富特征的光源来解决这一问题呢?由此出现了结构光测距技术,这是一种主动测距技术,其对投射光源进行了特征化,解决双目视觉特征点难以匹配的问题。2.3.1 结构光相机原理

顾名思义,结构光是一种具有特定模式、特定结构的光,即对投射光源进行结构化与特征化编码,简单的结构化包括点、线、面等模式图案,复杂的结构化涉及光学图案的编码。结构光测距技术的独特之处即是利用了这些经过编码与特征化的投射光源。如图2.3-1所示,投影仪将含有特定模式图案的结构光投射至物体表面,模式图案遇到物体表面会发生形变,相当于被物体表面高度所调制,图案的形变程度取决于投影仪与相机之间的相对位置和物体表面高度,再由相机捕捉这些被调制过的结构光,利用三角测距原理计算模式图案的形变程度,从而得到物体的深度信息。投影仪、相机和计算机系统构成[4]了结构光3D视觉系统。图2.3-1 结构光3D视觉系统示意图

结构光测距技术使用了三角测距原理,如图2.3-2所示,点P和点I分别是投影仪和相机的光学中心,它们之间的距离为d。相机光轴与投影仪光轴相交于点O,设过点O且与光轴垂直的平面为参考面XY平面,其与点P和点I之间的距离为L,物体的高度h为物体表面相对于参考面的距离。图2.3-2 三角测距原理示意图

利用投影仪将特定的结构光投射到参考面上,然后用相机捕获。当没有物体放置在参考面上时,投影仪投射的光在参考面上的相位值[4]是沿X轴单调变化的,对图像进行相位展开,即可求解参考面上各点的绝对相位值。当没有物体存在时,对于参考面上的点A、点B,其在相机成像平面上的位置为A′、B′,相位值为φ、φ;然后,将被AB测物体放置于参考面上,则投影仪的投射光线PA与物体表面相交于点H,且其在相机成像平面上的位置为之前B′的位置,其相位为之前点A的相位,即φ=φ,从相机捕获的图像来看,相当于参考面上的HA点A移动到了点B的位置,即由于物体的存在,投影仪投射的光受到了相位调制。图中的△ABH与△PIH为一对相似三角形,若我们知道AB的距离,则可以利用三角形的相似原理,得到点H的深度h:

其中,h为被测物体表面的点H相对于参考面的高度,L和d为该测量系统的参数。

在相机成像平面上,点B′的相位从参考面上捕获时为φ,而从物B体表面捕获时为φ=φ,由此可以求得该像素在被测物体放置前后的HA相位差Δφ(x,y。可以证明,Δφ(x,y与之间的关系为,f为所投射的结构光的频率,则可以得到被0测物体表面高度:2.3.2 结构光的分类

根据投射的光模式的不同,结构光法又可分为光点式结构光法、光条式结构光法和光面式结构光法。

2.3.2.1 光点式结构光法

光点式结构光法又称为点结构光法,类似于激光三角法,其利用激光器等设备投射一个点光源到物体表面上,通过相机获取光点的2D图像坐标。由于相机光线和激光光束在光点处相交,这样就形成了三角几何关系,从而可以获得光点在3D空间中的位置,如图2.3-3所示。图2.3-3 光点式结构光法示意图

光点式结构光法需要通过逐点扫描物体进行测量,每次获得的信息量少,当被测物体增大时,图像获取时间和图像处理量急剧增加,不适合进行实时测量;而且机械扫描机构增加了系统的复杂性与不稳定性;测量精度随测量范围变化而变化,从几微米到一毫米不等;测量精度随入射角(光束与被测点法线的夹角)的增加而降低,有时甚至会出现测量失效的情况。

2.3.2.2 光条式结构光法

光条式结构光法又称为线结构光法,其示意图如图2.3-4所示,其基本原理是利用线光源产生的光平面照射被测物体,由于被测物体表面凹凸不平,可形成受表面轮廓调制的光条纹,通过CCD摄像头及数字信号处理器(DSP)可获得光条纹的数字图像,在计算机处理过程中,依次提取光条纹的轮廓线,一次轮廓提取能完成一个截面的2D轮廓测量,移动被测物体或激光测量系统,让光切面按一定间隔扫描物体表面,将一定间隔的2D截面轮廓组合起来,即能得到该目标物体表面的3D轮廓信息。图2.3-4 光条式结构光法示意图

线结构光法的精度略低于点结构光法,但精度也可达到微米级。其光学与机械结构简单,费用低廉。与点结构光法相比,线结构光法采集的信息量大大增加,测量速度大大提升,而实现的复杂度并没有增加。它只需要在一个方向上进行扫描,因此只需要一个位移平台就可以完成对整个物体3D表面的扫描,不仅缩短了扫描时间,而且降低了仪器的成本和扫描控制的复杂度。

但是线结构光法也有一些不足。线结构光法缺乏随意性,因为其大多采用台架式结构,只能对放置在特定载物台上的物体进行测量。由于光线行进的直线性,被测物体不一定全部处于结构光场中,导致物体的两头容易出现截头现象。

2.3.2.3 光面式结构光法

光面式结构光法又称为面结构光法,其示意图如图2.3-5所示,该方法主要通过投影仪投射结构图像到被测物体表面上,通过CCD接收,在计算机中对接收图像进行解码,就可得到每个透射光点的角度,再根据三角测距原理就能计算出物体表面的深度信息。图2.3-5 光面式结构光法示意图

在该方法中,由投影仪一次性向物体表面投射多条光条,从而形成2D结构光图案,这样不需要进行扫描就可以实现3D轮廓测量。一方面,提高了图像处理的效率,加快了测量速度;另一方面,增加了被测物体表面的信息量,能够获得物体表面更大范围的深度信息。与线结构光法相比,面结构光法的测量效率和测量范围大大提高和增加,但同时引入了光条识别的问题,而且增加了标定的复杂度。2.3.3 结构光的标定与匹配

通常来说,在构建结构光3D视觉系统时需要解决的两个重要问题是标定和匹配。标定是为了确定结构光相机系统的结构参数,匹配是为了确定投影图像与编码图案对应点的对应关系。

2.3.3.1 标定与补偿

标定是构建结构光3D视觉系统的关键一步,它建立了3D空间的物像关系,直接影响后期3D测量的精度。结构光系统的标定包括相机标定和投影仪标定,具体来说,就是要确定相机和投影仪的内部几[5]何参数、光学成像参数及其相对于世界坐标系的方向和位置参数。经过多年的广泛研究,相关的标定原理和方法已经非常成熟,包括线[6][7]性变换法、两步标定法等,基于两步标定法的思想,张正友提出[8]了平面标定法,通过采集平面标定板在不同位置的多幅图像,利用奇异值分解和极大似然准则求解标定参数。该标定方法过程简单,易于操作,灵活性高,标定板制作简单、成本低廉,因而得到了广泛应用。

在结构光系统中,多种因素都会引起测量误差,其中最主要的是镜头非线性畸变、相移误差和非正弦波形误差。镜头非线性畸变在含有光学镜片的系统中普遍存在,这类误差可通过对相机镜头进行标定来解决。相移误差是由相移步距的不准确性导致的,它常常是不可避免的,但可通过采用精密的相移装置和实时相移校正技术来减弱其影响。而随着数字显示技术的发展,数字投影仪广泛应用于结构光系统,在数字投影仪中,可以通过数字相移消除相移误差,此时非正弦波形误差成为影响测量精度的主要因素。非正弦波形误差是由投影仪和相机系统中存在的Gamma非线性畸变引起的,投影仪和相机的亮度传递函数是非线性的,导致采集到的光栅条纹并不是理想的正弦波形,而是带有畸变的。为了补偿非正弦波形误差,通常采用查表法来修正[9],通过事先计算系统的Gamma值,预先计算误差值,生成系统误差查找表,根据查找表来补偿修正误差。

2.3.3.2 匹配与编码

我们之前讲过,结构光的优势在于其光源提供了很多的匹配角点或者直接的码字,可以很方便地进行特征点的匹配。那么这些特征点或者码字具体是如何进行对应与匹配的呢?这就依赖于结构光的编码。结构光编码主要是指对投射到物体表面的投射图案进行编码,通过对包含编码的照片进行解码和3D重构,对特征点进行提取,实现投影图像与编码图案的匹配。编码方法的选择关乎解码的准确性,并且对投影物平面和相机图像平面的匹配有重要影响,直接影响系统的测量精度和测量效率,是结构光3D视觉的核心技术和研究重点之一。为了实现准确的匹配,需要采用有效的结构光编码方法。

从大类上,结构光编码可以分为直接编码、时间编码和空间编码。直接编码利用投射光线的特性,直接为编码图案的每个像素设定一个码字;时间编码按时间顺序依次投影多幅图案,每次投影为每个像素产生一个码值,从而生成与每个像素一一对应的码字;空间编码则只需投影一幅编码图案,利用相邻像素的信息来产生码字。

1.直接编码

直接编码分为直接灰度编码和直接彩色编码。直接灰度编码根据图像灰度的不同形成编码,其原理示意图如图2.3-6所示,每一个灰度级别对应一个码字;直接彩色编码则使用许多不同的颜色形成编码图案,每一种颜色对应一个码字,为了提高投影图案的分辨率,需要利用较多颜色。然而,在直接编码中,相邻像素的色差很小,往往对噪声相当敏感。此外,图像颜色会受测量表面颜色的影响,因此直接编码法的应用范围通常仅限于中性色或灰白色目标物。直接编码法对每个像素都进行了编码,在理论上可以达到较高的分辨率。但由于受环境噪声影响较大,测量精度较低。图2.3-6 直接灰度编码原理示意图

直接编码在解码时,使用相机获取两幅不同光强下的场景图像,一幅为编码投影下的图像,另一幅为均匀光照下的图像,利用两幅图像中每个点的像素值之比,建立投影图像与各像素的对应关系。由于要投影两幅图案,直接编码法不太适用于动态场景。

2.时间编码

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载