和其他摄像机一样,近红外摄像机也有视场。Kinect摄像机的视野是有限的,如下图所示:

如图,红外摄像机的视场是金字塔形状的。离摄像机远的物体比近的物体拥有更大的视场横截面积。这意味着影像的高度和宽度,比如640X480和摄像机视场的物理位置并不一一对应。但是每个像素的深度值是和视场中物体离摄像机的距离是对应的。深度帧数据中,每个像素占16位,这样BytesPerPixel属性,即每一个像素占2个字节。每一个像素的深度值只占用了16个位中的13个位。如下图:

获取每一个像素的距离很容易,但是要直接使用还需要做一些位操作。可能大家在实际编程中很少情况会用到位运算。如上图所示,深度值存储在第3至15位中,要获取能够直接使用的深度数据需要向右移位,将游戏者索引(Player Index)位移除。后面将会介绍游戏者索引位的重要性。下面的代码简要描述了如何获取像素的深度值。代码中pixelData变量就是从深度帧数据中获取的short数组。PixelIndex基于待计算像素的位置就算出来的。SDK在DepthImageFrame类中定义了一个常量PlayerIndexBitmaskWidth,它定义了要获取深度数据值需要向右移动的位数。在编写代码时应该使用这一常量而不是硬编码,因为未来随着软硬件水平的提高,Kinect可能会增加能够同时识别人数的个数,从而改变PlayerIndexBitmaskWidth常量的值。

1 Int32 pixelIndex = (Int32)(p.X + ((Int32)p.Y *frame.Width));2 Int32 depth = this.depthPixelDate[pixelIndex] >> DepthImageFrame.PlayerIndexBitmaskWidth;

显示深度数据最简单的方式是将其打印出来。我们要将像素的深度值显示到界面上,当鼠标点击时,显示鼠标点击的位置的像素的深度值。第一步是在主UI界面上添加一个TextBlock:

接着我们要处理鼠标点击事件。在添加该事件前,需要首先添加一个私有变量lastDepthFrame来保存每一次DepthFrameReady事件触发时获取到的DepthFrame值。因为我们保存了对最后一个DepthFrame对象的引用,所以事件处理代码不会马上释放该对象。然后,注册DepthFrame 图像控件的MouseLeftButtonUp事件。当用户点击深度图像时,DepthImage_MouseLeftButtonUp事件就会触发,根据鼠标位置获取正确的像素。最后一步将获取到的像素值的深度值显示到界面上,代码如下:

void kinectSensor_DepthFrameReady(objectsender, DepthImageFrameReadyEventArgs e)

{if (lastDepthFrame!=null)

{

lastDepthFrame.Dispose();

lastDepthFrame= null;

}

lastDepthFrame=e.OpenDepthImageFrame();if (lastDepthFrame != null)

{

depthPixelDate= new short[lastDepthFrame.PixelDataLength];

lastDepthFrame.CopyPixelDataTo(depthPixelDate);

depthImageBitMap.WritePixels(depthImageBitmapRect, depthPixelDate, depthImageStride,0);

}

}private void DepthImage_MouseLeftButtonUp(objectsender, MouseButtonEventArgs e)

{

Point p=e.GetPosition(DepthImage);if (depthPixelDate != null && depthPixelDate.Length > 0)

{

Int32 pixelIndex= (Int32)(p.X + ((Int32)p.Y * this.lastDepthFrame.Width));

Int32 depth= this.depthPixelDate[pixelIndex] >>DepthImageFrame.PlayerIndexBitmaskWidth;

Int32 depthInches= (Int32)(depth * 0.0393700787);

Int32 depthFt= depthInches / 12;

depthInches= depthInches % 12;

PixelDepth.Text= String.Format("{0}mm~{1}'{2}", depth, depthFt, depthInches);

}

}

有一点值得注意的是,在UI界面中Image空间的属性中,宽度和高度是硬编码的。如果不设置值,那么空间会随着父容器(From窗体)的大小进行缩放,如果空间的长宽尺寸和深度数据帧的尺寸不一致,当鼠标点击图片时,代码就会返回错误的数据,在某些情况下甚至会抛出异常。像素数组中的数据是固定大小的,它是根据DepthImageStream的Enable方法中的DepthImageFormat参数值来确定的。如果不设置图像控件的大小,那么他就会根据Form窗体的大小进行缩放,这样就需要进行额外的计算,将鼠标的在Form中的位置换算到深度数据帧的维度上。这种缩放和空间转换操作很常见,在后面的文章中我们将会进行讨论,现在为了简单,对图像控件的尺寸进行硬编码。

结果如下图,由于截屏时截不到鼠标符号,所以用红色点代表鼠标位置,下面最左边图片中的红色点位于墙上,该点距离Kinect 2.905米,中间图的点在我的手上,可以看出手离Kinect距离为1.221米,实际距离和这个很相近,可见Kinect的景深数据还是很准确的。

