通过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. Oracle主键操作

    http://blog.csdn.net/zhanggnol/article/details/6221895

  2. [转]ThreadPoolExecutor线程池的分析和使用

    1. 引言 合理利用线程池能够带来三个好处. 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行. 第 ...

  3. 13、在 uwp应用中,给图片添加高斯模糊滤镜效果(一)

    如果在应用中,如果想要给app 添加模糊滤镜,可能第一想到的是第三方类库,比如 Win2d.lumia Imaging SDK .WriteableBitmapEx,不可否认,这些类库功能强大,效果也 ...

  4. PHP自毁程序

    <?php // +---------------------------------------------------------------------- // | Kill!! // | ...

  5. poj 3264 RMQ 水题

    题意:找到一段数字里最大值和最小值的差 水题 #include<cstdio> #include<iostream> #include<algorithm> #in ...

  6. 操作JNI函数以及复杂对象传递

    转自:http://blog.csdn.net/qinjuning/article/details/7607214 在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的j ...

  7. JSP页面中的pageEncoding和contentType两种属性

    关于JSP页面中的pageEncoding和contentType两种属性的区别: pageEncoding是jsp文件本身的编码 contentType的charset是指服务器发送给客户端时的内容 ...

  8. js:语言精髓笔记12--动态语言特性(2)

    对于括号内: 通过赋值时发生的重写: (Object1 = function() {}).prototype.value = 100; var obj1 = new Object1; console. ...

  9. 阿里云ECS(云服务器)之产品简介

    参考阿里产品文档:https://docs.aliyun.com/?spm=5176.100054.3.1.ywnrMX#/pub/ecs/product-introduction/concept

  10. 水题 Codeforces Round #296 (Div. 2) A. Playing with Paper

    题目传送门 /* 水题 a或b成倍的减 */ #include <cstdio> #include <iostream> #include <algorithm> ...