使用Kinect2.0+OpenCV采集RGB图像

knt3        博主最近开始玩Kinect了!

        这篇博客主要介绍Kinect2.0的开发环境配置,主要两点内容,一是在VS2013上配置Kinect2.0开发环境,二是编译一个采集RGB图像数据的小程序测试Kinect2.0的开发环境是否配好。

        在你需要做好如下准备之后,就可以开始配置Kinect2.0的开发环境了。

        首先检查你的PC,要求操作系统为Win8及以上(含Win8、Win8.1、Win10),拥有USB3.0(及以上)接口,如果你需要使用Kinect做实时三维重建及交互,那么你最好拥有一块中档(及以上)显卡,并且支持DirectX11(及以上)。

        另外关于软件,本篇教程已经默认你配置了以下环境VS2012(及以上版本),OpenCV(2.4及以上,最好是3.1版本),配置好这些,我们就可以开始了。

一、安装Kinect驱动及SDKM1463750732097

        在官网下载Kinect SDK 2.0,然后安装。

        将Kinect适配器同Kinect、Kinect电源线及PC连接起来,Win8及以上系统会自动安装驱动,等待系统提示驱动安装完成。

        打开Kinect Studio进行测试,如同上图中那样,点击连接可以正常打开Kinect,这样我们的驱动就安装成功了。

二、配置VS+OpenCV环境

       打开VS2013的配置管理器,做非常简单的配置,在include path 中加入:$(KINECTSDK20_DIR)\inc ,在library path中加入:$(KINECTSDK20_DIR)\lib\x64 ,如果你是32位系统,最后改成x86就可以了。

三、编译采集RGB图像的测试程序

        在VS中新建控制台程序,然后编译如下代码,并运行:

#include <opencv2\opencv.hpp>
#include <iostream>
#include <Kinect.h>
#pragma comment(lib, "kinect20.lib")
#pragma comment(lib, "opencv_world310d.lib")

using namespace cv;
using namespace std;

int main(int argc, char* argv[]){
	HRESULT hResult = S_OK;
	IKinectSensor *kinect;
	GetDefaultKinectSensor(&kinect);
	kinect->Open();
	IColorFrameSource *colorsource;
	IColorFrameReader *colorreader;
	IFrameDescription *colorde;
	kinect->get_ColorFrameSource(&colorsource);
	colorsource->OpenReader(&colorreader);
	colorsource->get_FrameDescription(&colorde);

	int width = 0;
	int height = 0;
	colorde->get_Height(&height);
	colorde->get_Width(&width);

	Mat a(height, width, CV_8UC4);
	namedWindow("Capture Image From Kinect2.0");
	while (1){
		IColorFrame *frame;
		hResult = colorreader->AcquireLatestFrame(&frame);
		if (SUCCEEDED(hResult)){
			frame->CopyConvertedFrameDataToArray(height*width * 4,
				reinterpret_cast<BYTE*>(a.data), ColorImageFormat::ColorImageFormat_Bgra);
		}
		if (frame != NULL){
			frame->Release();
			frame = NULL;
		}
		if (waitKey(30) == VK_ESCAPE)
			break;
		imshow("aaa", a);
	}
	if (colorsource != NULL){
		colorsource->Release();
		colorsource = NULL;
	}
	if (colorreader != NULL){
		colorreader->Release();
		colorreader = NULL;
	}
	if (colorde != NULL){
		colorde->Release();
		colorde = NULL;
	}
	if (kinect){
		kinect->Close();
	}
	if (kinect != NULL){
		kinect->Release();
		kinect = NULL;
	}
	destroyAllWindows();
	return 0;
}

以上代码应该即使没有了解过SDK也能看懂,这样就展示了一个可以打开Kinect的程序,并能从Kinect读入RGB彩色数据。

        Kinect摄像头采集的是1080p数据,右图所示的结果非常清晰,完胜高清网络摄像头。

        Kinect的中有两个红外摄像头(两个不能同时打开,其中一个是深度摄像头),一个光栅阵列,一个1080p摄像头,还有一个四相麦克风阵列,能够感知声音的方向,更多炫酷的功能以后再介绍吧。

 IMG_20160520_212511

发表评论