Kinect SDK v2预览版,获取数据的基本流程的说明。以及取得Color图像的示例程序的介绍。

上一节,是关于当前型号Kinect for Windows(后面称作Kinect v1)和次世代型的Kinect for Windows的开发者预览版(后面称作Kinect v2 预览版)的配置比较和介绍。
从这一节开始,是Kinect的各种数据的取得方法的比较和介绍。
 
Color Camera
Kinect和通常的Web摄像头一样,搭载了 Color Camera,可以取得Color图像。关于Camera,Kinect v1的分辨率是640×480,Kinect v2分辨率大幅提升到1920×1080。这次,要介绍从Color Camer取得图像的方法。
 
数据取得的流程
Kinect SDK v1和Kinect SDK v2预览版取得数据的基本流程。
这里表示的是最基础的流程,在Kinect SDK 在v2预览版里,有把多个「Source」「Reader」一齐处理的API,和这里介绍的数据获取的流程也会有差异。
图1是Kinect SDK v1和Kinect SDK v2预览版的数据取得流程
Kinect SDK v1,是从「Sensor」打开「Stream」,从「Stream」取得「Frame」,从「Frame」取得数据这样的流程。
到了Kinect SDK v2预览版,是从「Sensor」取得「Source」,从「Source」打开「Reader」,从「Reader」取得「Frame」,从「Frame」取得数据这样的流程。
 
  每个Kinect SDK v2预览版的「Source」,都有一个从Kinect取得Color和Depth的1个数据流,这点和Kinect SDK v1的「Stream」是一样的。
 
  Kinect SDK v2预览版,追加了「Reader」的阶段。「Reader」能打开1个「Source」多次。通过这个配置,多线程的应用上,不需要把取得的数据拷贝到其他线程处理。也有多个应用可以从同一个传感器取得数据的优点。
