2.3 ColorImageStream对象的深入认识
原文地址: http://www.cnblogs.com/yangecnu/archive/2012/04/02/KinectSDK_Application_Fundamentals_Part2.html。
到此为止,我们讨论了如何发现以及初始化Kinect传感器,从Kinect的影像摄像头获取图片。现在让我们来看看一些关键的类以及它们之间的关系。图2-1展现了ColorImageStream的对象模型图,它可以说明每个类的成员以及各类之间的关系。
ColorImageStream
是KinectSensor对象的一个属性,如同KinectSensor的其它流一样,色彩数据流在使用之前需要调用Enable方法。ColorImageStream有一个重载的Enabled
方法,默认的Eanbled方法没有参数,重载的方法有一个ColorImageFormat
参数,它是一个枚举类型,可以使用这个参数指定图像格式。下表列出了枚举成员。默认的Enabled将ColorImageStream设置为每秒30帧的640*480的RGB影像数据。一旦调用Enabled方法后,就可以通过对象的Format属性获取到图像的格式了。
ColorImageFormat | 含义 |
---|---|
Undefined | 图像的分辨率不能确定 |
RgbResolution640x480Fps30 | 图像分辨率为640x480,像素格式为RGB32,每秒30帧 |
RgbResolution1280x960Fps12 | 图像分辨率为1280x960,像素格式为RGB32,每秒12帧 |
YuvResolution640x480Fps15 | 图像分辨率为640x480,像素格式为YUV,每秒15帧 |
RawYuvResolution640x480Fps15 | 图像分辨率为640x480,像素格式为原始YUV,每秒15帧 |
ColorImageStream
有5个属性可以设置摄像头的视场。这些属性都以Nominal开头,当Stream被设置好后,这些值对应的分辨率就设置好了。一些应用程序可能需要基于摄像头的光学属性比如视场角和焦距的长度来进行计算。建议程序员使用ColorImageStream的这些属性进行编程,以使得程序能够面对将来硬件分辨率的变化。
ImageStream
是ColorImageStream
的基类。因此ColorImageStream继承了4个描述每一帧每一个像素数据的属性。在之前的代码中,我们使用这些属性创建了一个WriteableBitmap
对象。这些属性与ColorImageFormat
的设置有关。ImageStream
中除了这些属性外还有一个IsEnabled
属性和Disable
方法。IsEnabled属性是一个只读的。当Stream打开时返回true,当调用了Disabled方法后就返回false了。Disable方法关闭Stream流,之后数据帧的产生就会停止,ColorFrameReady
事件的触发也会停止。当ColorImageStream设置为可用状态后,就能产生ColorImageFrame对象。ColorImageFrame对象很简单,它有一个Format
成员,它是父类的ColorImageFormat
值。他只有一个不可继承的CopyPixelDataTo
方法,能够将图像的像素数据拷贝到指定的byte数组中,PixelDataLength
属性定义了数组的大小PixelDataLength属性通过对象的宽度,高度以及每像素多少位属性来获得。这些属性都继承自ImageFrame抽象类。
数据流的格式决定了像素的格式,如果数据流是以ColorImageFormat.RgbResolution640*480Fps30
格式初始化的,那么像素的格式就是Bgr32,它表示每一个像素占32位(4个字节),第一个字节表示蓝色通道值,第二个表示绿色,第三个表示红色。第四个无用。当像素的格式是Bgra32时,第四个字节表示像素的alpha或者透明度值。如果一个图像的大小是640*480,那么对于的字节数组有122880个字节(width*height*BytesPerPixel=640*480*4)。在处理影像时有时候也会用到Stride这一术语,它表示影像中一行的像素所占的字节数,可以通过图像的宽度乘以每一个像素所占字节数得到。
除了描述像素数据的属性外,ColorImageFrame
对象还有一些描述本身的属性。Stream会为每一帧编一个号,这个号会随着时间顺序增长。应用程序不要假定每一帧的编号都比前一帧恰好大1,因为可能出现跳帧现象。另外一个描述帧的属性是Timestamp
,它存储自KinectSensor开机(调用Start方法)以来经过的毫秒数。当每一次KinectSensor开始时都会复位为0。
发布时间:2013/2/14 下午9:34:23 阅读次数:4797