APP下载

一种从融合颜色信息和深度信息的PNG文件中提取点云数据的方法

2018-05-03赵矿军

关键词:深度图彩色图像灰度

赵矿军

(漳州职业技术学院 信息工程学院, 福建 漳州 363000)

眼睛是我们人类最重要的外部视觉器官,人们在日常生活中接收的大量信息中80%以上都是通过视觉获得的。随着社会的不断发展,信息技术的跨越式进步,二维视觉信息已不能满足人们对现实世界大量信息的需求,层出不穷的三维视觉技术也越来越多地应用到人们的生活、学习和工作当中。三维视觉技术的应用领域范围大小与三维传感设备获取目标原始信息的方式是紧密相关的。

通过传感器获取原始信息的手段大致有三种:使用光学摄相机获取彩色或者灰度图像、使用激光雷达获取点云数据、通过结构光法获取场景点云数据。可以看出,不论采用何种手段,获取的原始信息可以分为:彩色图像信息、深度信息与空间点云信息[1]。从本质上讲,深度信息与点云信息同属于一类信息,深度信息可以由一些简单的转换算法转换成为点云信息。有了深度图也就有了点云数据。深度图的生成主要有两种途径,一类为间接估计法,通过对深度线索的估计来确定深度信息,这种方法无需特定的辅助设备,难点在于三维信息失真复原和执行算法复杂度的问题。一类是直接测量法,使用传感器,如Kinect深度摄像机等具有直接获取深度信息功能的设备。这种方法对于室内场景可以获得相对较为准确的深度信息,对于室外场景信息则采用激光雷达比较合适[1-4]。若采用Kinect深度摄像机来获取RGB彩色信息和深度信息,一般情况下是将两种信息分别保存为两张PNG文件,然后通过开放平台PCL点云库读取彩色信息和深度信息完成三维点云数据的重现。由于前期使用Kinect传感器获得的RGB图像和Depth图像的数量庞大,将其融合到一张图像文件中就可以大大减少三维数据还原的工作量,Che-Wei Lee[2]在其论文中也提出了可在Alpha通道中实现数据隐藏功能,所以本文提出了一种将彩色信息和深度信息融合于一张PNG文件的方法,将场景深度值隐藏于PNG文件的Alpha通道中,在使用过程中从合成后的PNG图像中的Alpha通道里将图像的深度信息提取并在OpenFrameworks框架下完成点云模型的生成。

1 深度信息的PNG隐藏

1.1 深度图像获取

1.1.1 深度图像

获取室内场景相对于观测者的深度距离是完成计算机视觉算法重建视场三维信息的重要任务之一。这个深度值可以用深度图来表示,也就是将从深度图像采集传感器到视场中的各点距离(深度数值)作为图像的像素值,反映了景物表面的基础几何形状[2]。目前,深度图像的获取方法有计算机立体视觉成像、激光扫描仪成像法、坐标测量机法、结构光法、莫尔条纹法等等。微软公司在游戏市场推出了一款体感设备Kinect,除了获取RGB彩色图像的摄像机之外,Kinect的深度传感装置由两部分构成,分别位于RGB图像摄像头左右两边的红外线发射器和红外线CMOS摄像机,可获得景物深度信息。由微软提供的API接口获取的深度图中,像素值越大,代表距离越近;像素值越小,代表距离越远。Kinect红外摄像机的视场是如图1所示的金字塔形状。物体离摄像机越远则拥有更大的视场横截面积。基于结构光的深度图像采集技术已经广泛应用于工业视觉等领域,因为在这种应用中可以很容易地控制场景照明。但它还是无法获取摄像机或光源看不到的物体点的数据。所以在使用Kinect传感器所采集的深度图像将会有空洞现象存在,需要经过算法处理将空洞进行修补填充。

图1 Kinect有效视角场

深度图像和通常所说的二维光学图像是有区别的,深度图像中的每一个像素就代表了一个相对的深度信息,也就是说每个像素都包含了整个场景下一个三维坐标值。深度图像数据反映了视场景物表面的三维空间信息,如果能够将这些信息有效地存储则可以更加快捷、方便地完成景物的三维信息提取,以此为基础实现有效的三维点云信息分析和三维空间数据空洞修补。

