[KinectWPF程序]2彩色图像,使用WriteableBitmap对象改进Kinect图像显示&复杂的Kinect初始化方法
来源:互联网 发布:不亦说乎和不亦乐乎 编辑:程序博客网 时间:2024/04/29 21:34
[KinectWPF程序]2彩色图像,使用WriteableBitmap对象改进Kinect图像显示&复杂的Kinect初始化方法
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;using Microsoft.Kinect;/* 改进方法是使用WriteableBitmap对象。 * 它位于System.Windows.Media.Imaging命名空间下面, * 该对象被用来处理需要频繁更新的像素数据。 * 当创建WriteableBitmap时,应用程序需要指定它的高度, * 宽度以及格式,以使得能够一次性为WriteableBitmap创建好内存, * 以后只需根据需要更新像素即可。*/namespace WpfApplication10{ /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { //私有Kinectsensor对象 private KinectSensor kinect; private WriteableBitmap colorImageBitMap; private Int32Rect colorImageBitmapRect; private int colorImageStride; public KinectSensor Kinect { get { return this.kinect; } set { //如果带赋值的传感器和目前的不一样 if (this.kinect != value) { //如果当前的传感对象不为null if (this.kinect != null) { //uninitailize当前对象 this.kinect = null; UninitializeKinectSensor(this.kinect); } //如果传入的对象不为空,且状态为连接状态 if (value != null && value.Status == KinectStatus.Connected) { this.kinect = value; InitializeKinectSensor(this.kinect); } } } } public MainWindow() { InitializeComponent(); this.Loaded += (s, e) => DiscoverKinectSensor(); this.Unloaded += (s, e) => this.kinect = null; } private void DiscoverKinectSensor() { KinectSensor.KinectSensors.StatusChanged += KinectSensors_StatusChanged; this.Kinect = KinectSensor.KinectSensors.FirstOrDefault(x => x.Status == KinectStatus.Connected); } 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:处理其他情况下的状态 } } private void InitializeKinectSensor(KinectSensor kinectSensor) { if (kinectSensor != null) { ColorImageStream colorStream = kinectSensor.ColorStream; colorStream.Enable(); //创建WriteableBitmap对象,准备接收像素数据 this.colorImageBitMap = new WriteableBitmap(colorStream.FrameWidth, colorStream.FrameHeight, 96, 96, PixelFormats.Bgr32, null); this.colorImageBitmapRect = new Int32Rect(0, 0, colorStream.FrameWidth, colorStream.FrameHeight); this.colorImageStride = colorStream.FrameWidth * colorStream.FrameBytesPerPixel; ImageShow.Source = this.colorImageBitMap; kinectSensor.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>(kinectSensor_ColorFrameReady); kinectSensor.Start(); } } private void UninitializeKinectSensor(KinectSensor kinectSensor) { if (kinectSensor != null) { kinectSensor.Stop(); kinectSensor.ColorFrameReady -= new EventHandler<ColorImageFrameReadyEventArgs>(kinectSensor_ColorFrameReady); } } private void kinectSensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e) { using (ColorImageFrame frame = e.OpenColorImageFrame()) { if (frame != null) { byte[] pixelData = new byte[frame.PixelDataLength]; frame.CopyPixelDataTo(pixelData); //关闭每个像素点的蓝色和绿色通道。 //for循环遍历每个像素,使得i的起始位置重视该像素的第一个字节。 //由于数据的格式是Bgr32,即RGB32位(一个像素共占4个字节,每个字节8位), //所以第一个字节是蓝色通道,第二个是绿色,第三个是红色。 //循环体内,将第一个和第二个通道设置为0.所以输出的代码中只用红色通道的信息。这是最基本的图像处理。 for (int i = 0; i < pixelData.Length; i += frame.BytesPerPixel) { pixelData[i] = 0x25;//蓝色 pixelData[i + 1] = 0x00;//绿色 } //调用WriteableBitmap对象的WritePixels方法来更新图像 this.colorImageBitMap.WritePixels(this.colorImageBitmapRect, pixelData, this.colorImageStride, 0); } } } }}
0 0
- [KinectWPF程序]2彩色图像,使用WriteableBitmap对象改进Kinect图像显示&复杂的Kinect初始化方法
- [KinectWPF程序]1深度图像,使用WriteableBitmap对象改进Kinect图像显示&复杂的Kinect初始化方法
- [KinectWPF程序]单帧彩色图像获取&使用WriteableBitmap对象
- Ogre中显示Kinect的彩色图像
- 如何使用Kinect显示彩色图像和深度图像。
- [KinectWPF程序]Kinect初始化&彩色&深度数据 注册AllFrameReady同步事件方式
- kinect 深度彩色图像对齐的问题
- [KinectWPF程序]单帧彩色图像获取
- ROS使用openni获取Kinect彩色图像和深度图像
- Kinect彩色相机标定(一):彩色图像的采集
- Unity3D Kinect 实时显示对象的头部图像
- OpenCV--鼠标响应Kinect彩色图像显示深度信息
- Kinect for Windows 实践笔记NO.1 彩色图像显示
- kinect,openni,opencv 获取并显示深度与彩色图像
- OpenNI结合OpenCV显示Kinect彩色、深度及融合图像
- Kinect入门(1)——显示彩色图像数据流
- Kinect Winform程序中 彩色图像帧转化为Bitmap
- Kinect获取彩色图像(Kinect + OpenCV 2.3.0)
- ++i,i++运行计算区别
- tornado学习笔记(三):子类需要重写的RequestHandler的方法
- Building a Dynamic UI with Fragments笔记
- jQuery选择器之可见性筛选选择器
- 截取字符串为数组的形式
- [KinectWPF程序]2彩色图像,使用WriteableBitmap对象改进Kinect图像显示&复杂的Kinect初始化方法
- JavaScript利用Cookie保存页面状态信息
- ViewPager实现选项卡
- jquery生成UUID
- IIS8请求筛选模块被配置为拒绝超过请求内容长度
- AndroidManifest中Application、Activity、Service属性介绍(转 )
- android meta-data 笔记
- Android自动化测试
- html+css笔记总结