Kinect开发环境配置:Kinect for Windows SDK + OpenCV2.4.10 + VS2010 + Win7(x64)

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


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


在官方网站下载Kinect for Windows SDK和Developer Toolkit:

KinectSDK-v1.7-Setup.exe (主要提供Kinect的驱动和设备访问接口)(链接地址:https://www.microsoft.com/en-us/download/details.aspx?id=36996)

KinectDeveloperToolkit-v1.7.0-Setup.exe (主要提供一些有助于开发的工具,包括Kinect Studio和多种编程语言的开发例程等))链接地址:https://www.microsoft.com/en-us/download/details.aspx%3Fid%3D36998)

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


Kinect开发环境配置:Kinect for Windows SDK + OpenCV2.4.10 + VS2010 + Win7(x64)_第1张图片


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

Kinect开发环境配置:Kinect for Windows SDK + OpenCV2.4.10 + VS2010 + Win7(x64)_第2张图片


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

Kinect开发环境配置:Kinect for Windows SDK + OpenCV2.4.10 + VS2010 + Win7(x64)_第3张图片



二. 安装OpenCV2.4.9

我在另一篇文章里已经介绍,详见http://blog.csdn.net/lizhiguo18/article/details/51037366

三. VS2010配置


打开VS2010,新建project,命名为"KinectDepthData"。接下来要配置相关的库和包以及它们的路径

Kinect开发环境配置:Kinect for Windows SDK + OpenCV2.4.10 + VS2010 + Win7(x64)_第4张图片


OpenCV:

(1) Include files加入E:\opencv\build\include;
(2) Library files加入E:\opencv\build\x64\vc10\lib;
(3) 在Linker的Input中,添加Additional Dependencies(根据需要添加):

opencv_core2410d.lib
opencv_imgproc2410d.lib
opencv_highgui2410d.lib
opencv_ml2410d.lib
opencv_video2410d.lib
opencv_features2d2410d.lib
opencv_calib3d2410d.lib
opencv_objdetect2410d.lib
opencv_contrib2410d.lib
opencv_legacy2410d.lib
opencv_flann2410d.lib


Kinect:

(1) Include files加入C:\Program Files\Microsoft SDKs\Kinect\v1.7\inc;
(2) Library files加入C:\Program Files\Microsoft SDKs\Kinect\v1.7\lib\amd64

(3) 在Linker的Input中,添加Additional Dependencies:
        Kinect10.lib


Kinect开发环境配置:Kinect for Windows SDK + OpenCV2.4.10 + VS2010 + Win7(x64)_第5张图片


Kinect开发环境配置:Kinect for Windows SDK + OpenCV2.4.10 + VS2010 + Win7(x64)_第6张图片


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

// KinectDepthData.cpp : 定义控制台应用程序的入口点。
/************************************************
代码原作者:zouxy09
来自:http://http://blog.csdn.net/zouxy09/article/details/8146266

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

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

#include "stdafx.h"
#include 
#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(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;
}

你可能感兴趣的:(c++,图片编程,opencv,pcl)