kinect 2.0 SDK学习笔记(一)--获得原始数据

来源:互联网 发布:淘宝上目前最贵的东西 编辑:程序博客网 时间:2024/05/29 18:02

工程配置

包含目录加上:
$(KINECTSDK20_DIR)\inc;
库目录加上:
$(KINECTSDK20_DIR)\lib\x64;(注意选择x64/x86)

其中KINECTSDK20_DIR是安装kinect SDK时的安装目录,比如我的是
C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\

六种数据源

Kinect Data Sources – 6种数据源
1. ColorFrameSource
彩色图
2. InfraredFrameSource
红外图(16-bit)
3. DepthFrameSource
深度图(16-bit,单位:mm)
kinect采的深度数据是short型,即每个像素深度占2个字节,但是16位中只有12位是有用的,2^12 = 4096,单位是毫米,所以范围是4m
4. BodyIndexFrameSource
人物索引图(用一个字节代表人体,最多支持6个人体)
5. BodyFrameSource
人体关节图
6. AudioSource
声音

流程

Kinect v2中获取并处理数据源接口步骤如下:
Sensor -> Source -> Reader -> Frame -> Data
- 单数据源的获取:
1. 获取kinect

IKinectSensor* m_pKinectSensor;  HRESULT hr;hr = GetDefaultKinectSensor(&m_pKinectSensor);hr = m_pKinectSensor->Open();
  1. 显示数据源的源数据并为阅读器(readers)提供途径、为传感器每个数据提供一种数据源。
hr = m_pKinectSensor->get_ColorFrameSource(&pColorFrameSource);
  1. 提供获取帧的途径(事件机制、轮询机制)。
hr = pColorFrameSource->OpenReader(&m_pColorFrameReader);
  1. 发送帧事件参数,获取最近一帧的数据。
hr = m_pColorFrameReader->AcquireLatestFrame(&pColorFrame);
  • 多数据源获取:
    1. 与上面的1.相同
    2. 获取多数据源到读取器
IMultiSourceFrameReader* m_pMultiFrameReader;hr = m_pKinectSensor->OpenMultiSourceFrameReader(    FrameSourceTypes::FrameSourceTypes_Color |    FrameSourceTypes::FrameSourceTypes_Infrared |    FrameSourceTypes::FrameSourceTypes_Depth,     &m_pMultiFrameReader);
  1. 获取多源数据帧
hr = m_pMultiFrameReader->AcquireLatestFrame(&m_pMultiFrame);
  1. 从多源数据帧中分离出各个数据源
hr = m_pMultiFrame->get_ColorFrameReference(&m_pColorFrameReference);hr = m_pColorFrameReference->AcquireFrame(&m_pColorFrame);

两种方式最后都能获得你想要的数据帧,并对其进行操作

例子

  • opencv显示原始的彩色,深度,红外数据
