Kinect深度图像滤波
from:Kinect深度图像滤波
最近在做机器视觉方面的一点工作,用Kinect作sensor获取深度数据、颜色、手势识别等。非常感激CNBlog上的两篇博文:(1)独钓寒江的http://www.cnblogs.com/yangecnu/archive/2012/03/30/KinectSDK_Geting_Started.html 从中学到了不少关于在WPF平台上使用C#,利用微软Kinect SDK开发自己的应用程序的知识,给了我很大的帮助,在此表示感谢!
但是博主独钓寒江的博文中,针对深度图像滤波,只简要说了取反和用Bgr32表示深度图像,效果不是很理想。
后来,发现了另一篇博文(2)何文西的http://www.cnblogs.com/TravelingLight/archive/2012/05/25/2517680.html介绍了国外的一篇文章,上面介绍了外国作者自己开发的两种滤波方法:像素滤波法,加权移动平均法。效果很好!可惜只有代码片段无法试验,而且滤波算法不是特别容易理解。实在可惜!
前几天偶然跟踪并找到了作者的源代码http://kinectdepthsmoothing.codeplex.com/,下载来看。运行发现,程序要求:VS2012以上、Kinect SDK 1.7以上版本,而根据独钓寒江的博文指导,其中的代码用的是SDK 1.0,进一步发现其中的一些API函数,数据类型都不相同,再者,Kinectdepthsmoothing中xaml代码用的是后台创建,而独钓寒江的博文中xaml用的是布局式,而我对xaml又不懂,如何把这两个程序结合起来呢?
由于独钓寒江的博文给出的程序中,有大量的功能实现,比如保存图像、鼠标单击显示像素深度值、彩色渲染、人体尺寸获取,游戏者索引等等,而外国朋友的kinectdepthsmoothing程序只有滤波和保存图像,那么考虑把滤波模块移植到独钓寒江的程序中,并且不改变原来的布局式界面。在移植的过程中,主要解决了以下几个类型不兼容的问题:
a) 将short[] pixelData类型改成DepthImagePixel[] pixelData,这里注意:SDK 1.8版本中,private DepthImagePixel[] depthPixels;其中获取深度数据为
1 short depth=depthPixels[i].Depth;
而SKD 1.0版本中,short[] pixelData获取深度数据的方式为
1 Int32 depth =this.depthPixels[pIndex] >> DepthImageFrame.PlayerIndexBitmaskWidth;
需要进行移位操作。而且两种方式的depth类型不一样,一个是short16位,一个是Int32位。
b) 用三通道Bgr32格式的colorBitmap存储深度图像,而不是Gray16格式的depthBitmap。除了深度数组的格式不一样之外,外国朋友的程序中,有这样几行代码值得关注,
1 //获得当前帧最大和最小可用的深度值 2 short minDepth = (short)lastDepthFrame.MinDepth; 3 short maxDepth = (short)lastDepthFrame.MaxDepth;
以及
1 //在这里将depthPixels数组中的深度值,逐元素,转换并存储到colorPixles中 2 3 //最后,将colorPixels写入colorBitmap中 4 5 int colorPixelIndex = 0; 6 7 for (int i = 0; i < depthPixels.Length; i++) 8 9 { 10 11 //获取该元素(点)的深度值 12 13 short depth = depthPixels[i].Depth; 14 15 byte intensity = (byte)255; 16 17 int newMax = depth - minDepth; 18 19 if (newMax > 0) 20 21 {intensity = (byte)(255 - (255 * newMax / (3150))); } 22 23 this.colorPixels[colorPixelIndex++] = intensity;//blue 24 25 this.colorPixels[colorPixelIndex++] = intensity;//green 26 27 this.colorPixels[colorPixelIndex++] = intensity;//red 28 29 ++colorPixelIndex; 30 }
最后将数据写入colorBitmap时,代码为
1
2
3
4
5
|
this .colorBitmap.WritePixels(
new Int32Rect(0, 0, this .colorBitmap.PixelWidth, this .colorBitmap.PixelHeight),
this .colorPixels,
this .colorBitmap.PixelWidth * sizeof ( int ),
0);
|
使用了 this.colorBitmap.PixelWidth这个写法,而不是独钓寒江博主的程序中,使用depthStream.FrameHeight创建图像的矩形区域this.depthRect = new Int32Rect(0, 0, depthStream.FrameWidth, depthStream.FrameHeight);
c) 此外,初始化变量(数据容器depthPixels和colorPixels)时,要注意colorPixels的大小
1 this.depthPixels = new DepthImagePixel[depthStream.FramePixelDataLength]; 2 this.colorPixels = new byte[depthStream.FramePixelDataLength * sizeof(int)];
总之,将两个程序结合起来,要注意两个方面,一是界面的形式,布局还是后台创建,二是,.cs程序中由于使用的SDK版本不同,有很多API和数据类型不一致的地方,需要修改。由于正在做后续的实验,比如加入了自己的利用深度数据进行边缘检测的代码,还有很多想法没有实现,暂时写到这里吧。到时候会将完整代码上传到网络上,供大家参考!谢谢。
下篇文章将介绍基于深度值的目标分割,并附上完整代码。
Kinect深度图像滤波相关推荐
- 基于Kinect深度图像和SLAM二维地图创建
1.问题描述: 通过将kinect深度图像采集传感器安装在移动机器人上对未知室内环境进行三维探索和平面地图创建,通过装载kinect深度图采集传感器的移动机器人采集环境的彩色信息和深度信息,通过模拟激 ...
- JAVA world转图片,将Kinect深度图像转换为真实世界坐标
我正在使用kinect,使用OpenNI 2.x,c,OpenCV . 我能够获得kinect深度流并获得灰度cv :: Mat . 只是为了说明它是如何定义的: cv::Mat m_depthIma ...
- 基于Kinect深度图像采集和SLAM室内地图创建算法的matlab仿真
目录 一.理论基础 二.核心程序 三.仿真测试结果 一.理论基础 移动机器人的定位和地图创建是机器人领域的热点研究问题,也是导航中重要环节. 对于已知环境中的机器人自主定位和已知机器人位置的地图创建已 ...
- 《Kinect应用开发实战:用最自然的方式与机器对话》一3.4 深度图像成像原理...
3.4 深度图像成像原理 Kinect有发射.捕捉.计算视觉重现的类似过程.严格说来,Kinect的"深度眼睛"是由一个红外投影机和红外摄像头组合而成的,投影和接收互为重叠,如图3 ...
- 深度图像基础知识(二)
在计算机视觉系统中,三维场景信息为图像分割.目标检测.物体跟踪等各类计算机视觉应用提供了更多的可能性,而深度图像(Depth map)作为一种普遍的三维场景信息表达方式得到了广泛的应用.深度图像的每个 ...
- 动态捕捉(四)深度图像基础知识
第一部分: 深度图像(depth image)也被称为距离影像(range image),是指将从图像采集器到场景中各点的距离(深度)作为像素值的图像,它直接反映了景物可见表面的几何形状.深度图像经过 ...
- java kinect 人体识别_深度图像的Kinect骨架算法
要使用Kinect跟踪骨架,您必须启用SkeletonStream并获取其中包含骨架信息的帧(而不是从深度帧获取信息 . 它们内部不存储骨架信息) . 首先,您必须在应用程序中启用骨架流,就像使用深度 ...
- ROS kinect:OpenNI读取深度图像与彩色图像
参考:小斤的博客 1.创建你的包 catkin_create_pkg depth_rgb_image 2. 将以下代码粘贴到src/depth_rgb_image.cpp #include <s ...
- Kinect+OpenNI学习笔记之2(获取kinect的颜色图像和深度图像)
前言 网上有不少使用Qt做界面,OpenNI为库来开发kinect.或许大家的第一个问题就是询问该怎样使用Kinect来获取颜色信息图和深度信息图呢?这一节就是简单来回答这个问题的. 开发环境:QtC ...
最新文章
- 奇葩错误 -- modelsim波形显示no data(全X)
- 人工智能行业应用之:为建筑工程提供全新解决方案
- 台式计算机无线网卡,台式机用无线网卡,详细教您台式机怎么用无线网卡
- 第 10 章 容器监控 - 085 - 如何快速部署 Prometheus?
- 【配置文件】Log4j
- 皖西学院计算机科学与技术分数线,2017年皖西学院艺术类本科专业录取分数线...
- 华为云云原生数据库GaussDB加速创新,企业核心数据上云信赖之选
- Boost正则表达式库regex常用search和match示例 - 编程语言 - 开发者第2241727个问答
- Debian+Django+uWsgi+nginx+mysql+celery
- 从键盘输入n个整数,求它们的最小公倍数
- 决策树留一法python代码_西瓜书 第4章 决策树 读书笔记
- Speedoffice(excel)如何根据身份证号计算年龄
- 北京思科CCNP和思科 CCIE考试常见问题GRE虚拟专用网络详解
- 【车牌识别】基于HOG特征提取和GRNN网络的车牌识别算法matlab仿真
- 导致UIButton半透明的原因
- 严重的PHP缺陷可导致QNAP NAS 设备遭RCE攻击
- 计算机京东账户安全退出,京东账号如果提示存在风险该怎么解除?
- 2021秋招----hr面试总结
- 如何在手机下载微博APP中视频?【最新有效方法】
- 第12章 Spring AOP之扩展篇
热门文章
- 职业生涯又一个转折点
- leetcode算法题--复制带随机指针的链表★
- 代码提示_PHPStorm 支持 Laravel Facades 的代码提示
- linux下FTP命令详解
- Bootstrap3基础 disabled 多选框 鼠标放在方框与文字上都出现禁止 标识
- [javaEE] response实现图片下载
- Linux NFS服务器的安装与配置
- 2013 ACM/ICPC Asia Regional Chengdu Online We Love MOE Girls 字符串STL 的应用
- 利用mail实时监测服务器程序状态
- Storyboard初体验