1.1.2 图像深度

图像深度和深度图像是两个完全不同的概念。图像深度表示一个图像文件存储的每个像素所用的位数,主要用于度量图像的色彩分辨率,可以确定一张彩色图像的每个像素可能有的颜色数,或者说得到灰度图像的每个像素的灰度级数,它决定了彩色图像中可出现的最多颜色数,或灰度图像中的最大灰度等级。例如在一幅单色图像中,若每个像素用8位二进制位来表示,则最大灰度数目为28(256)。一幅彩色图像RGB中的红、绿、蓝3个分量的像素位数分别为4、4、2,则最大颜色数目为24+4+2(1024),换句话说就是像素的深度为10位,每个像素可以表达1024种颜色中的一种。在OpenCV中有几种不同深度的数据格式,其特性统计如表1所示。

表1 不同深度的数据格式

而深度图像则是以景深值代替灰度图像的灰度级而形成的图像,从表面看,就像一幅黑色的画布,其实里面包含观测者视角的景物深度信息,在深度图像中没有由于物体光滑表面上纹理及光照的阴影所产生的麻烦,可以得到三维实体更可靠的空间几何信息。所以,深度图像越来越受到图像分析处理、计算机机器视觉等研究领域的重视,在回过头来看图像深度则仅仅是在保存图像信息时每个像素所用的位数,位数越大表示像素信息量就越大,所以需要严格区分它们的概念与表达的含义。

1.1.3 彩色图像及深度图像的获取

RGB彩色图像包含景深颜色信息,而深度图像中包含更精确的三维几何信息。基于Opencv函数库,在使用Kinect摄像机进行三维空间数据的获取时,当定义了如下不同深度的时候,像素的灰度值要处于显示范围之中才可以显示出来,否则还要进行数据格式的转换。通过开OpenCV框架获取的深度信息的单位是mm,算法中定义的变量用12位数表示深度值,最大值为4095代表4.095 m,所以Kinect传感器采集到的深度数据需要扩展到灰度图,必须乘一个因子255/4095,表示转换后的灰度值每变化1,就代表kinect采集到的深度值变化了16 mm[4]。本文使用OpenCV库cvSaveImage方法得到的深度图是一幅后缀为PNG格式的灰度图像,如图2(b)所示。以下为采集RGB图像和Depth图像的关键代码(包含语句分析):

IplImage* imgDepth16u=cvCreateImage(cvSize(640,480),IPL_DEPTH_16U,1);// 定义深度图的IplImage对象

IplImage* imgRGB8u=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);// 定义RGB的IplImage对象

memcpy(imgDepth16u->imageData,depthMD.Data(),640*480*2);// OpenCV输出

cvConvertScale(imgDepth16u,depthShow,255/4096.0,0);// 12位转8位

cvSaveImage(.depth_png,imgDepth16u);// 保存深度图像

cvSaveImage(. gb_png,imgRGB8u);// 保存RGB图像

(a)RGB图 (b)深度图图2 Kinect传感器采集的RGB图和深度图

Kinect传感器所获取的深度值最大是4096 mm,当出现0时表示深度值未确定,Kinect摄像机测距的有效范围在800~4000 mm之间,一般情况下会将0值过滤,采纳1220~3810 mm范围内的值作为有效数据。在使用OpenNI框架下所获取的深度帧数据中,每个像素占16位,即每一个像素占2个字节。每一个像素的深度值只占用了16个位中的13个位,如图3所示。

图3 深度图中的深度数据位

后续的三维点云数据提取是要进行归一化处理,然后将压缩后的13位深度数据从图像文件中提取出来,使用cvConvertScale(imgDepth16u,depthShow,255/4096.0,0)方法完成数据的转换。

1.2 PNG文件格式

