Kinect开发环境配置:Kinect for Windows SDK + OpenCV2.4.9 + VS2013 + Win8(x86)

假设VS2013已安装并可以正常使用。


一. 安装和配置Kinect for Windows SDK v1.8


在官方网站(http://www.microsoft.com/en-us/kinectforwindowsdev/Start.aspx)下载Kinect for Windows SDK和Developer Toolkit:

KinectSDK-v1.8-Setup.exe (主要提供Kinect的驱动和设备访问接口)
KinectDeveloperToolkit-v1.8.0-Setup.exe (主要提供一些有助于开发的工具,包括Kinect Studio和多种编程语言的开发例程等)

按照默认选项安装完成后,接入Kinect,系统将会自动的搜索驱动进行安装。打开设备管理器查看驱动是否安装成功:



再打开Developer Toolkit Browser v1.8.0 (Kinect for Windows):



测试读取深度图像的例子:




二. 安装OpenCV2.4.9


从主页(http://opencv.org/)下载安装文件:

安装很简单,不用自己编译。假设安装在E盘 E:\opencv 。



三. VS2013配置


打开VS2013,新建project,命名为"KinectDepthData"。打开"VIEW"中的"Property Manager",打开"Debug | Win32"下的"Microsoft.Cpp.Win32.user":



OpenCV:

(1) Include files加入E:\opencv\build\include;
(2) Library files加入E:\opencv\build\x86\vc10\lib;
(3) 在Linker的Input中,添加Additional Dependencies(根据需要添加):
        opencv_core249d.lib
        opencv_highgui249d.lib
        opencv_video249d.lib
        opencv_imgproc249d.lib
        opencv_features2d249d.lib
        opencv_nonfree249d.lib
        opencv_legacy249d.lib
        opencv_calib3d249d.lib


Kinect:

(1) Include files加入C:\Program Files\Microsoft SDKs\Kinect\v1.8\inc;
(2) Library files加入C:\Program Files\Microsoft SDKs\Kinect\v1.8\lib\x86;
(3) 在Linker的Input中,添加Additional Dependencies:
        Kinect10.lib






四. 测试用Kinect读取深度图像并用OpenCV显示

/************************************************
代码原作者:zouxy09
来自:http://http://blog.csdn.net/zouxy09/article/details/8146266

Kinect for Windows SDK + OpenCV2读取并显示深度图像

************************************************/

#include <windows.h>
#include <iostream>
#include <NuiApi.h>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
	Mat image;
	// 这里我们用灰度图来表述深度数据,越远的数据越暗
	image.create(240, 320, CV_8UC1);

	// 1. 初始化NUI,注意这里传入的参数有变化,为DEPTH
	HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH);
	if (FAILED(hr))
	{
		cout << "NuiInitialize failed" << endl;
		return hr;
	}

	// 2. 定义事件句柄
	// 创建读取下一帧的信号事件句柄,控制Kinect是否可以开始读取下一帧数据
	HANDLE nextColorFrameEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
	HANDLE depthStreamHandle = NULL;  // 保存图像数据流的句柄,用以提取数据

	// 3. 打开Kinect设备的深度图信息通道,并用depthStreamHandle保存该流的句柄,以便以后读取
	hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH, NUI_IMAGE_RESOLUTION_320x240,
		0, 2, nextColorFrameEvent, &depthStreamHandle);
	if (FAILED(hr))  // 判断读取是否正确
	{
		cout << "Could not open color image stream video" << endl;
		NuiShutdown();
		return hr;
	}
	namedWindow("depthImage", CV_WINDOW_AUTOSIZE);

	// 4. 开始读取深度数据
	while (true)
	{
		const NUI_IMAGE_FRAME * pImageFrame = NULL;

		// 4.1 无限等待新的数据,等到后返回
		if (WaitForSingleObject(nextColorFrameEvent, INFINITE) == 0)
		{
			// 4.2 从刚才打开数据流的流句柄中得到该帧数据,读取到的数据地址存于pImageFrame
			hr = NuiImageStreamGetNextFrame(depthStreamHandle, 0, &pImageFrame);
			if (FAILED(hr))  // 判断读取是否正确
			{
				cout << "Could not get depth image" << endl;
				NuiShutdown();
				return -1;
			}

			INuiFrameTexture * pTexture = pImageFrame->pFrameTexture;
			NUI_LOCKED_RECT LockedRect;

			// 4.3 提取数据帧到LockedRect,它包括两个数据对象:Pitch每行字节数,pBits第一个字节地址
			// 并锁定数据,这样当我们读取数据时,Kinect就不会去修改它
			pTexture->LockRect(0, &LockedRect, NULL, 0);

			// 4.4 确定获得的数据是否有效
			if (LockedRect.Pitch != 0)
			{
				// 4.5 将数据转换为OpenCV的Mat格式
				for (int i = 0; i < image.rows; ++i)
				{
					uchar *ptr = image.ptr<uchar>(i);  // 第i行的指针

					// 深度图像数据含有两种格式,这里像素的低12位表示一个深度值,高4位未使用
					// 注意这里需要进行转换,因为每个数据是2个字节,存储的同上面获取的颜色信息不一样
					uchar *pBufferRun = (uchar*)(LockedRect.pBits) + i * LockedRect.Pitch;
					USHORT *pBuffer = (USHORT*)pBufferRun;
					for (int j = 0; j < image.cols; ++j)
					{
						ptr[j] = 255 - (uchar)(256 * pBuffer[j] / 0x0fff);  // 直接将数据归一化处理
					}
				}
				imshow("depthImage", image);
			}
			else
			{
				cout << "Buffer length of received texture is bogus\r\n" << endl;
			}

			// 5. 这一帧已经处理完了,所以将其解锁
			pTexture->UnlockRect(0);

			// 6. 释放本帧数据,准备迎接下一帧
			NuiImageStreamReleaseFrame(depthStreamHandle, pImageFrame);
		}
		if (cvWaitKey(20) == 27)
		{
			break;
		}
	}

	// 7. 关闭NUI链接
	return 0;
}




参考资料

Kinect开发学习笔记之(三)Kinect开发环境配置





  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值