Kinect SDK v2预览版,取得Depth数据的方法说明。

上一节,介绍了通过使用Kinect for Windows SDK v2预览版(以下简称为,Kinect SDK v2预览版)从Kinect for Windows v2开发者预览版(后面称,Kinect v2 预览版)取得Color的方法。
 
这一节,介绍的是从Kinect取得Depth数据的方法。
 
Depth传感器
Kinect搭载Depth传感器,可以取得Depth数据(和传感器的距离信息)。
 
Kinect v1,可以读取投射的红外线pattern,从pattern的变形获取Depth的信息,搭载了「Light Coding」方式的Depth传感器。
 
Kinect v2预览版,通过从投射的红外线脉冲反射回来的时间来获得Depth的信息,变更为「Time of Flight(ToF)」方式的Depth传感器。
 
「Light Coding」是以色列PrimeSense公司的Depth传感技术。详细请参照专利信息,美国申请专利公开(US 2010/0118123 A1)- Depth Mapping using Projected Patterns。
 
「Time of Flight(ToF)」是美国微软公司收购的拥有Time of Flight(ToF)方式的Depth传感技术的公司(3DV Systems公司,Canesta公司),一般认为使用的是这个技术。
 
Depth数据的分辨率,Kinect v1是320×240,不过,Kinect v2预览版提升为512×424。另外,深度方向的分辨率也提高了。
可以取得Depth的数据范围,Kinect v1是0.8~4.0[m]的范围, Kinect v2预览版可以取得0.5~4.5[m]的范围。
 
上面说的是Default Mode的Depth数据范围。Kinect v1提供了取得近距离的Depth数据的Near Mode(0.4~3.0[m])和取得远距离Depth数据的Extended Depth(~约10.0[m])。但是,偏离Default Mode的范围的Depth数据的精度会下降。
 
这节,介绍从Depth传感器取得Depth数据的方法。
图1「Light Coding」方式和「Time of Flight(ToF)」方式的差异(Depth传感器的工作原理的图像)
示例程序
 
Kinect SDK v2预览版取得Depth数据,可视化展示的示例程序。上一节的介绍的数据取得阶段的摘录解说。这个示例程序的全部内容,在下面的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「Sensor」的部分(重发)
1 处理Kinect v2预览版的Sensor接口。
2 取得默认的Sensor。
3 打开Sensor。
 
「Source」
从「Sensor」取得「Source」。
// Source
IDepthFrameSource* pDepthSource; ……
hResult = pSensor->get_DepthFrameSource( &pDepthSource ); ……
if( FAILED( hResult ) ){
std::cerr << "Error : IKinectSensor::get_DepthFrameSource()" << std::endl;
return -;
}
列表1.2 相当于图1「Source」的部分
1 取得Depth Frame的Source接口。
2 从Sensor取得Source。
 
  Kinect SDK v1,要取得Depth数据主要是利用可以同时取得的Depth和Player(人体区域)的「Stream」。因此,必须要有Depth数据和Player数据的分割处理。(注:Kinect SDK v1提供2种方式来处理Depth和Player Index,老的方法返回一组USHORT,通过位移分离两者;新的方法返回各为2个USHORT的结构)
 
Kinect SDK v2预览版,Depth和BodyIndex(相当于Kinect SDK v1的Player)分别作为「Source」取得,关于BodyIndex在下一节介绍。
 
Kinect SDK v1也准备了取得Depth的「Stream」,因为获取Player和Skeleton(人体姿势)数据的情况也很多,主要可以同时取得Depth和Player的「Stream」。
 
「Reader」
「Source」从打开「Reader」。
// Reader
IDepthFrameReader* pDepthReader; ……
hResult = pDepthSource->OpenReader( &pDepthReader ); ……
if( FAILED( hResult ) ){
std::cerr << "Error : IDepthFrameSource::OpenReader()" << std::endl;
return -;
}
列表1.3 相当于图1「Reader」的部分
1 取得Depth Frame的Reader接口。
2 从Source打开Reader。
 
「Frame」~「Data」
从「Reader」取得最新的「Frame」。
int width = ;  ……
int height = ; ……
unsigned int bufferSize = width * height * sizeof( unsigned short ); ……
cv::Mat bufferMat( height, width, CV_16SC1 ); ……
cv::Mat depthMat( height, width, CV_8UC1 ); ……
cv::namedWindow( "Depth" );
while( ){
// Frame
IDepthFrame* pDepthFrame = nullptr; ……
hResult = pDepthReader->AcquireLatestFrame( &pDepthFrame ); ……
if( SUCCEEDED( hResult ) ){
hResult = pDepthFrame->AccessUnderlyingBuffer( &bufferSize, reinterpret_cast<UINT16**>( &bufferMat.data ) ); ……
if( SUCCEEDED( hResult ) ){
bufferMat.convertTo( depthMat, CV_8U, -255.0f / 4500.0f, 255.0f ); ……
}
}
SafeRelease( pDepthFrame );
// Show Window
cv::imshow( "Depth", depthMat );
if( cv::waitKey( ) == VK_ESCAPE ){
break;
}
}
列表1.4 相当于图1「Frame」,「Data」的部分
1 Depth数据的尺寸(512×424)。
   这里为了简化说明,画像尺寸用硬代码来设定,示例程序可以Source取得着Frame信息。
