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. 好久没弄了,来个最简的centos下的Iptables文件存照吧。

    有最基本的作用.. # Generated by iptables-save v1. :: *filter :INPUT ACCEPT [:] :FORWARD ACCEPT [:] :OUTPUT ...

  2. poj 1236 scc强连通分量

    分析部分摘自:http://www.cnblogs.com/kuangbin/archive/2011/08/07/2130277.html 强连通分量缩点求入度为0的个数和出度为0的分量个数 题目大 ...

  3. UVALive 6887 Book Club 最大流解最大匹配

    题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  4. _EPROCESS结构简单了解!

    _EPROCESS结构简单了解! lkd> dt _EPROCESSnt!_EPROCESS   +0x000 Pcb              : _KPROCESS   +0x06c Pro ...

  5. php 字符串式非关联数组循环

    $xiangmu='1,2,3'; $xiangmu=explode(',',$jc['xiangmu']); $xm=''; for($i=0;$i<count($f)-1;$i++){ $x ...

  6. 关于post和get传递参数的区别

    今天一朋友给我一段代码,说使用request.querystrin得不到传过来的值,我们一起找到很长时间,终于给找到了,错误的原因是他将form中的method参数写成了get了,所以使用reques ...

  7. Ubuntu 11.10升级Ruby (1.8.7 --> 1.9.3或者其他任意版本)

    使用apt-get install ruby,安装的默认版本为1.8.7.想要使用更高版本,只能采用手工升级的方式. 方式1 使用RVM(推荐方式) 1 安装RVM http://rvm.io/rvm ...

  8. swift1.2语言函数和闭包函数介绍

    swift1.2语言函数和闭包函数介绍 在编程中,随着处理问题的越来越复杂,代码量飞速增加.其中,大量的代码往往相互重复或者近似重复.如果不采有效方式加以解决,代码将很难维护. swift1.2语言函 ...

  9. 简单几何(求划分区域) LA 3263 That Nice Euler Circuit

    题目传送门 题意:一笔画,问该图形将平面分成多少个区域 分析:训练指南P260,欧拉定理:平面图定点数V,边数E,面数F,则V + F - E =  2.那么找出新增的点和边就可以了.用到了判断线段相 ...

  10. Codeforces 498C Array and Operations(最大流)

    题目是给一些数和<数对>的下标,然后进行操作:对某个<数对>中的两个数同时除以一个都能被它们整除且不等于1的数,要求的就是最多能进行多少次操作. 除数一定是素数,就是要决定某素 ...