可携式网络图像(Portable Network Graphics,PNG)是一种无损压缩的位图图形格式,当用PNG格式的文件存储灰度图像时,灰度图像的深度可达16位,存储彩色图像时,彩色图像可达48位,同时支持Alpha通道的透明/半透明特性,也支持图像亮度的Gamma校准信息。还可以存储附加文本信息,保留图像名称、作者、版权、创作时间、注释等附加信息。PNG格式有8位、24位、32位三种形式,其中8位PNG支持两种不同的透明形式(索引透明和Alpha透明),24位PNG不支持透明,32位PNG在24位基础上增加了8位透明通道,因此可展现256级透明程度。PNG8和PNG24后面的数字代表这种PNG格式最多可以索引和存储的颜色值,“8”代表28,也就是256色,而24则代表224,大概有1600多万色。最新的PNG标准允许在一个文件内存储多幅图像,因此可以使用Alpha透明通道保存其他数据信息而不一定是图像的透明度信息,这也为本文的实现提供理论支持。本文正是利用了Alpha通道的这一特性,将深度信息经过格式转换之后叠加在Alpha通道里,即将二维图像的深度信息隐藏到了图像的Alpha通道中。表2为PNG不同数据格式的分析比较。

表2 常用三种类型的PNG格式

1.3 Alpha通道的深度信息隐藏

图片保存透明度信息通常都是利用Alpha通道来完成。该通道是一个8位的灰度通道,用256级灰度来记录图像中的透明度信息,如果将一幅图像的深度信息保存在Alpha通道中,以透明度信息来表征深度信息成为一种可能。或者可以说把一幅图像的空间几何深度数据隐藏在PNG图片的Alpha通道中。

图4 融合深度信息到Alpha 通道后的PNG图像

将RGb.png的彩色图跟Depth.png深度图分别用cvLoadImage函数读出来,然后对于Image_rgb的彩色图,可以使用cvLoadImage方法将PNG图像的彩色图像RGB值存成三个通道,接着再使用IplImage数据结构创立一个自定义的信道格式“红色+绿色+蓝色+深度”的RGBAlphaImage对象,通过cvMixChannels混合通道函数融合彩色信息和深度信息的信道数据,源图片src跟输出图目标图片dst都要放在定义好的一维数组内,cvMixChannels函数的第一个自变量输入CvArr结构的图形数组,第二个自变量输入图形个数,第三个为输出的CvArr结构图形数组,再来就是输出的图形个数[9]。另外一个自变量,定义为红色、绿色、蓝色、深度4个信道的交换规则,在from_to的数组内,以两个为一组,分别为将输入的第0个通道置入输出的第二个信道,第一个信道放第一个信道,第二个信道放第0个信道,第三个信道放入第三个信道,由于输入为两张PNG图片,一张位RGB彩色图,一张为DepthMap深度图,总信道数为4,深度图为单信道unsigned char型别的矩阵型态,这边from_to就是用输出跟输入的总通道数做交换的。第五个自变量为被选取 多少通道数,有四个通道被混合,因此from_to的数组空间就为8。在进行cvMixChannels(src,2,dst,1,from_to,4)方法的调用后,就可实现4个通道数据的混合,并存储为融合了彩色信息和深度信息的RGB_Depth.png文件,如图4所示融合了深度信息到Alpha通道后的PNG图像。以下为融合RGB和Depth信息的关键代码:

Int from_to[]={0,2,1,1,2,0,3,3};

int main()

{IplImage *Image_rgb,*Image_depth;

IplImage *RGBAlphaImage;

CvSize Size1;

Image_rgb=cvLoadImage("rgb.png",1);

Image_depth=cvLoadImage("depth.png",0);

Size1=cvGetSize(Image_rgb);

RGBAlphaImage =cvCreateImage(Size1,IPL_DEPTH_8U,4);

CvArrconst *src[]={Image_rgb,Image_depth};

CvArr *dst[]={RGBAlphaImage };

cvMixChannels(src,2,dst,1,from_to,4);//将深度信息融合到PNG格式的Alpha通道

cvSaveImage(".RGB_Depth.png", RGBAlphaImage);

}

2 点云信息提取

