刚接触到Kinect,简要地介绍一下其摄像头相关的结构功能;

Kinect 有两类摄像头,近红外摄像头和普通的视频摄像头。视频摄像头提供了一般摄像

头类似的彩色影像。这种数据流是三中数据流中使用和设置最简单的。因此我也最先接触彩色摄

像头

使用Kinect 数据流也有三部。首先是数据流必须可用。一旦数据流可用,应用程序就

可以从数据量中读取数据并对数据进行处理和展现。一旦有新的数据帧可用,这两个步骤就

会一直进行,下面的代码展现了如何初始化ColorImage 对象。

  public KinectSensor Kinect{get { return this.kinect; }set{//如果带赋值的传感器和目前的不一样if (this.kinect != value){//如果当前的传感对象不为nullif (this.kinect != null){//uninitailize 当前对象this.kinect = null;}//如果传入的对象不为空,且状态为连接状态if (value != null && value.Status == KinectStatus.Connected){this.kinect = value;}}}}

标记红色的两行调用了两个方法,分别初始化和释放KinectSensor 和ColorImageStream 对象。

InitializeKinectSensor对象调用ColorImageStream 的Enable 方法,注册ColorFrameReady 事件并调用

start 方法。

一旦打开了传感器,当新数据帧大道是就会触发frameready 事件,该事件触发频率是每秒30次。

    //初始化Kinect对象private void InitializeKinectSensor(KinectSensor kinectSensor){if (kinectSensor != null){kinectSensor.ColorStream.Enable();kinectSensor.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>;(kinectSensor_ColorFrameReady);kinectSensor.Start();}}
   //未初始化Kinect对象private void UninitializeKinectSensor(KinectSensor kinectSensor){if (kinectSensor != null){kinectSensor.Stop();kinectSensor.ColorFrameReady -= newEventHandler<ColorImageFrameReadyEventArgs>;(kinectSensor_ColorFrameReady);}}

在实现Kinect_ColorFrameReady 方法前,我们先在XAML 窗体中添加一些空间来展现获取

到的数据,代码如下:

  <Window x:Class="KinectWPF.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="350" Width="525";Grid>;<Image x:Name="ColorImageElement">;</Image>;</Grid>;
</Window>;

然后,在Kinect_ColorFrameReady 方法中,我们首先通过打开或者获取一个frame 来提

取获Frame 数据。ColorImageFrameReadyEventArgs 对象的OpenColorImageFrame 属性返回

一个当前的ColorImageFrame 对象。这个对象实现了IDisposable 接口。所以可以将这个对

象抱在using 语句中的原因,在提取像素数据之前需要使用一个Byte 数组保存获取到的数据

FrameObject 对象的PixelDataLength 对象返回数据和序列的具体大小。调用CopyPixelDataTo

方法可以填充像素数据,然后将数据展示到image 控件上,具体代码如下:

  /// <summary>;/// 将获取的图像在窗体上显示出来/// </summary>;/// <param name="sender">;</param>;/// <param name="e">;</param>;void kinectSensor_ColorFrameReady(object sender,ColorImageFrameReadyEventArgs e){using (ColorImageFrame frame = e.OpenColorImageFrame()){if (frame != null){byte[] pixelData = new byte[frame.PixelDataLength];frame.CopyPixelDataTo(pixelData);ColorImageElement.Source = BitmapImage.Create(frame.Width,frame.Height, 96, 96, PixelFormats.Bgr32,null, pixelData, frame.Width * frame.BytesPerPixel);}}}

如果需要运行获取视频信息,还需要加上以下一段代码:

首先创建一个WPF 应用程序来展示如何发现,获取Kinect 传感器的状态。先建

按一个WPF 项目,并添加Microsoft.Kinect.dll。写上加上以上的代码就OK啦~~~。

主窗体

 public MainWindow(){InitializeComponent();this.Loaded += (s, e) =>; DiscoverKinectSensor();this.Unloaded += (s, e) =>; this.kinect = null;}

获取Kinect 传感器的状态

//搜索Kinect设备
private void DiscoverKinectSensor(){KinectSensor.KinectSensors.StatusChanged += KinectSensors_StatusChanged;this.Kinect = KinectSensor.KinectSensors.FirstOrDefault(x =>; x.Status == KinectStatus.Connected);}
 //KinectSensor连接的状态private void KinectSensors_StatusChanged(object sender, StatusChangedEventArgs e){switch (e.Status){case KinectStatus.Connected:if (this.kinect == null)this.kinect = e.Sensor;break;case KinectStatus.Disconnected:if (this.kinect == e.Sensor){this.kinect = null;this.kinect = KinectSensor.KinectSensors.FirstOrDefault(x =>; x.Status == KinectStatus.Connected);if (this.kinect == null){//TODO:通知用于Kinect已拔出}}break;//TODO:处理其他情况下的状态}}

在构造函数中有两个匿名方法,一个用来监听Loaded 事件,一个用来监听Unloaded 事

件。当卸载时应该将Kinect 属性置为空。在窗口的Loaded 事件中程序通过

DiscoverKinectSensor 方法试图调用一个连接了的传感器。在窗体的Loaded 和Unloaded 事

件中注册这两个事件用来初始化和释放Kinect 对象,如果应用程序没有找到Kinect 对象,

将会通知用户。

DiscoverKinectSensor 方法只有两行代码,第一行代码注册StatusChanged 事件,第二行

代码通过lambda 表达式查询集合中第一个处在Connected 状态的传感器对象,并将该对象

复制给Kinect 属性。Kinect 属性的set 方法确保能都赋值一个合法的Kinect 对象。

StatusChanged 事件中值得注意的是,当状态为KinectSensor.Connected 的时候,if 语句限

制了应用程序只能有一个kinect 传感器,他忽略了电脑中可能连接的其他Kinect 传感器。

运行程序,就能得到从Kinect 获取的视频信息,如下图所示这是从Kinect 彩色摄像头

获取的我寝室的照片。和一般的视频没什麽两样,只不过这个是从Kinect 的视频摄像头产

小花絮:开始用VS 建工程写C#真的挺麻烦的,很多语法不太清楚,特别是WPF,后来一步一步

搜索讨论慢慢熟悉了,这不是主要问题,更主要的是Kinect硬件与电脑连接始终不稳定,特别

是之前该开始运行的时候连接了电脑没有反应,一开始以为代码的问题引用胡(啊)哥的那段

代码监控双手的动作的代码,我想这下应该不会有问题了吧!!!结果会抛出

InvalidOperationException 异常。反复观察了下发现Kinect硬件的绿色的灯居然没有

亮!!!果断花了许久才稳定地连接上...

果然有一种山穷水尽疑无路,柳暗花明又一村的感觉。于是, 本人就特记下本篇博客。

附上完整的代码,希望大家给出宝贵的意见、

Kinect开发系列博文:

Kinect开发之 Interaction交互设计  
http://yacare.iteye.com/blog/1979683
Kinect开发之结合Unity3D进行游戏应用开发
http://yacare.iteye.com/blog/1950164
Kinect开发之体感举起手来程序设计(Kinect俄罗斯方块)
http://yacare.iteye.com/blog/1950133
Kinect开发之简单姿势识别
http://yacare.iteye.com/blog/1950112
Kinect开发之获取骨骼关节数据并绘制成火柴人
http://yacare.iteye.com/blog/1950085
Kinect开发之获取彩色摄像头数据 
http://yacare.iteye.com/blog/1921786

Kinect开发之获取彩色摄像头数据相关推荐

  1. Unity体感应用开发——Kinect V2 获取彩色摄像头数据

    硬件准备 使用Kinect 第二代传感器开发体感应用,一定要买的是kinect for windows,也就是带有转换器的套装. 即不光要有 长250mm*宽85mm*高65mm 还要有 算上for ...

  2. HI3559V200获取IMX458摄像头数据_(2)sdk例程sample_vio

    文章目录 1.sample_vio介绍 1 linux client端 2 liteos server端 2.sample_vio_server如何在liteos运行 1.如何将sample_vio_ ...

  3. uniapp实现微信小程序云开发数据库访问,并解决云开发数据库获取不到数据问题

    uniapp实现微信小程序云开发数据库访问,并解决云开发数据库获取不到数据问题 使用工具是HBuilder X 1.配置好AppID(小程序ID) 在HBuilder X工具的manifest.js文 ...

  4. HI3559V200获取IMX458摄像头数据_(3)实例分析+问题解决

    文章目录 1.整体流程设计 2.模块分析 2.1 ipcm 2.2 VB初始化 2.3 vpss dump frame 2.4 YUV420SP转RGB 2.4.1 利用IVE转换出MMZ内存图像直接 ...

  5. 使用腾讯开发平台获取QQ用户数据资料

    <今天是七夕:祝大家七夕嗨皮,前可么么哒,后可啪啪啪> Tips:本篇博客将教你如何使用腾讯开发平台获取QQ用户资料 ----------------------------------- ...

  6. java获取网络摄像头数据

    1,基于ffmpeg封装类 <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform --><depe ...

  7. 自动驾驶模拟器Carla之python编程-(3)获取汽车摄像头数据

    在上节我们已经创建了一个可以形式的特斯拉model3,在本节,我们将给汽车上添加摄像头. 了解更多有关各种传感器以及如何使用它们的信息:Carla Sensors.现在,我将仅展示如何使用RGB相机. ...

  8. FFmpeg获取网络摄像头数据解码

    对USB摄像头实时编码,在前面已经探讨过了.这次改变下思路,尝试去截取网络摄像头的H264码流,将其解码播放. 这里的测试代码,是在海康摄像头的基础上进行的. 解码的大致流程和以前的保持一致,只不过增 ...

  9. HI3559V200获取IMX458摄像头数据_(1)基本逻辑

    文章目录 背景 无法使用USB摄像头 MPP架构,vi-vpss-vo 为什么要用liteos ipcm通信 背景 平台:HI3559V200 DEMO板 目的:从摄像头获取图像,进行人脸检测和识别. ...

最新文章

  1. 皮纹生物识别多元智力测量的科学原理
  2. update 两个表关联_你真的了解全量表,增量表及拉链表吗?
  3. 48幅非常搞笑的平面广告作品欣赏(上篇)
  4. 上海计算机二级报名无法选择,上海2020年二级计算机怎么报名
  5. CentOS 安装过程中格式化 SATA 硬盘巨慢的问题
  6. oracle stream 主键,oracle stream配置向导
  7. 计算机视觉python入门_计算机视觉应该怎样入门?
  8. GitForWindows工具集(GitBash命令行)
  9. 拔刀剑服务器r87修复版,我的世界拔刀剑mod刀剑修复教程
  10. bash: go: 未找到命令_golang快速入门[2.3]-go语言开发环境配置-linux
  11. Python 处理前端反调试(无限debugger)
  12. nginx ---- 配置成系统服务
  13. 浅谈算法——莫比乌斯反演
  14. 5个超实用抠图方法,哪个适用用哪个
  15. word里画的流程图怎么全选_流程图怎么做?用Word制作流程图超方便!
  16. 计算机信息资源管理岗位,信息资源管理专业的可以报考公务员的哪些职位?
  17. win10安装免安装版的mysql5.7
  18. 【蓝桥杯】~C语言数组排序
  19. 【一起学生信】群体结构图形—structure堆叠图
  20. 2008年度江苏地税纳税百强企业名单

热门文章

  1. discuz整站搬家
  2. 幽默感七个技巧_每天学点幽默口才:怎样培养说话的幽默感
  3. C/C++内存分区详解
  4. openCV 轮廓查找-测量物体尺寸
  5. vmware vconverter 从物理机迁移系统到Esxi
  6. Linux 初始 RAM 磁盘(initrd)概述
  7. 【五一特刊】FPGA零基础学习:VGA协议驱动设计
  8. HBuilder开发工具运行微信小程序模拟器详细步骤流程
  9. Java核心技术基础知识学习之Java集合(三)
  10. HDU 6681 Rikka with Cake(扫描线、动态开点线段树)