`
小斤陈
  • 浏览: 33365 次
社区版块
存档分类
最新评论

Kinect开发教程二:OpenNI读取深度图像与彩色图像并显示

阅读更多

      细心的朋友肯定已经发现Kinect上长了三只眼睛,其中一个是彩色摄像头,另外两个深度摄像头,一个负责发射红外光,一个负责接收,这样,我们便能通过Kinect得到一幅彩色图像和一幅深度图像。如果大家对Kniect眼睛的技术细节感兴趣,请点击这里

      小斤的第一个范例,便是通过OpenNI得到彩色和深度图像咯,代码不长,其中一部分参考了Heresky童鞋的文章《透過 OpneNI 合併 Kinect 深度以及彩色影像資料》 ,此外,小斤补充了OpenCV的显示部分,使范例更为直观。

 

#include <stdlib.h>
#include <iostream>
#include <string>
//【1】
#include <XnCppWrapper.h>
#include "opencv/cv.h"
#include "opencv/highgui.h"

using namespace std;
using namespace cv;

void CheckOpenNIError( XnStatus result, string status )
{ 
	if( result != XN_STATUS_OK ) 
		cerr << status << " Error: " << xnGetStatusString( result ) << endl;
}

int main( int argc, char** argv )
{
	XnStatus result = XN_STATUS_OK;  
	xn::DepthMetaData depthMD;
	xn::ImageMetaData imageMD;

	//OpenCV
	IplImage*  imgDepth16u=cvCreateImage(cvSize(640,480),IPL_DEPTH_16U,1);
	IplImage* imgRGB8u=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
	IplImage*  depthShow=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
	IplImage* imageShow=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
	cvNamedWindow("depth",1);
	cvNamedWindow("image",1);
	char key=0;

	//【2】
	// context 
	xn::Context context; 
	result = context.Init(); 
	CheckOpenNIError( result, "initialize context" );  

	// creategenerator  
	xn::DepthGenerator depthGenerator;  
	result = depthGenerator.Create( context ); 
	CheckOpenNIError( result, "Create depth generator" );  
	xn::ImageGenerator imageGenerator;
	result = imageGenerator.Create( context ); 
	CheckOpenNIError( result, "Create image generator" );

	//【3】
	//map mode  
	XnMapOutputMode mapMode; 
	mapMode.nXRes = 640;  
	mapMode.nYRes = 480; 
	mapMode.nFPS = 30; 
	result = depthGenerator.SetMapOutputMode( mapMode );  
	result = imageGenerator.SetMapOutputMode( mapMode );  

	//【4】
	// correct view port  
	depthGenerator.GetAlternativeViewPointCap().SetViewPoint( imageGenerator ); 

	//【5】
	//read data
	result = context.StartGeneratingAll();  
	//【6】
	result = context.WaitNoneUpdateAll();  

	while( (key!=27) && !(result = context.WaitNoneUpdateAll( ))  ) 
	{  
		//get meta data
		depthGenerator.GetMetaData(depthMD); 
		imageGenerator.GetMetaData(imageMD);

		//【7】
		//OpenCV output
		memcpy(imgDepth16u->imageData,depthMD.Data(),640*480*2);
		cvConvertScale(imgDepth16u,depthShow,255/4096.0,0);
		memcpy(imgRGB8u->imageData,imageMD.Data(),640*480*3);
		cvCvtColor(imgRGB8u,imageShow,CV_RGB2BGR);
		cvShowImage("depth", depthShow);
		cvShowImage("image",imageShow);
		key=cvWaitKey(20);
	}

	//destroy
	cvDestroyWindow("depth");
	cvDestroyWindow("image");
	cvReleaseImage(&imgDepth16u);
	cvReleaseImage(&imgRGB8u);
	cvReleaseImage(&depthShow);
	cvReleaseImage(&imageShow);
	context.StopGeneratingAll();
	context.Shutdown();
	return 0;
}
 

 

  这边小斤由上到下解释一把:

【1】<XnCppWrapper.h>便是OpenNI的文件头了,使用OpenNI的话,目前只要include这个就行。

【2】 DepthGenerator和ImageGenerator,小斤称之为图像生成器,前者负责深度图像,后者负责彩色图像。创建一个生成器非常简单,首 先我们要初始化一个Context上下文,然后把Context作为Create函数的参数,便可以创建生成器了。

【3】XnMapOutputMode是用来设定生成器的参数的,这边小斤设定了分辨率为640*480(标准),30fps采样。

【4】 depthGenerator.GetAlternativeViewPointCap().SetViewPoint( imageGenerator)这句话也许会让大家疑惑,它是用来调整视角的。为什么要调整呢?因为Kinect的三只眼长在不同的地方,所以画幅一致的 深度摄像头和彩色摄像头,它们看出来的景物是有偏差的,这里OpenNI提供了函数进行对齐。这里,小斤把深度生成器的视角,设定为彩色生成器的视角。

【5】调用StartGeneratingAll()后,生成器们便开始上班了,如果要结束,就StopGeneratingAll()函数。

【6】 尽管生成器们在工作了,但他们一直忙着各读各的,没有人协调,自己不会乖乖把最新的资料给我们。我们调用getMetaData()方法前,需要使用 WaitAnyUpdateAll()、WaitOneUpdateAll()、WaitNoneUpdateAll()和 WiatAndUpdateAll()中的一种。功能如其名,这边小斤使用的是WaitNoneUpdateAll()函数,它比较暴力,不管生成器有没 有读到新数据,我这边先更新了再说。大家可以试试其它三个,看看效果。

【7】这边使用OpenNI获得图像MetaData数据后,小斤通过一系列函数,转换为OpenCV的IplImage图像类型,然后输出。主要参考了这篇文章

        对于深度MetaData,这边使用cvConvertScale转换尺度,成为灰度值[0,255]的灰度图。对于彩色MetaData,使用cvCvtColor转换色彩空间即可。按ESC键可以退出循环,结束程序。

        最终效果如下:

 

      在灰度图中灰度值0显示为黑色,255为白色,所以,离Kinect近的地方(桌面)显示为黑色,中间为不同程度的灰色,远处(天花板)显示为白色。


 

----------------------------------

作者:小斤(陈忻)

本文属于原创文章,如需转载引用请注明原文作者和链接,谢谢。

分享到:
评论

相关推荐

    OpenNI读取深度图像与彩色图像并显示,OpenCV调用openpose模型对OpenNI彩色图像进行姿态估计

    在计算机视觉领域,OpenNI(Open Natural Interaction)是一个开源框架,用于与传感器设备交互,如Kinect,以获取和处理深度图像和彩色图像。OpenNI提供了API,使得开发者能够轻松地读取和显示这些图像数据。另一...

    读取并显示Kinect彩色图和深度图的三种方法:代码

    读取并显示kinect彩色和深度信息的三种方式。 1.KinectSDK+MFC 方法是:利用KinectSDK读出彩色图和深度图,利用MFC窗显示 2.KinectSDK+OpenCV 方法是:利用KinectSDK读出彩色图和深度图,利用openCV显示 3.OpenNI和...

    Kinect读取深度图像和彩色图像并显示

    标题中的“Kinect读取深度图像和彩色图像并显示”是指使用微软的Kinect设备来获取和处理深度图像和彩色图像,并在Visual Studio 2008环境下进行显示。这个项目可能是一个基于C++或者C#的编程实现,因为Visual Studio...

    Kinect+OpenNI获取深度图和颜色图

    网上有不少使用Qt做界面,OpenNI为库来开发kinect。或许大家的第一个问题就是询问该怎样使用Kinect来获取颜色信息图和深度信息图呢?这一节就是简单来回答这个问题的。 使用OpenNI读取颜色图和深度图的步骤如下(这...

    kinect彩色图像对齐到深度并显示结果

    在本文中,我们将深入探讨如何将Kinect v1.8传感器获取的彩色图像与深度图像进行对齐,并在OpenCV库的帮助下显示它们的结果。这个过程称为彩色-深度配准,对于理解和处理来自Kinect的数据至关重要。 首先,让我们...

    kinect-v2彩色深度配准并修复深度图像并获取三维坐标

    Kinect V2是一款先进的传感器设备,它能够捕获高质量的彩色图像、深度图像以及红外图像。在处理这些数据时,一个常见的任务是进行彩色深度配准,即将深度图像与彩色图像对应起来,以便更好地理解场景的三维结构。在...

    Kinect采集深度和彩色图像并同时保存

    标题"Kinect采集深度和彩色图像并同时保存"涉及的是使用Kinect设备同时获取其深度图像和彩色图像,并进行实时保存的技术。深度图像记录了场景中每个像素点与Kinect传感器的距离信息,而彩色图像则提供了一个RGB色彩...

    使用OpenNI读取多个Kinect

    "使用OpenNI读取多个Kinect" ...使用OpenNI读取多个Kinect数据可以使用OpenNI库来访问和处理Kinect设备的数据,并使用OpenCV库来处理和显示深度数据。通过这种方式,我们可以实现多个Kinect设备的同时读取和处理。

    kinectV2.0深度图像与彩色图像的坐标映射

    4. **显示结果**:在同一个窗口中,同时显示深度图像和对应的彩色图像,用鼠标选取深度图像的点,实时显示其在彩色图像上的位置以及对应的深度值。 实现这个项目通常会使用编程语言如C++或Python,结合Kinect的官方...

    kinect获取深度和彩色数据并保存

    标题“kinect获取深度和彩色数据并保存”指的是利用微软的Kinect设备,通过编程方式获取其输出的深度图像和彩色图像数据,并将其保存到本地文件中。这通常涉及到计算机视觉、传感器技术以及图像处理等领域。 Kinect...

    kinectV2获取深度图像和彩色图像

    Kinect V2是一款由微软开发的体感设备,主要用于捕捉人体动作、深度信息以及色彩信息。在编程领域,开发者可以通过SDK来访问这些数据,实现各种有趣的应用,如虚拟现实、体感游戏、人机交互等。本文将详细介绍如何...

    opengl opencv openni读取显示kinnect相机

    OpenGL、OpenCV与OpenNI是计算机视觉领域...总之,结合OpenGL、OpenCV和OpenNI,我们可以实现与Kinect相机的交互,读取其数据并进行实时处理和显示。这为开发涉及人机交互、机器人导航、三维重建等领域应用提供了基础。

    Kinect运用OpenNI产生点云

    1. **数据获取**:首先,我们需要连接到Kinect设备,并通过OpenNI库读取其输出的深度图像。Kinect使用红外投影和传感器来计算场景中每个像素的距离,形成深度图。 2. **坐标转换**:深度图像的每个像素都包含一个...

    基于Kinect的openNI开发包

    1. **openNI框架**:openNI提供了统一的API,使得开发者可以轻松地访问和处理来自Kinect的原始数据,如RGB图像、深度图和骨架信息。 2. **Kinect传感器**:Kinect能捕捉到3D空间中的深度信息,通过算法计算出人体的...

    kinect SDK 彩色图像读取

    标题中的“kinect SDK 彩色图像读取”是指利用微软的Kinect开发工具包(SDK)来获取和处理来自Kinect传感器的彩色图像数据。Kinect是一款革命性的体感设备,它能捕获到用户的三维空间信息,包括深度、颜色和骨骼跟踪...

    kinect同时获取深度与彩色图片并保存

    Kinect是一款由微软开发的体感输入设备,它能够捕捉并处理人体的三维运动信息,同时提供彩色图像和深度信息。在本项目中,我们将深入探讨如何使用C#编程语言来实现通过Kinect同时获取彩色图像和深度信息,并将这些...

Global site tag (gtag.js) - Google Analytics