通过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」
// 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「Source」的部分
1 处理Kinect v2预览版的Sensor接口。
2 取得默认的Sensor。
3 打开Sensor。
 
「Source」
从「Sensor」取得「Source」。
// Source
IBodyIndexFrameSource* pBodyIndexSource; ……
hResult = pSensor->get_BodyIndexFrameSource( &pBodyIndexSource ); ……
if( FAILED( hResult ) ){
std::cerr << "Error : IKinectSensor::get_BodyIndexFrameSource()" << std::endl;
return -;
}
列表1.2 相当于图1「Source」的部分
1 取得BodyIndex Frame的Source接口。
2 从Sensor取得Source。
 
「Reader」
「Source」从打开「Reader」。
// Reader
IBodyIndexFrameReader* pBodyIndexReader; ……
hResult = pBodyIndexSource->OpenReader( &pBodyIndexReader ); ……
if( FAILED( hResult ) ){
std::cerr << "Error : IBodyIndexFrameSource::OpenReader()" << std::endl;
return -;
}
列表1.3 相当于图1「Reader」的部分
1 取得BodyIndex  Frame的Reader接口。
2 从Source打开Reader。
 
「Frame」~「Data」
从「Reader」取得最新的「Frame」。
int width = ;  ……
int height = ; ……
cv::Mat bodyIndexMat( height, width, CV_8UC3 ); ……
cv::namedWindow( "BodyIndex" );
// Color Table
cv::Vec3b color[]; ……
color[] = cv::Vec3b( , , );
color[] = cv::Vec3b( , , );
color[] = cv::Vec3b( , , );
color[] = cv::Vec3b( , , );
color[] = cv::Vec3b( , , );
color[] = cv::Vec3b( , , );
while( ){
// Frame
IBodyIndexFrame* pBodyIndexFrame = nullptr; ……
hResult = pBodyIndexReader->AcquireLatestFrame( &pBodyIndexFrame ); ……
if( SUCCEEDED( hResult ) ){
unsigned int bufferSize = ;
unsigned char* buffer = nullptr;
hResult = pBodyIndexFrame->AccessUnderlyingBuffer( &bufferSize, &buffer ); ……
if( SUCCEEDED( hResult ) ){
for( int y = ; y < height; y++ ){
for( int x = ; x < width; x++ ){
unsigned int index = y * width + x;
if( buffer[index] != 0xff ){
bodyIndexMat.at<cv::Vec3b>( y, x ) = color[buffer[index]]; ……
}
else{
bodyIndexMat.at<cv::Vec3b>( y, x ) = cv::Vec3b( , , ); ……
}
}
}
}
}
SafeRelease( pBodyIndexFrame );
// Show Window
cv::imshow( "BodyIndex", bodyIndexMat );
if( cv::waitKey( ) == 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(人体姿势)的示例程序的介绍。

【翻译】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. Cocos2dx实现象棋之布局

    开始界面 #ifndef SCENESTART_H #define SCENESTART_H #include "cocos2d.h" #include "SceneGa ...

  2. p235习题3

  3. netcat nc

    http://pan.baidu.com/s/1bo2IH9X#netcat 云盘下载 [root@bass ~]# tar -xjvf netcat-0.7.1.tar.bz2 [root@bass ...

  4. Android_adb shell am/pm使用

    转自:http://blog.sina.com.cn/s/blog_51335a0001017ux5.html   adb shell am instrument [options] <COMP ...

  5. C#正则表达式分组使用

    string s = "dfasfdasfdsa*fdasfdsafdsa"; s = "转发:dfasfdasfdsa*fdasfdsafdsa"; //s ...

  6. 随机sample文件Python程序

    经常遇到由于样本巨大,需要sample一部分文件进行案例分析的情况,下面的程序主要为了随机抽取一个大文件中的N行. #!/usr/bin/python # -*- coding: <encodi ...

  7. MATLAB学习笔记(九)——MATLAB符号计算

    (一)符号对象 一.建立符号对象 1.建立符号变量和符号常量(sym,syms): 只可以建立一个符号变量 可以一次性建立多个符号变量 PS:符号常量计算的结果是精确的数学表达式,而数值常量是进行约分 ...

  8. map与mapPartitions

    区别在于sc.map是将RDD下的所有行数据统计处理.而sc.mapPartitions是按RDD分区进行数据统计处理. 测试一下: val data = sc.parallelize(1 to 6, ...

  9. loadrunner解决“服务器正在运行中”方法

    问题现象: 这个问题在上家公司遇见过,今天无意中找到了解决办法: 解决方法: 打开任务管理器: 找到这个进程:ThumbProcess.exe,关掉这个进程即可解决. 今天运行lr的vugen报错 解 ...

  10. volatile的理解

    用法解释 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其 ...