`
什么世道
  • 浏览: 222813 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Kinect开发之获取彩色摄像头数据

阅读更多

 

 

 刚接触到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开发之 Interaction交互设计  
 
Kinect开发之结合Unity3D进行游戏应用开发
 
Kinect开发之体感举起手来程序设计(Kinect俄罗斯方块)
 
Kinect开发之简单姿势识别
 
Kinect开发之获取骨骼关节数据并绘制成火柴人
 
Kinect开发之获取彩色摄像头数据 
  • 大小: 38 KB
分享到:
评论

相关推荐

    kinect获取深度和彩色数据并保存

    标题“kinect获取深度和彩色数据并保存”指的是利用微软的Kinect设备,通过编程方式获取其输出的深度图像和彩色图像数据,并将其保存到本地文件中。这通常涉及到计算机视觉、传感器技术以及图像处理等领域。 Kinect...

    Kinect获取彩色图像

    **Kinect获取彩色图像** Kinect,由微软开发,是一款革命性的体感设备,它能够捕捉用户的身体动作,实现无触碰交互。在技术层面上,Kinect通过深度传感器、红外投影仪和摄像头来捕获环境信息。在本文中,我们将深入...

    Kinect采集深度和彩色图像并同时保存

    在IT领域,Kinect的应用远远超出了游戏和娱乐,尤其是在计算机视觉、机器人和人工智能等方向,它的深度摄像头和彩色摄像头成为了研究者的重要工具。 标题"Kinect采集深度和彩色图像并同时保存"涉及的是使用Kinect...

    kinect获取彩色数据并用图片形式进行保存

    要获取彩色数据,我们需要使用Kinect的SDK(软件开发工具包)。微软提供了适用于不同平台的SDK,例如Windows SDK和Unity插件。安装SDK后,我们可以利用其中的API来编程访问Kinect的数据流。 1. **初始化Kinect**:...

    kinect提取彩色影像

    标题“kinect提取彩色影像”所涉及的关键技术是使用Kinect SDK(软件开发工具包)来获取和处理彩色摄像头数据。SDK为开发者提供了丰富的接口和工具,使得编程人员能够便捷地与Kinect硬件进行通信,获取实时的彩色...

    kinect同时获取深度和彩色图片 并可以获取像素点

    标题中的“kinect同时获取深度和彩色图片 并可以获取像素点”指的是使用Microsoft Kinect设备进行多模态数据采集,即同时捕获深度图像和彩色图像,并且具备在图像上定位鼠标点击像素点的能力。这一功能在计算机视觉...

    Kinect获取点云数据+点云读取显示代码整合

    结合RGB摄像头获取的颜色信息,可以得到彩色点云数据。 #### 四、Kinect点云数据处理工具介绍 - **PCL (Point Cloud Library)**:一个开源框架,用于处理点云数据,提供了丰富的算法库,包括滤波、分割、特征提取、...

    kinect-v2彩色深度配准并修复深度图像并获取三维坐标

    Kinect V2是一款先进的传感器设备,它能够捕获高质量的彩色图像、深度图像以及红外图像。在处理这些数据时,一个常见的任务是进行彩色深度配准,即将深度图像与彩色图像对应起来,以便更好地理解场景的三维结构。在...

    opencv显示kinect深度彩色骨架数据

    - Kinect SDK(软件开发工具包)是微软提供的用于访问Kinect设备数据的工具。这里提到的是版本1.0,它包含了一系列API,允许开发者读取和处理来自Kinect的多种传感器数据。 - 在OpenCV中,我们需要先安装并配置...

    Kinect 保存彩色图和深度图

    1. **彩色图像**:Kinect 的彩色摄像头能捕获RGB图像,就像普通的数码相机一样,提供直观的视觉信息。这些图像通常以.jpg 或 .png 格式保存,用于展示真实世界的色彩和细节,适合进行图像处理和计算机视觉任务。 2....

    基于C++实现kinect+opencv 获取深度及彩色数据

    以上就是本文的主要内容和知识点,包括了Kinect for Windows SDK的安装与配置、C++程序设计、使用OpenCV库进行图像处理以及如何从Kinect获取彩色和深度数据,并通过OpenCV在屏幕上显示出来。这些知识不仅对开发人员...

    kinect实现彩色和红外图像提取和显示,自己编写的程序,好资源

    - **彩色摄像头**:Kinect的彩色摄像头可以捕获RGB图像,提供类似普通数码相机的视觉效果,用于识别物体的颜色和形状。 - **红外相机**:红外相机用于生成深度图,它发出不可见的红外光并接收反射,根据返回的时间...

    Kinect骨骼图与彩色图相结合的代码

    SDK包含了一系列的类和接口,如`BodyFrameSource`用于获取骨骼信息,`ColorFrameSource`用于获取彩色图像。为了在WPF应用中显示这些数据,我们通常会创建两个UI元素,一个用于显示骨骼图,另一个用于显示彩色图。 ...

    用C++实现Kinect深度图和彩色图实时采集

    标题中的“用C++实现Kinect深度图和彩色图实时采集”是指利用C++编程语言,结合Microsoft Kinect设备,设计一个程序来实时获取并处理Kinect的深度图像和彩色图像。Kinect是一款由微软开发的体感设备,它能够捕捉到...

    获取kinect图像

    标题中的“获取kinect图像”指的是使用Kinect设备获取其捕获的图像数据,包括深度图和彩色图。Kinect是微软推出的一款体感输入设备,它可以捕捉到三维空间中的深度信息以及高清晰度的彩色视频流。在IT领域,尤其是在...

    kinect书籍

    ### Kinect for Windows 开发技术详解 #### 一、引言 Kinect for Windows SDK 是一款由微软提供的软件开发工具包...无论是初学者还是有经验的开发者,都能从中获得有价值的洞察和技术细节,从而开启Kinect开发之旅。

    Kinect开发

    Kinect传感器最初是微软为Xbox游戏机设计的一种外设,它通过红外线深度感应技术和彩色摄像头捕捉用户的动作与声音,实现无需控制器的游戏体验。随着技术的发展和开源社区的努力,Kinect逐渐被应用于更广泛的领域,如...

    Kinect+QT+openCV 读取Kinect彩图、深度图

    标题中的“Kinect+QT+openCV 读取Kinect彩图、深度图”涉及到的是一个集成技术的应用,主要是利用微软的Kinect设备,通过Qt图形界面库和OpenCV计算机视觉库来显示并处理Kinect获取的彩色图像(彩图)和深度图像。...

Global site tag (gtag.js) - Google Analytics