#include "kinect.h"#include <iostream>#include <opencv2/core/core.hpp>  #include <opencv2/highgui/highgui.hpp>  using namespace cv;using namespace std;// 安全释放指针template<class Interface>inline void SafeRelease(Interface *& pInterfaceToRelease){    if (pInterfaceToRelease != NULL)    {        pInterfaceToRelease->Release();        pInterfaceToRelease = NULL;    }}int main(){    // 获取Kinect设备    IKinectSensor* m_pKinectSensor;      HRESULT hr;    hr = GetDefaultKinectSensor(&m_pKinectSensor);    if (FAILED(hr))    {        return hr;    }    IMultiSourceFrameReader* m_pMultiFrameReader;    if (m_pKinectSensor)    {        hr = m_pKinectSensor->Open();        if (SUCCEEDED(hr))        {            // 获取多数据源到读取器              hr = m_pKinectSensor->OpenMultiSourceFrameReader(                FrameSourceTypes::FrameSourceTypes_Color |                FrameSourceTypes::FrameSourceTypes_Infrared |                FrameSourceTypes::FrameSourceTypes_Depth,                 &m_pMultiFrameReader);        }    }    if (!m_pKinectSensor || FAILED(hr))    {        return E_FAIL;    }    // 三个数据帧及引用    IDepthFrameReference* m_pDepthFrameReference;    IColorFrameReference* m_pColorFrameReference;    IInfraredFrameReference* m_pInfraredFrameReference;    IInfraredFrame* m_pInfraredFrame;    IDepthFrame* m_pDepthFrame;    IColorFrame* m_pColorFrame;    // 三个图片格式    Mat i_rgb(1080  , 1920, CV_8UC4);      //注意:这里必须为4通道的图,Kinect的数据只能以Bgra格式传出    Mat i_depth(424, 512, CV_8UC1);    Mat i_ir(424, 512, CV_16UC1);    UINT16 *depthData = new UINT16[424*512];    IMultiSourceFrame* m_pMultiFrame = nullptr;    while (true)    {        // 获取新的一个多源数据帧        hr = m_pMultiFrameReader->AcquireLatestFrame(&m_pMultiFrame);        if (FAILED(hr)||!m_pMultiFrame)        {            //cout << "!!!" << endl;            continue;        }        // 从多源数据帧中分离出彩色数据,深度数据和红外数据        if (SUCCEEDED(hr))            hr = m_pMultiFrame->get_ColorFrameReference(&m_pColorFrameReference);        if (SUCCEEDED(hr))            hr = m_pColorFrameReference->AcquireFrame(&m_pColorFrame);        if (SUCCEEDED(hr))            hr = m_pMultiFrame->get_DepthFrameReference(&m_pDepthFrameReference);        if (SUCCEEDED(hr))            hr = m_pDepthFrameReference->AcquireFrame(&m_pDepthFrame);        if (SUCCEEDED(hr))            hr = m_pMultiFrame->get_InfraredFrameReference(&m_pInfraredFrameReference);        if (SUCCEEDED(hr))            hr = m_pInfraredFrameReference->AcquireFrame(&m_pInfraredFrame);        // color拷贝到图片中        UINT nColorBufferSize = 1920 * 1080 * 4;        if (SUCCEEDED(hr))            hr = m_pColorFrame->CopyConvertedFrameDataToArray(nColorBufferSize, reinterpret_cast<BYTE*>(i_rgb.data), ColorImageFormat::ColorImageFormat_Bgra);        // depth拷贝到图片中        if (SUCCEEDED(hr))        {            hr = m_pDepthFrame->CopyFrameDataToArray(424 * 512, depthData);            for (int i = 0; i < 512*424; i++)            {                // 0-255深度图,为了显示明显,只取深度数据的低8位                BYTE intensity = static_cast<BYTE>(depthData[i] % 256);                reinterpret_cast<BYTE*>(i_depth.data)[i] = intensity;            }            // 实际是16位unsigned int数据            //hr = m_pDepthFrame->CopyFrameDataToArray(424 * 512, reinterpret_cast<UINT16*>(i_depth.data));        }        // infrared拷贝到图片中        if (SUCCEEDED(hr))        {            hr = m_pInfraredFrame->CopyFrameDataToArray(424 * 512, reinterpret_cast<UINT16*>(i_ir.data));        }        // 显示        imshow("rgb", i_rgb);        if (waitKey(1) == VK_ESCAPE)            break;        imshow("depth", i_depth);        if (waitKey(1) == VK_ESCAPE)            break;        imshow("ir", i_ir);        if (waitKey(1) == VK_ESCAPE)            break;        // 释放资源        SafeRelease(m_pColorFrame);        SafeRelease(m_pDepthFrame);        SafeRelease(m_pInfraredFrame);        SafeRelease(m_pColorFrameReference);        SafeRelease(m_pDepthFrameReference);        SafeRelease(m_pInfraredFrameReference);        SafeRelease(m_pMultiFrame);    }    // 关闭窗口,设备    cv::destroyAllWindows();    m_pKinectSensor->Close();    std::system("pause");    return 0;}
0 0
原创粉丝点击