通过Kinect SDK v2预览版,取得BodyIndex(人体区域)的方法和示例代码。

上一节,介绍了从Kinect v2预览版用Kinect SDK v2预览版获取Depth数据的方法。
 
这一节,介绍从Kinect取得BodyIndex(人体区域)的方法。
 
BodyIndex
基于从Kinect取得的Depth数据(传感器的距离信息)获取人体区域。
 
因为人体区域基于Depth数据,同时也依赖Depth传感器的分辨率。像上一节介绍的一样,因为Kinect v2 预览版(512×424)的Depth传感器的分辨率大幅提高,和Kinect v1相比,手指等细小部分的人体区域也变得可以准确的取得。但是,能检测出的人体区域的数量还是6个人这一点没有发生改变。
 
关于人体区域,在Kinect SDK v1里被称为「Player」,不过到了Kinect SDK v2 预览版里更名为「BodyIndex」。
 
这一节,介绍取得「BodyIndex」的方法。

图1 Kinect SDK v2预览版的示例程序(BodyBasics)
把BodyIndex在Color坐标的位置匹配截取,手指等细小部分都可以清晰得在人体身上保留下来了。
(注:因为Color和Depth的Camera位置不同,所以需要进行坐标空间的转换)
 
样品程序
使用Kinect SDK v2预览版取得BodyIndex,把每个人体用颜色区分出来并显示的示例程序展示。第2节有介绍的取得数据的阶段摘录解说。这个示例程序的全部内容,在下面的github里公开。
 
 
 
图2 Kinect SDK v2预览版的数据取得流程(重发)
「Sensor」
取得「Sensor」
  1. // Sensor
  2. IKinectSensor* pSensor; ……
  3. HRESULT hResult = S_OK;
  4. hResult = GetDefaultKinectSensor( &pSensor ); ……
  5. if( FAILED( hResult ) ){
  6. std::cerr << "Error : GetDefaultKinectSensor" << std::endl;
  7. return -;
  8. }
  9. hResult = pSensor->Open(); ……
  10. if( FAILED( hResult ) ){
  11. std::cerr << "Error : IKinectSensor::Open()" << std::endl;
  12. return -;
  13. }
列表1.1 相当于图1「Source」的部分
1 处理Kinect v2预览版的Sensor接口。
2 取得默认的Sensor。
3 打开Sensor。
 
「Source」
从「Sensor」取得「Source」。
  1. // Source
  2. IBodyIndexFrameSource* pBodyIndexSource; ……
  3. hResult = pSensor->get_BodyIndexFrameSource( &pBodyIndexSource ); ……
  4. if( FAILED( hResult ) ){
  5. std::cerr << "Error : IKinectSensor::get_BodyIndexFrameSource()" << std::endl;
  6. return -;
  7. }
列表1.2 相当于图1「Source」的部分
1 取得BodyIndex Frame的Source接口。
2 从Sensor取得Source。
 
「Reader」
「Source」从打开「Reader」。
  1. // Reader
  2. IBodyIndexFrameReader* pBodyIndexReader; ……
  3. hResult = pBodyIndexSource->OpenReader( &pBodyIndexReader ); ……
  4. if( FAILED( hResult ) ){
  5. std::cerr << "Error : IBodyIndexFrameSource::OpenReader()" << std::endl;
  6. return -;
  7. }
列表1.3 相当于图1「Reader」的部分
1 取得BodyIndex  Frame的Reader接口。
2 从Source打开Reader。
 
「Frame」~「Data」
从「Reader」取得最新的「Frame」。
  1. int width = ; ……
  2. int height = ; ……
  3. cv::Mat bodyIndexMat( height width CV_8UC3 ); ……
  4. cv::namedWindow( "BodyIndex" );
  5. // Color Table
  6. cv::Vec3b color[]; ……
  7. color[] = cv::Vec3b( );
  8. color[] = cv::Vec3b( );
  9. color[] = cv::Vec3b( );
  10. color[] = cv::Vec3b( );
  11. color[] = cv::Vec3b( );
  12. color[] = cv::Vec3b( );
  13. while( ){
  14. // Frame
  15. IBodyIndexFrame* pBodyIndexFrame = nullptr; ……
  16. hResult = pBodyIndexReader->AcquireLatestFrame( &pBodyIndexFrame ); ……
  17. if( SUCCEEDED( hResult ) ){
  18. unsigned int bufferSize = ;
  19. unsigned char* buffer = nullptr;
  20. hResult = pBodyIndexFrame->AccessUnderlyingBuffer( &bufferSize &buffer ); ……
  21. if( SUCCEEDED( hResult ) ){
  22. for( int y = ; y < height; y++ ){
  23. for( int x = ; x < width; x++ ){
  24. unsigned int index = y * width + x;
  25. if( buffer[index] != 0xff ){
  26. bodyIndexMat.at<cv::Vec3b>( y x ) = color[buffer[index]]; ……
  27. }
  28. else{
  29. bodyIndexMat.at<cv::Vec3b>( y x ) = cv::Vec3b( ); ……
  30. }
  31. }
  32. }
  33. }
  34. }
  35. SafeRelease( pBodyIndexFrame );
  36. // Show Window
  37. cv::imshow( "BodyIndex" bodyIndexMat );
  38. if( cv::waitKey( ) == VK_ESCAPE ){
  39. break;
  40. }
  41. }
