Kinect For Windows V2开发日志三:简单的深度读取


# 代码示例:
#include <Kinect.h>
#include <iostream>

using    namespace    std;

int    main(void)
{
    IKinectSensor    * mySensor = nullptr;
    GetDefaultKinectSensor(&mySensor);  //获取感应器
    mySensor->Open();            //打开感应器

    IDepthFrameSource    * mySource = nullptr;     //取得深度数据
    mySensor->get_DepthFrameSource(&mySource);

    int    height = 0, width = 0;
    IFrameDescription    * myDescription = nullptr;  //取得深度数据的分辨率,等下用
    mySource->get_FrameDescription(&myDescription);
    myDescription->get_Height(&height);
    myDescription->get_Width(&width);
    myDescription->Release();

    IDepthFrameReader    * myReader = nullptr;        
    mySource->OpenReader(&myReader);                //打开深度数据的Reader

    int    times = 100;
    IDepthFrame    * myFrame = nullptr;
    while (times)
        if (myReader->AcquireLatestFrame(&myFrame) == S_OK)        //通过Reader尝试获取最新的一帧深度数据,放入深度帧中,并判断是否成功获取
        {
            UINT    size = 0;
            UINT16    * buffer = nullptr;
            myFrame->AccessUnderlyingBuffer(&size,&buffer);        //将深度数据输入到数组里,里面的数字代表距离    
            cout << buffer[width * (height / 2) + width / 2] << endl;  //将位于摄像头最中央的物体的距离输出
            times--;
            myFrame->Release();
        }
    myReader->Release();    //释放不用的变量并且关闭感应器
    mySource->Release();
    mySensor->Close();
    mySensor->Release();

    return    0;
}


# 详细解释
1. **取得并开启感应器(`IKinectSensor`)**   通过`GetDefaultKinectSensor()`将感应器赋给一个`IKinect`变量,然后这个变量就可以代表感应器了,再用它打开感应器。 2. **取得深度数据源(`IDepthFrameSource`)**   打开感应器后,用它里面的`get_DepthFrameSource()`这个成员函数来获取深度数据源,有点奇怪的是,虽然现在获取到了数据源,但是不能对数据进行操作,还需要下一步的Reader。 3. **取得深度数据Reader(`IDepthFrameReader`)**   要对数据进行操作,首先需要通过数据源将`Reader`打开 4. **通过Reader读取数据帧(`IDepthFrame`)**   此步骤在`while`循环中进行,每次循环时,通过`Reader`的`AcquireLatestFrame()`的成员函数来获取最新的一帧,并且将其装入一个深度数据帧里。注意,这里的`AcquireLatestFrame()`这个函数一定要判断是否返回一个成功值,因为这个函数获取失败的的几率很高。 5. **操作数据帧**   在成功读取到数据帧之后,我们通过数据帧里的`AccessUnderlyingBuffer()`这个函数将帧里的数据复制到一个数组里去,这个函数有两个参数,第一个是个记录大小的变量,第二个是个接受数据的数组指针,传入后会分别返回数组的大小以及数据。它传入数组的数据代表的是那一个像素点上的物体距离传感器的位置。在上面的代码里,用了一个`IFrameDescription`,顾名思义,它是用来描述深度数据帧的,通过它,可以获取到深度数据帧的宽、高、每个像素多少个字节等等。记录了宽和高之后,就可以计算出中间那一点在数组里的位置,访问输出就可以了。

  为了简洁此段代码略掉了大部分错误检测,严谨来说的话应该每次使用返回HRESULT的函数都应该检测返回值。如果程序正常运行的话,应该会输出100个数字,代表距离。最后当一个对象不用了之后,记得要释放。


  Kinect有多种数据源,比如深度、彩色、红外,但是操作的方法基本都是一致的,都是Sensor->Source->Reader->Frame

原文地址:https://www.cnblogs.com/xz816111/p/5184405.html