作者:Pontmercy
来源:微信公众号|3D视觉工坊(系投稿)
3D视觉精品文章汇总:https://github.com/qxiaofan/awesome-3D-Vision-Papers/
在上一篇中,我们介绍了什么是3D相机。但是对于初次接触3D相机的同学,可能首先面临的问题是如何处理3D相机得到的数据。3D相机的数据分为两种方式:三维点云数据方式,二维数据方式。其中,三维数据保存的格式有csv,txt,ply,stl等。二维数据通常以二维图像的形式存在,其中保存Z方向的二维图像被称为深度图像。本篇主要介绍一下深度图像的生成与处理。
1.前言
3D相机虽然也被称为相机,也可以得到二维的深度图像,但其实并不是由感光像元产生图像。2D相机和3D相机由于都有一个“相机”的名字,通常让不太了解的人产生困惑。我们用英文可能更容易理解。中文里的3D相机,在英文语境下其实常被称为3D sensor,并没有3D camera的说法,而2D相机,被称为2D camera或者camera。
Wenglor 相机示意图
如上图所示,一个典型的3D相机通常有一个2D相机和一个光源组成,光源的种类由其设计原理决定。3D相机的获取方式有很多种:单目立体视觉,双目立体视觉,三角测量法,结构光,TOF等等。因此它可能是白光、激光、投影仪,振镜等。
3D相机获取3D数据的方式有很多,但不论是哪种方法,3D相机都通过某种算法或者原理来得到一些位置的3D数据。对于一些3D方面的应用,这些3D数据便是所需要处理的数据,例如,对于用于三维重建,点云数据本身便是要处理的对象。但是对于另一些方面的应用,如工业检测里面的平面度,高度等等,点云格式的数据并不是一个很好的方式。
因此根据对后续的处理方式不同,3D相机得到的是3D数据保存方向有两种:一种是直接保存3D数据格式,相机可以直接导出三维数据,常见的如:点云通用格式PLY,STL,以及其他格式如CSV,txt等,这种情况下处理方式多为3D算法。支持这种保存方式的相机多用于3D重建, 地图引导等方向。相机采集到3D数据,用户用来处理和最终得到的也是3D数据。
但是,有些时候,这些数据方式并不是我们需要的。在工业视觉检测领域,这些数据有时候并不是很友好。这体现以下这些方面:常见的工业检测如高度,缺陷等,并不需要三维数据,只需要高度数据。同时这些3D数据在传输和处理方面无法之前的图像处理系统兼容。
因此,另外一种方式是保存成深度图像。工业相机多支持这种方式,它的好处在于:同时可以与之前的2D图像处理相融合,无论是数据传输还是处理,都可以非常方便地利用现有的图像处理算法和图像处理:例如LabVIEW,HALCON ,OpenCV。工业相机的厂商通常提供一种乃至多种传输协议来支持应用广泛的图像处理库来获取它们的深度图像。
2.3D相机与深度图像
2D相机的图像简单点儿说是像元感光直接成像的,就大多数相机而言,成像过程可以用小孔成像过程来描述。但是,3D相机则大为不一样。3D相机是先有三维的数据,而后生成的图像。深度图像不是由小孔成像和像元感光而产生的。而是通过某种方式计算生成的。
前面我们已经介绍过深度图像的生成,现在我们简单回顾下:深度图像的生成公式通常由厂商定义,但是并不是随心所欲。为了保证后续的使用,例如纹理贴图等,深度图像和2D图像通常具有位置一致性,换句话说,深度图像上的像素点和纹理图像中的像素点是一一对应的,这个特点在纹理贴图过程中非常重要。厂商的随心所欲更多地体现在XY图上。如果需要根据XY图来还原出XY方向的数据,则需要提前知道公式或者相机厂商提供的API,而深度图像则像纹理图像一样通过API直接获取。
如上图所示,深度图像上的像素点与纹理图上的像素点一一对应,基本上所有厂商都会进行保证这一点。
当然,如前面所说,在拥有3D数据之后,相机也可以不生成图像,直接以点云格式保存,常见的有:csv,txt,ply,stl等。2D数据保存方式则为深度图像,主打方向为3D重建,逆向工程的3D相机大多支持这些格式中的一种或者多种。
3.深度图像的处理
深度图像与其它灰度图像的不同之处,在于深度图像的灰度值代表着Z方向的深度信息,而不是被拍物体的表面纹理信息。深度图像的处理方向实际上也可以分为两种:一种是按照2D图像处理的方式对图像进行,另一种则是将深度图像还原成3D数据,之后再按照3D数据的方式进行处理。这时,深度图像其实只起到了一个存储和传输数据内容的作用。
当然这两种方式并不是泾渭分明的。为了完成一个项目,在实际中我们可能两种方式都会用到,例如先对深度图像做一些预处理,提取出我们想要的部分,再对这一部分单独生成点云,减小后续的工作量。这里为了介绍上的方便,我们依旧按照这两个方向进行介绍:
3.1 2D处理方式
以kinect的深度图像进行孔洞补全来进行介绍。实际上孔洞补全这种操作只在民用级别的深度相机上出现。Kinect相机以及类似的相机,容易受到太阳光甚至是日光灯的干扰,这时候它们的深度数据会在测量区域内出现大量的孔洞,而在工业相机里,除非材料反光、太阳光干扰以及表面形状导致的局部过曝等情况,否则很少出现大面积数据缺少的情况。
修复前 修复后
如上图所示,左图是Kinect采集得到的深度图,图像里有较大面积的缺失,这种缺失,这种缺失我们尝试采用2D的图像修复算法进行修复,修复后的效果如右图所示。
3.2 3D处理方式
工业3D相机采集到的数据在经过图像采集软件得到图像格式存储的数据之后,有时候需要将其还原成点云格式进行处理。厂商通常会提供这样的API或者函数。
图一:RGB图像 图二:点云显示(伪彩显示)
上图左一为相机通过HALCON导出来的图像,从它可以拆除深度图像,根据厂商提供的公式我们可以还原出XY方向信息,这样,我们就可以得到完整的3D信息,从而生成点云,如右图二。这样我们就可以利用点云处理的算法来处理数据。
备注:作者也是我们「3D视觉从入门到精通」特邀嘉宾:一个超干货的3D视觉学习社区
本文仅做学术分享,如有侵权,请联系删文。
3D相机虽然也被称为相机,也可以得到二维的深度图像,但其实并不是由感光像元产生图像。2D相机和3D相机由于都有一个“相机”的名字,通常让不太了解的人产生困惑。我们用英文可能更容易理解。中文里的3D相机,在英文语境下其实常被称为3D sensor,并没有3D camera的说法,而2D相机,被称为2D camera或者camera。
Wenglor 相机示意图
如上图所示,一个典型的3D相机通常有一个2D相机和一个光源组成,光源的种类由其设计原理决定。3D相机的获取方式有很多种:单目立体视觉,双目立体视觉,三角测量法,结构光,TOF等等。因此它可能是白光、激光、投影仪,振镜等。
3D相机获取3D数据的方式有很多,但不论是哪种方法,3D相机都通过某种算法或者原理来得到一些位置的3D数据。对于一些3D方面的应用,这些3D数据便是所需要处理的数据,例如,对于用于三维重建,点云数据本身便是要处理的对象。但是对于另一些方面的应用,如工业检测里面的平面度,高度等等,点云格式的数据并不是一个很好的方式。
因此根据对后续的处理方式不同,3D相机得到的是3D数据保存方向有两种:一种是直接保存3D数据格式,相机可以直接导出三维数据,常见的如:点云通用格式PLY,STL,以及其他格式如CSV,txt等,这种情况下处理方式多为3D算法。支持这种保存方式的相机多用于3D重建, 地图引导等方向。相机采集到3D数据,用户用来处理和最终得到的也是3D数据。
但是,有些时候,这些数据方式并不是我们需要的。在工业视觉检测领域,这些数据有时候并不是很友好。这体现以下这些方面:常见的工业检测如高度,缺陷等,并不需要三维数据,只需要高度数据。同时这些3D数据在传输和处理方面无法之前的图像处理系统兼容。
因此,另外一种方式是保存成深度图像。工业相机多支持这种方式,它的好处在于:同时可以与之前的2D图像处理相融合,无论是数据传输还是处理,都可以非常方便地利用现有的图像处理算法和图像处理:例如LabVIEW,HALCON ,OpenCV。工业相机的厂商通常提供一种乃至多种传输协议来支持应用广泛的图像处理库来获取它们的深度图像。
2.3D相机与深度图像
2D相机的图像简单点儿说是像元感光直接成像的,就大多数相机而言,成像过程可以用小孔成像过程来描述。但是,3D相机则大为不一样。3D相机是先有三维的数据,而后生成的图像。深度图像不是由小孔成像和像元感光而产生的。而是通过某种方式计算生成的。
前面我们已经介绍过深度图像的生成,现在我们简单回顾下:深度图像的生成公式通常由厂商定义,但是并不是随心所欲。为了保证后续的使用,例如纹理贴图等,深度图像和2D图像通常具有位置一致性,换句话说,深度图像上的像素点和纹理图像中的像素点是一一对应的,这个特点在纹理贴图过程中非常重要。厂商的随心所欲更多地体现在XY图上。如果需要根据XY图来还原出XY方向的数据,则需要提前知道公式或者相机厂商提供的API,而深度图像则像纹理图像一样通过API直接获取。
如上图所示,深度图像上的像素点与纹理图上的像素点一一对应,基本上所有厂商都会进行保证这一点。
当然,如前面所说,在拥有3D数据之后,相机也可以不生成图像,直接以点云格式保存,常见的有:csv,txt,ply,stl等。2D数据保存方式则为深度图像,主打方向为3D重建,逆向工程的3D相机大多支持这些格式中的一种或者多种。
3.深度图像的处理
深度图像与其它灰度图像的不同之处,在于深度图像的灰度值代表着Z方向的深度信息,而不是被拍物体的表面纹理信息。深度图像的处理方向实际上也可以分为两种:一种是按照2D图像处理的方式对图像进行,另一种则是将深度图像还原成3D数据,之后再按照3D数据的方式进行处理。这时,深度图像其实只起到了一个存储和传输数据内容的作用。
当然这两种方式并不是泾渭分明的。为了完成一个项目,在实际中我们可能两种方式都会用到,例如先对深度图像做一些预处理,提取出我们想要的部分,再对这一部分单独生成点云,减小后续的工作量。这里为了介绍上的方便,我们依旧按照这两个方向进行介绍:
3.1 2D处理方式
以kinect的深度图像进行孔洞补全来进行介绍。实际上孔洞补全这种操作只在民用级别的深度相机上出现。Kinect相机以及类似的相机,容易受到太阳光甚至是日光灯的干扰,这时候它们的深度数据会在测量区域内出现大量的孔洞,而在工业相机里,除非材料反光、太阳光干扰以及表面形状导致的局部过曝等情况,否则很少出现大面积数据缺少的情况。
修复前 修复后
如上图所示,左图是Kinect采集得到的深度图,图像里有较大面积的缺失,这种缺失,这种缺失我们尝试采用2D的图像修复算法进行修复,修复后的效果如右图所示。
3.2 3D处理方式
工业3D相机采集到的数据在经过图像采集软件得到图像格式存储的数据之后,有时候需要将其还原成点云格式进行处理。厂商通常会提供这样的API或者函数。
图一:RGB图像 图二:点云显示(伪彩显示)
上图左一为相机通过HALCON导出来的图像,从它可以拆除深度图像,根据厂商提供的公式我们可以还原出XY方向信息,这样,我们就可以得到完整的3D信息,从而生成点云,如右图二。这样我们就可以利用点云处理的算法来处理数据。
备注:作者也是我们「3D视觉从入门到精通」特邀嘉宾:一个超干货的3D视觉学习社区
本文仅做学术分享,如有侵权,请联系删文。