(注:因为Color Camera和Depth Camera是分离的,所以Color、Depth和Skeleton数据流也是各自独立的,API通过Event来通知App是否有数据更新。通常为了效率,对每一个数据流都使用单独的线程来等待Event,然后处理数据。在之前的v1中,Frame是独立的,取出后数据就被Drop掉了,所以想在Depth里读取Color之类的操作,必须使用内存拷贝,而多线程读写数据又会需要互斥锁,十分影响效率;还有一个办法是通过NuiSetFrameEndEvent,也就是c#接口中的AllFrameReady事件,但是这样等待所有数据不仅太局限而且效率很低。)
 
示例程序
  Kinect SDK v2预览版取得Color画像的示例程序的展示,图1展示的是数据取得阶段的摘录解说。这个示例程序的全部内容,在下面的github里公开了。
这个示例程序为了处理图像数据,使用了OpenCV。OpenCV的详细内容可以参考下面的信息。
「Sensor」
取得「Sensor」
  1. // Sensor
    IKinectSensor* pSensor; ……
    HRESULT hResult = S_OK;
    hResult = GetDefaultKinectSensor( &pSensor ); ……
    if( FAILED( hResult ) ){
    std::cerr << "Error : GetDefaultKinectSensor" << std::endl;
    return -;
    }
    hResult = pSensor->Open(); ……
    if( FAILED( hResult ) ){
    std::cerr << "Error : IKinectSensor::Open()" << std::endl;
    return -;
    }
    列表1.1 相当于图1「Sensor」的部分
    1 处理Kinect v2预览版的Sensor接口。
    2 取得默认的Sensor。
    3 打开Sensor。
 
「Source」
 从「Sensor」取得「Source」。
  1. // Source
    IColorFrameSource* pColorSource; ……
    hResult = pSensor->get_ColorFrameSource( &pColorSource ); ……
    if( FAILED( hResult ) ){
    std::cerr << "Error : IKinectSensor::get_ColorFrameSource()" << std::endl;
    return -;
    }
    列表1.2 相当于图1「Source」的部分
    1 获取Color Frame的Source接口。
    2 从Sensor取得Source。
「Reader」
「Source」从打开「Reader」。
  1. // Reader
    IColorFrameReader* pColorReader; ……
    hResult = pColorSource->OpenReader( &pColorReader ); ……
    if( FAILED( hResult ) ){
    std::cerr << "Error : IColorFrameSource::OpenReader()" << std::endl;
    return -;
    }
    列表1.3 相当于图1「Reader」的部分
    1 获取Color Frame的Reader接口。
    2 从Source打开Reader。
「Frame」~「Data」
从「Reader」取得最新的「Frame」。
  1. int width = ;   ……
    int height = ; ……
    unsigned int bufferSize = width * height * * sizeof( unsigned char ); ……
    cv::Mat bufferMat( height, width, CV_8UC4 ); ……
    cv::Mat colorMat( height / , width / , CV_8UC4 ); ……
    cv::namedWindow( "Color" );
    while( ){
    // Frame
    IColorFrame* pColorFrame=nullptr; ……
    hResult=pColorReader->AcquireLatestFrame( &pColorFrame ); ……
    if( SUCCEEDED( hResult ) ){
    hResult = pColorFrame->CopyConvertedFrameDataToArray( bufferSize, reinterpret_cast<BYTE*>( bufferMat.data ), ColorImageFormat_Bgra ); ……
    if( SUCCEEDED( hResult ) ){
    cv::resize( bufferMat, colorMat, cv::Size(), 0.5, 0.5 ); ……
    }
    }
    SafeRelease( pColorFrame );
    // Show Window
    cv::imshow( "Color", colorMat );
    if( cv::waitKey( ) == VK_ESCAPE ){
    break;
    }
    }
    列表1.4 相当于图1「Frame」,「Data」的部分
    1 Color图像的尺寸(1920×1080)。
       这里为了简化说明,画像尺寸用硬编码来设定,示例程序可以从Source取得着Frame信息。
    2 Color图像的数据尺寸。
    3 为了处理Color图像,准备OpenCV的cv::Mat。
     「bufferMat」是原始的图像数据,「colorMat」是Resize图像数据的处理。 
     「CV_8UC4」,是无符号8bit整数(8U),4个channel(C4)并列来表现1个像素的数据格式。
    4 取得Color图像的Frame接口。
    5 从Reader取得最新的Frame。
    6 从Frame取得Color图像。
       默认的格式是YUY2(亮度与色差表现的格式),不过可以经过简单处理变换为BGRA。
    7 缩小为长宽各一半的尺寸(960×540)。
  从「Frame」取得Color图像的数据时,Kinect SDK v1是预先指定图像尺寸和格式,Kinect SDK v2不能指定图像尺寸。因此,取得数据后可以按任意形状来整理。
  取出的Color图像直接显示的话尺寸太大(1920×1080),在这里采用了OpenCV的resize命令(cv::resize()),缩小为长宽各一半的尺寸(960×540)。(注:阅读理解时不要受这一段缩放代码的干扰,仅仅就是为了考虑在显示器上显示的方便观察,没别的意义。)
  取出的Color图像的数据如果指定的是BGRA格式,就会像图2一样的排列着。蓝(B),绿(G),红(R),和无效值(A)的共计32bit构成1像素。
图2 Color图像的数据排列
 
运行结果
运行这个示例程序的话,就会像图3那样,显示从Kinect v2预览版中取得的Color图像。
总结
本节介绍了从Kinect SDK v2预览版中取得数据的基本流程和取得Color图像的示例程序,下一节将介绍取得Depth数据的示例程序。
 

【翻译】Kinect v2程序设计(C++) Color篇的更多相关文章

  1. 【翻译】Kinect v2程序设计(C++) Body 篇

    Kinect SDK v2预览版的主要功能的使用介绍,基本上完成了.这次,是关于取得Body(人体姿势)方法的说明.   上一节,是使用Kinect SDK v2预览版从Kinect v2预览版取得B ...

  2. 【翻译】Kinect v2程序设计(C++-) AudioBeam篇

    Kinect v2,Microphone Array可以用来对于水平面音源方向的推测(AudioBeam)和语音识别(Speech Recognition).这一节是介绍如何取得AudioBeam. ...

  3. 【翻译】Kinect v2程序设计(C++) BodyIndex篇

    通过Kinect SDK v2预览版,取得BodyIndex(人体区域)的方法和示例代码. 上一节,介绍了从Kinect v2预览版用Kinect SDK v2预览版获取Depth数据的方法.   这 ...

  4. 【翻译】Kinect v2程序设计(C++) Depth编

    Kinect SDK v2预览版,取得Depth数据的方法说明. 上一节,介绍了通过使用Kinect for Windows SDK v2预览版(以下简称为,Kinect SDK v2预览版)从Kin ...

  5. 【翻译】Kinect v1和Kinect v2的彻底比较

      本连载主要是比较Kinect for Windows的现行版(v1)和次世代型的开发者预览版(v2),以C++开发者为背景介绍进化的硬件和软件.本文主要是对传感的配置和运行条件进行彻底的比较.   ...

  6. 【计算机视觉】深度相机(五)--Kinect v2.0

    原文:http://blog.csdn.NET/qq1175421841/article/details/50412994 ----微软Build2012大会:Kinect for Windows P ...

  7. Ubuntu_ROS中应用kinect v2笔记

    Ubuntu_ROS中应用kinect v2笔记 个人觉得最重要的资料如下: 1. Microsoft Kinect v2 Driver Released http://www.ros.org/new ...

  8. 【计算机视觉】深度相机(六)--Kinect v2.0 手势样本库制作

    目录为1.如何使用Kinect Studio录制手势剪辑:2.如何使用Visual Gesture Builder创建手势项目:3.如何在我的C#程序中使用手势:4.关于录制.剪辑手势过程中的注意事项 ...

  9. Kinect v2.0 for windows开发环境说明

    官方文档里是这些: Supported Operating Systems and Architectures The following operating systems and architec ...

随机推荐

  1. 了解 hadoop

    <Hadoop基础教程>之初识Hadoop 博客分类: 读后感   Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我 ...

  2. struts2 标签问题----日期显示

    对于要显示按照自己的意愿进行显示的话: <s:date name="date" format="yyyy-MM-dd HH:mm:ss.SSS" /> ...

  3. 移动App该如何保存用户密码(转)

    原文地址:http://blog.csdn.net/hengyunabc/article/details/34623957 移动App该如何保存用户密码? 这个实际上和桌面程序是一样的. 先看下一些软 ...

  4. svn Error: post-commit hook failed (exit code 127) with output

    Command: Commit Modified: C:\Users\xsdff\Desktop\project\index.html Sending content: C:\Users\xsdff\ ...

  5. android 兼容性测试 CTS 测试过程(实践测试验证通过)

    source: http://blog.csdn.net/jianguo_liao19840726/article/details/7222814 写这个博客的时候是为了记忆,建议大家还是看官方的说明 ...

  6. AppInventor学习笔记(二)——Hello Purr

    一.设计组件 1.定义: 就是WPF中的控件一个意思,直接调用不需要知道怎么写的,只需要写响应函数即可. 2.Designer: (1)界面如下: (2)分区: ①预览窗口: 用于放置应用中所需的组件 ...

  7. Winedt打开tex文件报错error reading的解决方案

    我刚装就发现winedt打开一些.tex文件时会出现reading error,然后看不到任何文字(网上有人讨论打开是乱码的问题,但是我的是完全看不到任何东西),我的系统winxp,网上有人说好像是和 ...

  8. SU Demos-02Filtering-05Suk1k2filter

    本人数学不咋地,本demo也是一知半解,敬请谅解. 这是生成的脉冲数据

  9. Open Xml SDK Word模板开发最佳实践(Best Practice)

    1.概述 由于前面的引文已经对Open Xml SDK做了一个简要的介绍. 这次来点实际的——Word模板操作. 从本质上来讲,本文的操作都是基于模板替换思想的,即,我们通过替换Word模板中指定元素 ...

  10. okhttp3 get post 简单封装

    最近打算在新项目中使用 okhttp3, 简单封装了一下异步 get post 因为 CallBack 也是在子线程中执行,所以用到了 Handler public class MyOkHttpCli ...