通过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里公开。
https://github.com/UnaNancyOwen/Kinect2Sample
 
图2 Kinect SDK v2预览版的数据取得流程(重发)
「Sensor」
取得「Sensor」
// Sensor
IKinectSensor* pSensor;   ……1
HRESULT hResult = S_OK;
hResult = GetDefaultKinectSensor( &pSensor );  ……2
if( FAILED( hResult ) ){std::cerr << "Error : GetDefaultKinectSensor" << std::endl;return -1;
}
hResult = pSensor->Open();  ……3
if( FAILED( hResult ) ){std::cerr << "Error : IKinectSensor::Open()" << std::endl;return -1;
}

列表1.1 相当于图1「Source」的部分
1 处理Kinect v2预览版的Sensor接口。
2 取得默认的 Sensor。
3 打开Sensor。

「Source」
从「Sensor」取得「Source」。
// Source
IBodyIndexFrameSource* pBodyIndexSource;  ……1
hResult = pSensor->get_BodyIndexFrameSource( &pBodyIndexSource );  ……2
if( FAILED( hResult ) ){std::cerr << "Error : IKinectSensor::get_BodyIndexFrameSource()" << std::endl;return -1;
}

列表1.2  相当于图1「Source」的部分
1 取得BodyIndex Frame的Source接口。
2 从Sensor取得 Source。

「Reader」
「Source」从打开「Reader」。
// Reader
IBodyIndexFrameReader* pBodyIndexReader;  ……1
hResult = pBodyIndexSource->OpenReader( &pBodyIndexReader );  ……2
if( FAILED( hResult ) ){std::cerr << "Error : IBodyIndexFrameSource::OpenReader()" << std::endl;return -1;
}

列表1.3 相当于图1「Reader」的部分
1 取得BodyIndex  Frame的Reader接口。
2 从Source打开Reader。

「Frame」~「Data」
从「Reader」取得最新的「Frame」。
int width = 512;  ……1
int height = 424;  ……1
cv::Mat bodyIndexMat( height, width, CV_8UC3 );  ……2
cv::namedWindow( "BodyIndex" );
// Color Table
cv::Vec3b color[6];  ……3
color[0] = cv::Vec3b( 255,   0,   0 );
color[1] = cv::Vec3b(   0, 255,   0 );
color[2] = cv::Vec3b(   0,   0, 255 );
color[3] = cv::Vec3b( 255, 255,   0 );
color[4] = cv::Vec3b( 255,   0, 255 );
color[5] = cv::Vec3b(   0, 255, 255 );
while( 1 ){// FrameIBodyIndexFrame* pBodyIndexFrame = nullptr;  ……4hResult = pBodyIndexReader->AcquireLatestFrame( &pBodyIndexFrame );  ……5if( SUCCEEDED( hResult ) ){unsigned int bufferSize = 0;unsigned char* buffer = nullptr;hResult = pBodyIndexFrame->AccessUnderlyingBuffer( &bufferSize, &buffer );  ……6if( SUCCEEDED( hResult ) ){for( int y = 0; y < height; y++ ){for( int x = 0; x < width; x++ ){unsigned int index = y * width + x;if( buffer[index] != 0xff ){bodyIndexMat.at<cv::Vec3b>( y, x ) = color[buffer[index]];  ……7}else{bodyIndexMat.at<cv::Vec3b>( y, x ) = cv::Vec3b( 0, 0, 0 );  ……7}}}}}SafeRelease( pBodyIndexFrame );// Show Windowcv::imshow( "BodyIndex", bodyIndexMat );if( cv::waitKey( 30 ) == VK_ESCAPE ){break;}
}

列表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(人体 姿势)的示例程序的介绍。

转载于:https://www.cnblogs.com/TracePlus/p/4136368.html

【翻译】Kinect v2程序设计(C++) BodyIndex篇相关推荐

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

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

  2. 【论文翻译】用于移动机器人导航的Kinect v2:评估和建模

    吐槽:哇,为了图像检测的期末报告,我花了两天时间,真是一句一句的翻译过来了. 话说中文网站资料是真的靠不住...为了Kinect2的使用,我在中文网站上摸索了一个多月,自己摸鱼走了快两个月的弯路,原来 ...

  3. 深度相机(五)--Kinect v2.0

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

  4. Kinect V2开发(5)读关节数据

    Kinect能取得Depth(物体与传感器的距离信息)和BodyIndex(人物索引),基于这些数据可以侦测到人体的骨骼信息并追踪,在Kinect V2的SDK 2.0中,它最多可以同时获取到6个人. ...

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

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

  6. Kinect v1和Kinect v2的彻底比较

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

  7. 深度相机(六)--Kinect v2.0 手势样本库制作

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

  8. Kinect v2保存图像和深度图序列

    上班后的端午节就意味着多一天的假期!!! 本工作的主要出发点是录制数据集,用来供后续的建图和bug重现. 软硬件配置 环境配置如下: 系统:Ubuntu 16.04 LTS  64位 CPU: Int ...

  9. 常用摄像头一些点云深度矫正ROS程序(ZED kinect v2 D415)

    ZED摄像头 获得中心点深度,未考虑RGB与深度映射(可参考下面D415) #include <iostream> #include <fstream> #include &l ...

最新文章

  1. golang strings包部分函数使用
  2. sed、grep、awk
  3. 【uoj#225】[UR #15]奥林匹克五子棋 构造
  4. Python自动化运维——系统性能信息模块
  5. chrome插件infinity_5款超好用Chrome插件,快试试看!
  6. golang java rpc_golang两种调用rpc的方法
  7. Java new关键字和newInstance()方法的区别
  8. Leaflet文档阅读笔记-Leaflet on Mobile笔记
  9. python学习笔记之读取pdf文件库pdfplumber(一)
  10. ls只显示文件名/只显示文件夹名
  11. bypy更换绑定的百度云盘账户
  12. 如何使用云桌面系统提高涉密网络安全性与方便性
  13. QML用径向渐变做波纹效果
  14. android 设备序列号_如何查找您的Android设备的序列号
  15. 国产办公计算机,国内第一台纯国产计算机在重庆下线,芯片、系统全是纯国产...
  16. java使用佳博打印机打印标签
  17. vue中怎么实现吸顶效果
  18. 计算机经典书籍- -
  19. 解决centos 个别命令command not found 每次打开虚拟机都要sourc .bashrc
  20. 最详细的golang + 私库(gitlab gitee) 模块开发 这一篇文章解决所有问题

热门文章

  1. Openshift 4.4 静态 IP 离线安装系列(一):准备离线资源
  2. 【C库函数】qsort函数详解
  3. C#实现Windows资源管理器 C# File Explorer
  4. 《NFL橄榄球》:新奥尔良圣徒·橄榄1号位
  5. java 联合体_联合体(union)的使用方法及其本质
  6. win10系统如何恢复服务器,win10如何打开恢复选项_网站服务器运行维护
  7. 微信小程序https端口指定(非443)
  8. DHCP协议工作流程
  9. vue打包出错Failed to parse json
  10. 每日一题——饮料换购