刚接触到Kinect,简要地介绍一下其摄像头相关的结构功能;
Kinect 有两类摄像头,近红外摄像头和普通的视频摄像头。视频摄像头提供了一般摄像
头类似的彩色影像。这种数据流是三中数据流中使用和设置最简单的。因此我也最先接触彩色摄
像头
使用Kinect 数据流也有三部。首先是数据流必须可用。一旦数据流可用,应用程序就
可以从数据量中读取数据并对数据进行处理和展现。一旦有新的数据帧可用,这两个步骤就
会一直进行,下面的代码展现了如何初始化ColorImage 对象。
public KinectSensor Kinect { get { return this.kinect; } set { //如果带赋值的传感器和目前的不一样 if (this.kinect != value) { //如果当前的传感对象不为null if (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 -= new EventHandler<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设备,通过编程方式获取其输出的深度图像和彩色图像数据,并将其保存到本地文件中。这通常涉及到计算机视觉、传感器技术以及图像处理等领域。 Kinect...
**Kinect获取彩色图像** Kinect,由微软开发,是一款革命性的体感设备,它能够捕捉用户的身体动作,实现无触碰交互。在技术层面上,Kinect通过深度传感器、红外投影仪和摄像头来捕获环境信息。在本文中,我们将深入...
在IT领域,Kinect的应用远远超出了游戏和娱乐,尤其是在计算机视觉、机器人和人工智能等方向,它的深度摄像头和彩色摄像头成为了研究者的重要工具。 标题"Kinect采集深度和彩色图像并同时保存"涉及的是使用Kinect...
要获取彩色数据,我们需要使用Kinect的SDK(软件开发工具包)。微软提供了适用于不同平台的SDK,例如Windows SDK和Unity插件。安装SDK后,我们可以利用其中的API来编程访问Kinect的数据流。 1. **初始化Kinect**:...
标题“kinect提取彩色影像”所涉及的关键技术是使用Kinect SDK(软件开发工具包)来获取和处理彩色摄像头数据。SDK为开发者提供了丰富的接口和工具,使得编程人员能够便捷地与Kinect硬件进行通信,获取实时的彩色...
标题中的“kinect同时获取深度和彩色图片 并可以获取像素点”指的是使用Microsoft Kinect设备进行多模态数据采集,即同时捕获深度图像和彩色图像,并且具备在图像上定位鼠标点击像素点的能力。这一功能在计算机视觉...
结合RGB摄像头获取的颜色信息,可以得到彩色点云数据。 #### 四、Kinect点云数据处理工具介绍 - **PCL (Point Cloud Library)**:一个开源框架,用于处理点云数据,提供了丰富的算法库,包括滤波、分割、特征提取、...
Kinect V2是一款先进的传感器设备,它能够捕获高质量的彩色图像、深度图像以及红外图像。在处理这些数据时,一个常见的任务是进行彩色深度配准,即将深度图像与彩色图像对应起来,以便更好地理解场景的三维结构。在...
- Kinect SDK(软件开发工具包)是微软提供的用于访问Kinect设备数据的工具。这里提到的是版本1.0,它包含了一系列API,允许开发者读取和处理来自Kinect的多种传感器数据。 - 在OpenCV中,我们需要先安装并配置...
1. **彩色图像**:Kinect 的彩色摄像头能捕获RGB图像,就像普通的数码相机一样,提供直观的视觉信息。这些图像通常以.jpg 或 .png 格式保存,用于展示真实世界的色彩和细节,适合进行图像处理和计算机视觉任务。 2....
以上就是本文的主要内容和知识点,包括了Kinect for Windows SDK的安装与配置、C++程序设计、使用OpenCV库进行图像处理以及如何从Kinect获取彩色和深度数据,并通过OpenCV在屏幕上显示出来。这些知识不仅对开发人员...
- **彩色摄像头**:Kinect的彩色摄像头可以捕获RGB图像,提供类似普通数码相机的视觉效果,用于识别物体的颜色和形状。 - **红外相机**:红外相机用于生成深度图,它发出不可见的红外光并接收反射,根据返回的时间...
SDK包含了一系列的类和接口,如`BodyFrameSource`用于获取骨骼信息,`ColorFrameSource`用于获取彩色图像。为了在WPF应用中显示这些数据,我们通常会创建两个UI元素,一个用于显示骨骼图,另一个用于显示彩色图。 ...
标题中的“用C++实现Kinect深度图和彩色图实时采集”是指利用C++编程语言,结合Microsoft Kinect设备,设计一个程序来实时获取并处理Kinect的深度图像和彩色图像。Kinect是一款由微软开发的体感设备,它能够捕捉到...
标题中的“获取kinect图像”指的是使用Kinect设备获取其捕获的图像数据,包括深度图和彩色图。Kinect是微软推出的一款体感输入设备,它可以捕捉到三维空间中的深度信息以及高清晰度的彩色视频流。在IT领域,尤其是在...
### Kinect for Windows 开发技术详解 #### 一、引言 Kinect for Windows SDK 是一款由微软提供的软件开发工具包...无论是初学者还是有经验的开发者,都能从中获得有价值的洞察和技术细节,从而开启Kinect开发之旅。
Kinect传感器最初是微软为Xbox游戏机设计的一种外设,它通过红外线深度感应技术和彩色摄像头捕捉用户的动作与声音,实现无需控制器的游戏体验。随着技术的发展和开源社区的努力,Kinect逐渐被应用于更广泛的领域,如...
标题中的“Kinect+QT+openCV 读取Kinect彩图、深度图”涉及到的是一个集成技术的应用,主要是利用微软的Kinect设备,通过Qt图形界面库和OpenCV计算机视觉库来显示并处理Kinect获取的彩色图像(彩图)和深度图像。...