Kinect学习笔记(六)——深度数据测量技术及应用
一、Kinect视角场
1、43°垂直方向和57°水平方向可视范围。

2、视角场常量值定义
|
属性 |
描述 |
| Format | 获取或设置深度图像格式 |
| MaxDepth | 获取最大深度值 |
| MinDepth | 获取最小深度值 |
| NominalDiagonalFieldOfView | 获取红外摄像头的标准场视角,单位是度 |
| NominalFocalLengthInPixels | 获取红外摄像头的标准焦距,单位是像素点 |
| NominalHorizontalFieldOfView | 获取红外摄像头的水平视角,单位是度 |
| NominalInverseFocalLengthInPixels | 获取红外摄像头的标准焦距的倒数 |
| NominalVerticalFieldOfView | 获取红外摄像头的垂直视角,单位为度 |
| Range | 设置红外摄像头采用“默认模式”还是“近景模式” |
| TooFarDepth | 获取红外值有效范围的最大值,即红外摄像头能看到的最远距离 |
| TooNearDepth | 获取红外值有效范围的最小值,即红外摄像头能看到的最近距离 |
| UnknownDepth | 未知红外距离的数值 |

3、通过骨骼跟踪对象Skeleton.ClippedEdges的属性,判断用户是否处于Kinect的有效视野范围内。
将骨骼跟踪调节到最佳位置的方法有:
**用户移动到有效视野的横截面中:例如,再Kinect游戏中会提示玩家走近一些
**通过KinectSensor.ElevationAngle属性控制Kinect的垂直仰角,改善用户的有效视角场横截面。
二、深度值与实际距离的对比
1、深度图像的每像素占用2字节,同常量DepthImage.BytesPerPiexl的定义,可以用short变量定义这个像素。其中,高13位表示从Kinect红外摄像头到最近物体对象的距离,以毫米为单位;低三位表示用户索引编号,DepthImageFrame.PlayerIndexBitmaskWidth定义了此值。

2、Kinect深度会随着目标物体的距离而发生偏差,距离越远偏差越大。