2 Depth数据的尺寸。
3 为了处理Depth数据而准备的OpenCV的cv::Mat类型。
 「bufferMat」是16bit的原始的Depth数据,「depthMat」为了作为图像显示,把Depth数据储存到8bit的范围里的处理。
 「CV_16SC1」,是把无符号16bit整数(16S) 放入1个channel(C1)并列来表现1个像素的数据格式。(注:应该是CV_16UC1才对)
 「CV_8UC1」,是表现无符号8bit整数  (8U)的数据格式。
4 取得Depth数据的Frame接口。
5 从Reader取得最新的Frame。
6 从Frame取得Depth数据。
   取得Depth数据存储数组的指针。这里为了Depth数据可视化,方便变化处理,用cv::Mat类型来获取。
7 为了显示Depth数据图像,从16bit转换为8bit。
 
如果得到「Frame」,就可以把取出Depth数据,作成图像来可视化。
 
取出的Depth数据,像图3一样以16bit(0~4500)为1像素来构成。
因为这样的图像不能显示(注:OpenCV只能显示8bit的图像数据),需要把格式转化为8bit(0~255)的范围。示例程序,使用cv::Mat的转换命令(cv::Mat::convertTo())把离传感器距离近的显示很白(255),远的显示为很黑(0)的方式来转化。
图3 Depth数据的排列
运行结果
运行这个示例程序的话,在Kinect v2预览版取得深度图像,就像图4一样。
图4 运行结果
 
总结
本节介绍了通过Kinect SDK v2预览版取得Depth数据的示例程序。下一节介绍取得BodyIndex数据的示例程序。

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

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

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

  5. 【翻译】Kinect v1和Kinect v2的彻底比较

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

  6. Kinect v2 + WPF获取RGB与Depth图像

    date: 2017-09-04 14:51:07 Kinect V2的Depth传感器采用的是「Time of Flight(TOF)」的方式, 通过从投射的红外线反射后返回的时间来取得Depth信 ...

  7. 【计算机视觉】深度相机(五)--Kinect v2.0

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

  8. Ubuntu_ROS中应用kinect v2笔记

    Ubuntu_ROS中应用kinect v2笔记 个人觉得最重要的资料如下: 1. Microsoft Kinect v2 Driver Released http://www.ros.org/new ...

  9. ROS indigo下Kinect v2的驱动安装与调试

    ROS indigo下Kinect v2的驱动安装与调试 一.libfreenect2源码安装与测试 github地址:https://github.com/OpenKinect/libfreenec ...

随机推荐

  1. 蓝桥杯 入门训练 Fibonacci数列(水题,斐波那契数列)

    入门训练 Fibonacci数列 时间限制:1.0s   内存限制:256.0MB 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非 ...

  2. Playmaker Input篇教程之Playmaker购买下载和导入

    Playmaker Input篇教程之Playmaker购买下载和导入 Playmaker Input篇认识Playmaker Playmaker是Unity的插件,其标志如图1-1所示.开发者使用它 ...

  3. 数学 ACdream 1196 KIDx's Triangle

    题目传送门 /* 这道题花了好长时间AC,思路有,但是表达式少写了括号一直乱码,囧! 注意:a==0时要特判:) */ #include <cstdio> #include <alg ...

  4. BZOJ1077 : [SCOI2008]天平

    首先通过差分约束系统建图,用Floyed算法求出任意两个砝码差值的上下界. 然后暴力枚举放在右边的砝码C,D,通过与A,B差值的上下界分类讨论统计方案. 时间复杂度$O(N^3)$. #include ...

  5. How to Programmatically Switch between the HubTile Visual States

    In this post I am going to talk about how to programmatically switch between different HubTile Visua ...

  6. BZOJ3513: [MUTC2013]idiots

    Description 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. Input 第一行T(T<=100),表示数据组数.接下来若干行描述T组数据,每组数据第一行是n ...

  7. C#的async和await

    C# 5.0中引入了async 和 await.这两个关键字可以让你更方便的写出异步代码. 看个例子: public class MyClass { public MyClass() { Displa ...

  8. linux用户和组管理

    添加组groupadd sftp 把用户mysftp加入组sftp中:gpasswd -a mysftp sftp 把用户mysftp加入组sftp中:usermod -a -G sftp mysft ...

  9. 简单Qt网络通信

    最近要用到Qt的Socket部分,网上关于这部分的资料都比较复杂,我在这总结一下,把Socket的主要部分提取出来,实现TCP和UDP的简单通信. 1.UDP通信 UDP没有特定的server端和cl ...

  10. Html - Footer

    通用的Footer代码片段 <style> #footer { padding: 20px; text-align: center; background-color: #666; bor ...