融合深度信息到Alpha通道的PNG图像用Photoshop软件打开,在像素的信息栏即可看到该点像素的R、G、B及Opaqueness不透明度信息,实际上此处的不透明度信息即深度图像中该像素点的景深信息,如图5所示。

图5 Photoshop软件中信息面板上的透明度信息

当融合了深度信息到彩色信息中后,在Openframeworks平台下通过调用ofApp应用包即可将三维点云数据读出如图6所示[9-10]。主要代码如下所示:

图6 提取的三维点云数据

void ofApp::setup(){

ofSetVerticalSync(true);

img.load("RGB_Depth.png");//加载PNG文件

mesh.setMode(OF_PRIMITIVE_POINTS);

//将三维点云数据放入ofMesh中

int skip =1;//设置点云的密集度

ofColor cur=img.getColor(x,y);

if(cur.a>0){

//将Alpha编码为深度值,加载深度信息

float z=ofMap(cur.a,0,255,-300,300);

Z=(100-z)*4;

//透明度值每变化1,深度信息变化16 mm,归一化处理

ofVec3f pos(x,y,z);

mesh.addVertex(pos);}}}

ofEnableDepthTest();

glEnable(GL_POINT_SMOOTH);//平滑处理

glPointSize(3);//增加点的大小

}

3 结 论

通过Kinect传感器获取深度图像和彩色图像,使用OpenCV开源计算机视觉库提供的cvMixChannels函数将两张PNG图片的信道做混合,融合了视场的深度信息于彩色图像当中,合成一张PNG文件,提高了后续三维数据分析的使用效率。在Openframeworks平台下完成点云数据提取,通过设置密集度参数,增加平滑处理和像素点的大小处理过程很好地实现了三维点云彩色信息和深度信息的提取工作。从提取的三维点云数据结果来看基本达到要求,由于Kinect传感器自身的特点,采集的深度信息会有空洞现象。进而完成在进行深度信息融合时将一些空洞及不必要的信息通过算法填补或者剔除改进工作,以此更好的展现Kinect视场下的三维点云数据。

[参考文献]

[1] 徐曦.基于Kinect生成点云的物体非实时三维重建[D].昆明:云南大学,2016:5-6.

[2] LEE Che-wei,TSAIi Wen-hsiang.A data hiding method based on information sharing via PNG images for applications of color image authentication and metadata embedding[J].Signal Processing,2013,93(7):2010-2025.

[3] 张海荣.基于激光雷达的深度图像超分辨率技术研究[D].厦门:厦门大学,2015:12-15.

[4] 石曼银.kinect技术与工作原理的研究[J].哈尔滨师范大学自然科学学报,2013,29(3):83-86.

[5] 李智.基于kinect的同时定位与地图构建的研究[D].北京:北京交通大学,2016:14-15.

[6] 汤颖,孙康高.基于Kinect深度数据的视频艺术化处理[J].计算机科学,2017,44(增1):192-197.

[7] 肖峰.VC++下的BMP格式图像和PNG格式图像的转换[J].赤峰学院学报(自然科学版),2016,32(2):17-18.

[8] 卢冰.基于Kinect的室内场景三维重建方法研究[D].兰州:兰州理工大学,2016:20-50.

[9] 郑勇.基于Kinect的增强现实人手康复自然交互[D].南京:南京信息工程大学,2016:1-10.

[10] 王伟明,何亚轩,任彬,等.轨道车辆运行的增强现实仿真系统研究[J].图学学报,2017,38(4):577-581.

猜你喜欢

深度图彩色图像灰度
采用改进导重法的拓扑结构灰度单元过滤技术
一种基于WMF-ACA的深度图像修复算法
基于FPGA的实时彩色图像边缘检测
基于深度图的3D-HEVC鲁棒视频水印算法
基于最大加权投影求解的彩色图像灰度化对比度保留算法
一种基于局部直方图匹配的深度编码滤波算法
基于灰度线性建模的亚像素图像抖动量计算
叠加速度谱在钻孔稀少地区资料解释中的应用
基于颜色恒常性的彩色图像分割方法
基于Arnold变换和Lorenz混沌系统的彩色图像加密算法