列表1.4 相当于图1「Frame」,「Data」的部分
1 BodyIndex的尺寸(512×424)。
   这里为了简化说明,画像尺寸用硬代码来设定,示例程序可以Source取得着Frame信息。
2 为了从BodyIndex获得人体区域来绘制,使用OpenCV的cv::Mat。
3 绘制人体区域的color table。
4 取得BodyIndex用的Frame接口。
5 从Reader取得最新的Frame。
6 从Frame取得BodyIndex。
   取得保存BodyIndex数组的指针。
7 绘制BodyIndex的人体区域。
   每个BodyIndex参照color table着色。
 
如果可以从取得「Frame」的里获取BodyIndex的数据。
 
取出的BodyIndex的数据,像图3一样,把人体区域和非人体区域的按各自对应的值来填入。
 
Kinect SDK v1的「Player」是按人体区域是「1」~「6」(因为是6个人),非人体区域「0」来填入;Kinect SDK v2预览版的「BodyIndex」是按照人体区域「0」~「5」,非人体領域「255(0xff)」来填入(图1)。
图3 BodyIndex数据
  Kinect SDK v1 Kinect SDK v2预览版
名称 Player BodyIndex
检测支持人数 6人 6人
人体領域的値 1~6 0~5
非人体領域的値 0 255(0xff)
表1 Kinect SDK v1和Kinect SDK v2预览版的人体区域(Player,BodyIndex)的比较
示例程序是,把BodyIndex的值,在人体区域用color table的颜色(=「cv::Vec3b(B,G,R )」),在非人体区域用黑色(=「cv::Vec3b(0,0,0)」)进行着色来实现可视化。
 
运行结果
运行这个示例程序,就像图4一样,从v2预览版取得的人体区域被着色显示。
图4 运行结果
手指的细小形状可以清楚的分割取出。
   
总结
这一节是使用Kinect SDK v2预览版取得BodyIndex的示例程序的介绍,下一节是取得Body(人体姿势)的示例程序的介绍。

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

  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++) Color篇

    Kinect SDK v2预览版,获取数据的基本流程的说明.以及取得Color图像的示例程序的介绍. 上一节,是关于当前型号Kinect for Windows(后面称作Kinect v1)和次世代型 ...

  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. 【计算机视觉】深度相机(六)--Kinect v2.0 手势样本库制作

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

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

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

  9. Kinect v2(Microsoft Kinect for Windows v2 )配置移动电源解决方案

    Kinect v2配置移动电源解决方案 Kinect v2如果用于移动机器人上(也可以是其他应用场景),为方便有效地展开后续工作,为其配置移动电源是十分必要的. 一.选择移动电源 Kinect v2原 ...

随机推荐

  1. js checkbox

    js checkbox <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

  2. 如何在Eclipse中查看Android源码或者第三方组件包源码

    文章出处:http://blog.csdn.net/cjjky/article/details/6535426 在学习过程中如果经常阅读源码,理解程度会比较深,学习效率也会比较高,那么如何方便快捷的阅 ...

  3. Android学习 之 startActivityForResult 和 onActivityResult

    startActivityForResult 和 onActivityResult() 作用:主要用于 主Activity向调用的 子Activity 获得数据. 使用方法:在 主Activity写 ...

  4. matlab练习程序(透视投影,把lena贴到billboard上)

    本练习程序是受到了这个老外博文的启发,感觉挺有意思,就尝试了一下.他用的是opencv,我这里用的是matlab. 过去写过透视投影,当时是用来做倾斜校正的,这次同样用到了透视投影,不过更有意思,是将 ...

  5. TeeChart注册方法

  6. 【HTML5】表单属性

    * autocomplete autocomplete 属性规定 form 或 input 域应该拥有自动完成功能. 注释:autocomplete 适用于 <form> 标签,以及以下类 ...

  7. yuv rgb 像素格式1

    ===========大小============= 一般,直接采集到的视频数据是RGB24的格式 RGB24一帧的大小size=width×heigth×3 Byte, RGB32的size=wid ...

  8. Android 编程下如何调整 SwipeRefreshLayout 的下拉刷新距离

    SwipeRefreshLayout 的下拉刷新距离比较短,并且也没有提供设置下拉距离的 API,但是看 SwipeRefreshLayout 的源码,会发现有一个内部变量 mDistanceToTr ...

  9. javascript优化--10模式(设计模式)01

    单体模式:保证一个特定类仅有一个实例;即第二次使用同一个类创建新对象时,应该得到与第一个所创建对象完全相同对象: 在JS中,可以认为每次在使用对象字面量创建对象的时候,实际上就在创建一个单体: 当使用 ...

  10. 阿里云SDK手册之java SDK

    进行阿里云sdk开发的前提是已经购买阿里云的相关服务才能调用阿里的相关接口进行开发.最近公司在做云管控的项目,于是进行下摘录总结. 一. 环境准备 阿里云针对不同的开发语言提供不同的sdk,由于项目用 ...