三、深度图像的直方图
1、亮度直方图属于图像处理的基本运算,通过它可以提取有效的“亮度”特征。亮度直方图能体现每个亮度值在图像中的占有率。利用“亮度”特征值,并基于一定的亮度阀值,可以从果盘中分辨出红萝卜和西红柿。
2、直方图统计信息的价值
using System;
using System.Linq;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Microsoft.Kinect; using System.Windows.Shapes; namespace KinectDepthHistogram
{
public partial class MainWindow : Window
{
//简化程序,未做预防性代码
KinectSensor sensor = KinectSensor.KinectSensors.First();
short[] pixelData; public MainWindow()
{
InitializeComponent(); this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
this.Unloaded += new RoutedEventHandler(MainWindow_Unloaded); sensor.DepthStream.Enable();
sensor.DepthFrameReady += new EventHandler<DepthImageFrameReadyEventArgs>(sensor_DepthFrameReady);
} private Int32 depthFrameBehind = 0; void sensor_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
{
bool receivedData = false; using (DepthImageFrame DFrame = e.OpenDepthImageFrame())
{
if (DFrame == null)
{
// The image processing took too long. More than 2 frames behind.
depthFrameBehind++;
labelDepthFrameBehind.Content = depthFrameBehind.ToString();
}
else
{
pixelData = new short[DFrame.PixelDataLength];
DFrame.CopyPixelDataTo(pixelData); //绘制深度直方图
DrawDepthHistogram(DFrame, pixelData); receivedData = true;
}
} if (receivedData)
{
BitmapSource source = BitmapSource.Create(640, 480, 96, 96,
PixelFormats.Gray16, null, pixelData, 640 * 2); depthImage.Source = source;
}
} void MainWindow_Unloaded(object sender, RoutedEventArgs e)
{
sensor.Stop();
} void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
sensor.Start();
} #region DepthHistogram
//有效视距范围的阀值: 0.8米到3米
private const int LowDepthThreshold = 800;
private const int HighDepthThreshold = 4000; /// <summary>
/// 绘制深度图像的直方图
/// </summary>
/// <param name="depthFrame"></param>
/// <param name="pixelData"></param>
private void DrawDepthHistogram(DepthImageFrame depthFrame, short[] pixelData)
{
int depth;
int[] depths = new int[4096];
double chartBarWidth = Math.Max(3, DepthHistogram.ActualWidth / depths.Length); //遍历深度像素数组,并获取深度值.并统计每一个深度值出现的次数
for (int i = 0; i < pixelData.Length; i++)
{
//前13位为深度值,单位毫米
depth = pixelData[i] >> DepthImageFrame.PlayerIndexBitmaskWidth; //有效视距内的统计
if (depth >= LowDepthThreshold && depth <= HighDepthThreshold)
{
depths[depth]++;
}
} int maxValue = 0;
//查找depth数组中的最大深度值
for (int i = LowDepthThreshold; i < HighDepthThreshold; i++)
{
maxValue = Math.Max(maxValue, depths[i]);
} //绘制直方图,统计各个深度段的像素个数
DepthHistogram.Children.Clear();
for (int i = LowDepthThreshold; i < HighDepthThreshold; i++)
{
//显示有深度数值的
if (depths[i] > 0)
{
Rectangle r = new Rectangle();
r.Fill = Brushes.Green;
r.Width = chartBarWidth;
r.Height = DepthHistogram.ActualHeight * (depths[i] / (double)maxValue);
r.Margin = new Thickness(1, 0, 1, 0);
r.VerticalAlignment = System.Windows.VerticalAlignment.Bottom;
DepthHistogram.Children.Add(r);
}
}
} #endregion
}
}
Kinect学习笔记(六)——深度数据测量技术及应用的更多相关文章
- Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记六:接口
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- 【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
- Redis学习笔记六:持久化实验(AOF,RDB)
作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...
- Java IO学习笔记六:NIO到多路复用
作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- python3.4学习笔记(六) 常用快捷键使用技巧,持续更新
python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...
- Go语言学习笔记六: 循环语句
Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...
- 微信小程序开发:学习笔记[9]——本地数据缓存
微信小程序开发:学习笔记[9]——本地数据缓存 快速开始 说明 本地数据缓存是小程序存储在当前设备上硬盘上的数据,本地数据缓存有非常多的用途,我们可以利用本地数据缓存来存储用户在小程序上产生的操作,在 ...
- springmvc学习笔记(18)-json数据交互
springmvc学习笔记(18)-json数据交互 标签: springmvc springmvc学习笔记18-json数据交互 springmvc进行json交互 环境准备 加入json转换的依赖 ...
随机推荐
- BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler错误的解决方法
出现这个问题是因为我的spring3.0里的包是单独引用的,缺少了别的包 譬如Configuration problem: Unable to locate Spring NamespaceHandl ...
- .net 的一个分词系统(jieba中文分词的.NET版本:jieba.NET)
简介 平时经常用Python写些小程序.在做文本分析相关的事情时免不了进行中文分词,于是就遇到了用Python实现的结巴中文分词.jieba使用起来非常简单,同时分词的结果也令人印象深刻,有兴趣的可以 ...
- php 开启curl,重启php-fpm服务
1,找到php.ini配置 find / -name 'php.ini' /usr/local/php/etc/php.ini 找到extension=php_curl.dll 把前面的分号去掉即可. ...
- ExtJS学习之路第四步:看源码,实战MessageBox
可以通过看MessageBox.js的源码来深入认识,记住它的主要用法.Ext.MessageBox是实用类,用于生成不同风格的消息框,它是Singleton(单例),别名Ext.Msg.注意Mess ...
- WhatsApp值160亿美元,腾讯推大众点评微信支付!
腾讯前脚刚入股大众点评,FB后脚就将斥资160亿美元收购WhatsApp(40亿美元现金和120亿美元股票). 为什么WhatsApp值160亿美元?这是什么东东呢?WhatsApp这款服务可以帮助用 ...
- Hadoop集群(第1期)_CentOS安装配置
CentOS 是什么? CentOS是一个基于Red Hat 企业级 Linux 提供的可自由使用的源代码企业级的 Linux 发行版本.每个版本的 CentOS 都会获得七年的支持(通过安全更新方式 ...
- 对原型prototype的详解
刚开始接触对象原型时大脑就开始起义了,脑子就转不灵清了.就感觉怎么着这个概念就是灌输不进去,俗称断路.后面找了很多资料,最主要的还是要借助于<JavaScript语言精髓>这本书,让我对这 ...
- Rotate bitmap by real angle
tl;dr; Use GDI+ SetWorldTransform With WinAPI's SetWorldTransform you can transform the space of dev ...
- DICOM:Ubuntu14环境下安装dcm4chee+oviyam2.1
背景: 之前博文DICOM:开源DICOM服务框架DCM4CHEE安装中曾介绍过在Windows7环境下安装部署dcm4chee.近期公司项目需要与部署到Linux系统的远端基于dcm4chee框架的 ...
- OpenResty(Nginx)+Lua+GraphicsMagick实现缩略图功能
http://www.hopesoft.org/blog/?p=1188 http://www.imagemagick.org/download/ 2.用法 原始图片是input.jpg,尺寸:160 ...