上面最右边图中白色点的深度数据为-1mm。这表示Kinect不能够确定该像素的深度。在处理上数据时,这个值通常是一个特殊值,可以忽略。-1深度值可能是物体离Kinect传感器太近了的缘故。

kinect深度距离误差_Kinect 深度测量原理相关推荐

  1. kinect深度距离误差_azure kinect 深度相机原理

    azure kinect 深度相机原理 RGB原理就不要讲了 工作原理 Azure Kinect DK 深度相机实现调幅连续波 (AMCW) 时差测距 (ToF) 原理. 该相机将近红外 (NIR) ...

  2. kinect深度距离误差_TOF相机深度矫正基于Kinect v2

    之前的文章<answer:深度相机(TOF)矫正>由于时间匆忙,临时想了一种深度相机深度像素矫正方法,即固定高度逐像素矫正.该方法简单粗暴,效果并不理想,最近查阅了相关文献资料,基于之前的 ...

  3. Kinect V1结构光激光散斑原理及样式

     对 intel realsense F200 和 Kinect V1的coding pattern原理进行调研,知二者都使用light coding的方式,该方法与传统的coded struct ...

  4. 深度学习Anchor Boxes原理与实战技术

    深度学习Anchor Boxes原理与实战技术 目标检测算法通常对输入图像中的大量区域进行采样,判断这些区域是否包含感兴趣的目标,并调整这些区域的边缘,以便更准确地预测目标的地面真实边界框.不同的模型 ...

  5. Redis 深度历险:核心原理与应用实践

    Redis 是互联网技术架构在存储系统中使用最为广泛的中间件,它也是中高级后端工程师技术面试中面试官最喜欢问的工程技能之一,特别是那些优秀的.竞争激烈的大型互联网公司(比如 Twitter.新浪微博. ...

  6. 赠书:Redis 深度历险:核心原理与应用实践

    Redis 是互联网技术架构在存储系统中使用得最为广泛的中间件,它也是中高级后端工程师技术面试中面试官最喜欢问的工程技能之一,特别是那些优秀的.竞争激烈的大型互联网公司(比如 Twitter.新浪微博 ...

  7. Kinect深度图像滤波

    from:Kinect深度图像滤波 最近在做机器视觉方面的一点工作,用Kinect作sensor获取深度数据.颜色.手势识别等.非常感激CNBlog上的两篇博文:(1)独钓寒江的http://www. ...

  8. clickhouse原理解析与应用实践_编程好书推荐《Redis 深度历险:核心原理与应用实践》...

    今天看到一本书,叫<Redis 深度历险:核心原理与应用实践>,作者叫钱文品(老钱),目前在掌阅科技出任资深开发工程师,这本书对redis的剖析还是挺深入的 对redis感兴趣的朋友可以买 ...

  9. JAVA world转图片,将Kinect深度图像转换为真实世界坐标

    我正在使用kinect,使用OpenNI 2.x,c,OpenCV . 我能够获得kinect深度流并获得灰度cv :: Mat . 只是为了说明它是如何定义的: cv::Mat m_depthIma ...

最新文章

  1. 干货丨 从遗传算法到强化学习,一文介绍五大生物启发式学习算法
  2. 计算机和打印机的耗材管理,打印设备耗材余量知多少?多种途径实时掌握
  3. map传参上下文赋值的问题
  4. 推荐几个练习听力不错的国外网站
  5. 如果是自学WEB前端的话,该如何才能找到一份7K实习生工作呢?
  6. 核磁谱图分析步骤_微谱技术:想要涂料开发,少不了仪器分析……
  7. windows优化大师怎么用_曾经辉煌的装机必备软件,你用过几个?
  8. 高性能网络编程(二):上一个10年,著名的C10K并发连接问题
  9. 超全Inventor 3d模型素材网站整理
  10. 网页复制文字要收费怎么复制
  11. 电信主机托管费用_服务器托管的收费标准(必读)
  12. python创建简单网站
  13. 再读 Laravel 5.5 文档
  14. 在Mac上使用idea搭建flink java开发环境
  15. 解决别人在收到我们发送的*.md文档时,图片无法显示的问题。
  16. 用容斥原理计算具有有限重数的多重集合的 r-组合(附代码)
  17. 拉勾网职位数据爬取与分析(一)
  18. 如何把图片压缩到1M?怎么把照片缩小到1M?
  19. 个人喜欢的学习SAP的书
  20. 太平洋游戏网暑期PSP权威导购(主机篇)

热门文章

  1. 比特币大涨,如何辨别牛市是否真正到来?
  2. 多喜临门,BCH币价应声上涨
  3. 利好不断,跑步入场支持BCH
  4. Oracle新一代数据库机 助所有规模企业迈向云端
  5. 机器学习——大数据与MapReduce
  6. 利用openssl签署多域名证书
  7. 四、Android学习第四天——JAVA基础回顾(转)
  8. java String pool
  9. 多个Silverlight应用程序如何共享一个DomainService
  10. 史上最详细版Centos6安装详细教程