Kinect for Windows 实践笔记NO.1 彩色图像显示

Visual Studio 2010+OpenCV 2.44+Kinect SDK

#include "StdAfx.h"
#include <iostream>
#include "Windows.h"
#include "NuiApi.h"
#include "cv.h"
#include "highgui.h"

using namespace std;

int main(int argc,char * argv[])
{
	IplImage *colorImage=NULL;
	colorImage = cvCreateImage(cvSize(640, 480), 8, 3);

	//初始化NUI
	HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_COLOR);
	if( hr != S_OK )
	{
		cout<<"NuiInitialize failed"<<endl;
		return hr;
	}
	//定义事件句柄
	HANDLE h1 = CreateEvent( NULL, TRUE, FALSE, NULL );//控制KINECT是否可以开始读取下一帧数据
	HANDLE h2 = NULL;//保存数据流的地址,用以提取数据

	hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_COLOR,NUI_IMAGE_RESOLUTION_640x480,0,2,h1,&h2);//打开KINECT设备的彩色图信息通道

	if( FAILED( hr ) )//判断是否提取正确
	{
		cout<<"Could not open color image stream video"<<endl;
		NuiShutdown();
		return hr;
	}

	//开始读取彩色图数据
	while(1)
	{
		const NUI_IMAGE_FRAME * pImageFrame = NULL;

		if (WaitForSingleObject(h1, INFINITE)==0)//判断是否得到了新的数据
		{
			NuiImageStreamGetNextFrame(h2, 0, &pImageFrame);//得到该帧数据
			INuiFrameTexture *pTexture = pImageFrame->pFrameTexture;
			NUI_LOCKED_RECT LockedRect;
			pTexture->LockRect(0, &LockedRect, NULL, 0);//提取数据帧到LockedRect,它包括两个数据对象:pitch每行字节数,pBits第一个字节地址
			if( LockedRect.Pitch != 0 )
			{
				cvZero(colorImage);
				for (int i=0; i<480; i++)
				{
					uchar* ptr = (uchar*)(colorImage->imageData+i*colorImage->widthStep);
					BYTE * pBuffer = (BYTE*)(LockedRect.pBits)+i*LockedRect.Pitch;//每个字节代表一个颜色信息,直接使用BYTE
					for (int j=0; j<640; j++)
					{
						ptr[3*j] = pBuffer[4*j];//内部数据是4个字节,0-1-2是BGR,第4个现在未使用
						ptr[3*j+1] = pBuffer[4*j+1];
						ptr[3*j+2] = pBuffer[4*j+2];
					}
				}

				cvShowImage("colorImage", colorImage);//显示图像
				
			}
			else
			{
				cout<<"Buffer length of received texture is bogus\r\n"<<endl;
			}
			//释放本帧数据,准备迎接下一帧
			NuiImageStreamReleaseFrame( h2, pImageFrame );
		}

		if (cvWaitKey(30) == 27)
			break;
	}
	//关闭NUI链接
	NuiShutdown();
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值