欢迎来到天天文库
浏览记录
ID:14654403
大小:1.41 MB
页数:12页
时间:2018-07-29
《kinect+openni学习笔记之2(获取kinect的颜色图像和深度图像)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Kinect+OpenNI学习笔记之2(获取kinect的颜色图像和深度图像) 前言 网上有不少使用Qt做界面,OpenNI为库来开发kinect。或许大家的第一个问题就是询问该怎样使用Kinect来获取颜色信息图和深度信息图呢?这一节就是简单来回答这个问题的。 开发环境:QtCreator2.5.1+OpenNI1.5.4.0+Qt4.8.2 实验说明: 在使用OpenNI来驱动读取kinect数据时,我们需要了解contextobject这个名词。查看了下OpenNIUserGu
2、ide文档,简单翻译下这个名词的意思: Context是openNI中一个主要的object,它掌握了OpenNI使用过程中应用程序的全部状态,以及这些状态的prodectionchains,一个应用程序有多个context,但是这些context之间不能共享信息。例如一个中间件节点不能使用另一个context的驱动节点。Context在使用前必须被立即初始化,因此此时所有嵌入的模块被下载和分析。为了释放context的内存,应用程序需调用shutdown程序。 虽然翻译得不准确,
3、但是它的大概意思就是告诉我们在驱动kinect时,需要用到context这个类,且我们需要安装一定顺序去使用,这与一些常见的库驱动差不多,比如opengl,这些都需要什么初始化啊,设置属性啊等。因此我们只需要直接去看懂他人的一个工程实例就ok了。 好了,本文参考Heresy的教程中的源码写的。 在新建好工程文件后,需要包含XnCppWrapper头文件,且需在Qt工程中设置好头文件目录和库文件目录。 使用OpenNI读取颜色图和深度图的步骤如下(这个是程序的核心部分): 1.定义一个Con
4、text对象,并调用该对象的Init()方法来进行初始化。 2.定义一个XnMapOutputMode格式对象,设置好分图像分辨率和帧率。 3.定义颜色图和深度图的节点对象,并用其Create()方法来创建,参数为Context对象. 4.设置颜色和深度图的输出模式,调用的方法是SetMapOutputMode();参数为步骤2中定义和设置好了的XnMapOutputMode对象。 6.如果深度图和颜色图在一张图上显示,则必须对深度图像进行校正,校正的方法是调用深度图的如下方法:.GetA
5、lternativeViewPointCap().SetViewPoint(); 7.调用context对象的StartGeneratingAll()来开启设备读取数据开关。 8.调用context对象的更新数据方法,比如WaitAndupdateAll()方法。12 9.定义颜色图和色彩图的ImageMetaData对象,并利用对应的节点对象的方法GetMetaData(),将获取到的数据保存到对应的ImageMetaData对象中。 10.如果需要将深度图转换成灰度图来显示,则需要自己
6、将深度值转换成0~255的单通道或者多通道数据,然后直接用来显示。 注意如果没有设置视觉校正,则深度图的显示与颜色图的显示会出现对应不上的情况,后面的实验可以看出这2者的区别,另外对于是否需要设置镜像就要看自己的具体应用场合了。 实验结果: 下面分别分是否设置图像镜像,是否对深度图像进行校正来给出实验结果. 无镜像无校正: 12 无镜像有校正: 有镜像无校正: 12 有镜像有校正:12 从有无镜像可以看出,设置镜像的效果与字面的理解是一样的,即有镜像时就相
7、当于取镜子中的图像。有无校正可以看出,没有校正时,深度图片和颜色图片同一个物体都对应不起来,可以看下天花板上的吊灯就可以发现,没校正,2者不重合,且相差不少。有校正时效果就好多了,只是此时的深度图像显示的范围要稍小些。 实验主要部分代码及注释(附录有工程code下载链接): 首先来个最小工程,即去掉那些错误处理代码: main.cpp:#include#include//包含OpenNI的头文件12usingnamespacexn;//使用Op
8、enNI库中的命名空间//全局的OpenNIobjectContextg_context;ImageGeneratorg_image_generator;DepthGeneratorg_depth_generator;//全局的QtObjectQGraphicsPixmapItem*g_image_map;QGraphicsPixmapItem*g_depth_map;//CTimer类的定义classCTimer:publicQObject{public:voidstart(){
此文档下载收益归作者所有