Kinect for Windows SDK开发入门三基础知识 下Word文档格式.docx
- 文档编号:15829483
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:17
- 大小:2.28MB
Kinect for Windows SDK开发入门三基础知识 下Word文档格式.docx
《Kinect for Windows SDK开发入门三基础知识 下Word文档格式.docx》由会员分享,可在线阅读,更多相关《Kinect for Windows SDK开发入门三基础知识 下Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
每一幅图像的大小都是不变的,因此在创建WriteableBitmap时只需计算一次即可。
InitializeKinect方法中加粗的部分是更改的代码。
创建WriteableBitmap对象,准备接收像素数据,图像的范围同时也计算了。
在初始化WriteableBitmap的时候,同时也绑定了UI元素(名为ColorImageElement的Image对象)。
此时WriteableBitmap中没有像素数据,所以UI上是空的。
privateWriteableBitmapcolorImageBitmap;
privateInt32RectcolorImageBitmapRect;
privateintcolorImageStride;
privatebyte[]colorImagePixelData;
if(kinectSensor!
=null)
{
ColorImageStreamcolorStream=kinectSensor.ColorStream;
colorStream.Enable();
this.colorImageBitMap=newWriteableBitmap(colorStream.FrameWidth,colorStream.FrameHeight,
96,96,PixelFormats.Bgr32,null);
this.colorImageBitmapRect=newInt32Rect(0,0,colorStream.FrameWidth,colorStream.FrameHeight);
this.colorImageStride=colorStream.FrameWidth*colorStream.FrameBytesPerPixel;
ColorImageElement.Source=this.colorImageBitMap;
kinectSensor.ColorFrameReady+=kinectSensor_ColorFrameReady;
kinectSensor.Start();
}
还需要进行的一处改动是,对ColorFrameReady事件响应的代码。
如下图。
首先删除之前创建Bitmap那部分的代码。
调用WriteableBitmap对象的WritePixels方法来更新图像。
方法使用图像的矩形范围,代码像素数据的数组,图像的Stride,以及偏移(offset).偏移量通常设置为0。
privatevoidKinect_ColorFrameReady(objectsender,ColorImageFrameReadyEventArgse)
{
using(ColorImageFrameframe=e.OpenColorImageFrame())
{
if(frame!
byte[]pixelData=newbyte[frame.PixelDataLength];
frame.CopyPixelDataTo(pixelData);
this.colorImageBitmap.WritePixels(this.colorImageBitmapRect,pixelData,this.colorImageStride,0);
}
基于Kinect的应用程序在无论是在显示ColorImageStream数据还是显示DepthImageStream数据的时候,都应该使用WriteableBitmap对象来显示帧影像。
在最好的情况下,彩色数据流会每秒产生30帧彩色影像,这意味着对内存资源的消耗比较大。
WriteableBitmap能够减少这种内存消耗,减少需要更新影响带来的内存开辟和回收操作。
毕竟在应用中显示帧数据不是应用程序的最主要功能,所以在这方面减少内像存消耗显得很有必要。
2.简单的图像处理
每一帧ColorImageFrame都是以字节序列的方式返回原始的像素数据。
应用程序必须以这些数据创建图像。
这意味这我们可以对这些原始数据进行一定的处理,然后再展示出来。
下面来看看如何对获取的原始数据进行一些简单的处理。
voidkinectSensor_ColorFrameReady(objectsender,ColorImageFrameReadyEventArgse)
using(ColorImageFrameframe=e.OpenColorImageFrame())
for(inti=0;
i<
pixelData.Length;
i+=frame.BytesPerPixel)
pixelData[i]=0x00;
//蓝色
pixelData[i+1]=0x00;
//绿色
this.colorImageBitMap.WritePixels(this.colorImageBitmapRect,pixelData,this.colorImageStride,0);
以上的实验关闭了每个像素点的蓝色和绿色通道。
for循环遍历每个像素,使得i的起始位置重视该像素的第一个字节。
由于数据的格式是Bgr32,即RGB32位(一个像素共占4个字节,每个字节8位),所以第一个字节是蓝色通道,第二个是绿色,第三个是红色。
循环体类,将第一个和第二个通道设置为0.所以输出的代码中只用红色通道的信息。
这是最基本的图像处理。
代码中对像素的操作和像素着色函数相识,可以通过很复杂的算法来进行。
大家可以试试对这些像素赋予一些其它的值然后再查看图像的显示结果。
这类操作通常很消耗计算资源。
像素着色通常是GPU上的一些很基础的操作。
下面有一些简单的算法用来对像素进行处理。
∙InvertedColor
pixelData[i]=(byte)~pixelData[i];
pixelData[i+1]=(byte)~pixelData[i+1];
pixelData[i+2]=(byte)~pixelData[i+2];
∙ApocalypticZombie
pixelData[i]=pixelData[i+1];
pixelData[i+1]=pixelData[i];
∙Grayscale
bytegray=Math.Max(pixelData[i],pixelData[i+1])
gray=Math.Max(gray,pixelData[i+2]);
pixelData[i]=gray;
pixelData[i+1]=gray;
pixelData[i+2]=gray;
∙Grainyblackandwhitemovie
bytegray=Math.Min(pixelData[i],pixelData[i+1]);
gray=Math.Min(gray,pixelData[i+2]);
pixelData[i+2]=gray;
∙Washedoutcolor
doublegray=(pixelData[i]*0.11)+(pixelData[i+1]*0.59)+(pixelData[i+2]*0.3);
doubledesaturation=0.75;
pixelData[i]=(byte)(pixelData[i]+desaturation*(gray-pixelData[i]));
pixelData[i+1]=(byte)(pixelData[i+1]+desaturation*(gray-pixelData[i+1]));
pixelData[i+2]=(byte)(pixelData[i+2]+desatuation*(gray-pixelData[i+2]));
∙Highsaturation
If(pixelData[i]<
0x33||pixelData[i]>
0xE5)
pixelData[i]=0x00;
}else
pixelData[i]=0Xff;
If(pixelData[i+1]<
0x33||pixelData[i+1]>
pixelData[i+1]=0x00;
pixelData[i+1]=0Xff;
If(pixelData[i+2]<
0x33||pixelData[i+2]>
pixelData[i+2]=0x00;
一下是上面操作后的图像:
3.截图
有时候,可能需要从彩色摄像头中截取一幅图像,例如可能要从摄像头中获取图像来设置人物头像。
为了实现这一功能,首先需要在界面上设置一个按钮,代码如下:
<
Windowx:
Class="
KinectApplicationFoundation.MainWindow"
xmlns="
xmlns:
x="
Title="
ColorImageStreamFromKinect"
Height="
350"
Width="
525"
>
<
Grid>
Imagex:
Name="
ColorImageElement"
/Image>
StackPanelHorizontalAlignment="
Left"
VerticalAlignment="
Top"
ButtonContent="
TakePicture"
Click="
TakePictur
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Kinect for Windows SDK开发入门三基础知识 SDK 开发 入门 基础知识