Kinect数据流录制--ColorStream

一般使用Kinect进行数据录制彩色图像的话,有多种选择:直接存为二进制流,存图片或者是存视频等。

下面主要介绍这几种方法的实现:

一、存二进制流


 1 using Microsoft.Kinect;
2 using System.IO;
3 class ColorStreamBinaryRecorder:ColorStreamRecorder
4 {
5 Stream recordstream;
6 DateTime referenceTime;
7 readonly BinaryWriter writer;
8 private string _path;
9
10 internal ColorStreamBinaryRecorder(string path)
11 {
12 _path = Path.Combine(path, "Color.replay");
13 Stream recordStream = File.Create(_path);
14 writer = new BinaryWriter(recordStream);
15 referenceTime = DateTime.Now;
16 }
17
18 public override void Record(ColorImageFrame frame)
19 {
20 /*
21 // Data
22 TimeSpan timeSpan = DateTime.Now.Subtract(referenceTime);
23 referenceTime = DateTime.Now;
24 writer.Write((long)timeSpan.TotalMilliseconds);
25 writer.Write(frame.BytesPerPixel);
26 writer.Write((int)frame.Format);
27 * */
28 writer.Write(frame.Width);
29 writer.Write(frame.Height);
30 /*
31 writer.Write(frame.FrameNumber);
32 */
33 // Bytes
34 writer.Write(frame.PixelDataLength);
35 byte[] bytes = new byte[frame.PixelDataLength];
36 frame.CopyPixelDataTo(bytes);
37 writer.Write(bytes);
38 }
39
40 public override void Stop()
41 {
42 if (writer != null)
43 {
44 writer.Close();
45 writer.Dispose();
46 }
47 if (recordstream != null)
48 {
49 recordstream.Dispose();
50 recordstream = null;
51 }
52 }
53 }

其实这个参考Kinect.toolbox即可,但是这里有一个问题就是存的数据会很大,所以不是很推荐。

二、存图片:


 1 class ColorStreamPJPGRecorder : ColorStreamRecorder
2 {
3 private string _path;
4
5 internal ColorStreamPJPGRecorder(string path)
6 {
7 _path = Path.Combine(path, "Color");
8 if (!Directory.Exists(_path))
9 {
10 Directory.CreateDirectory(_path);
11 }
12 }
13
14 public override void Record(ColorImageFrame frame)
15 {
16 if (frame == null)
17 {
18 return;
19 }
20
21 byte[] pixelBuffer = new byte[frame.PixelDataLength];
22 frame.CopyPixelDataTo(pixelBuffer);
23
24 Bitmap bitmapFrame = new Bitmap(frame.Width, frame.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
25 BitmapData bitmapData = bitmapFrame.LockBits(new Rectangle(0, 0, frame.Width, frame.Height), ImageLockMode.WriteOnly, bitmapFrame.PixelFormat);
26
27 IntPtr intPointer = bitmapData.Scan0;
28 Marshal.Copy(pixelBuffer, 0, intPointer, frame.PixelDataLength);
29
30 bitmapFrame.UnlockBits(bitmapData);
31
32 string pathtmp = Path.Combine(_path, GlobalVar.RecordFrameID + ".jpg");
33 bitmapFrame.Save(pathtmp, ImageFormat.Jpeg);
34 }
35 public override void Stop()
36 {
37
38 }

当时项目中发现一个问题就是在深度图和颜色图均存为png的情况下会出现丢失帧很严重的情况,所以这块颜色图要存为jpg格式。这个可以参考KInect
depveloper tooklit

三、存放视频格式:


 1 class ColorStreamAVIRecorder:ColorStreamRecorder
2 {
3 private string _path;
4 VideoWriter _writer;
5
6 internal ColorStreamAVIRecorder(string path)
7 {
8 _path = Path.Combine(path, "Color.avi");
9 /*CvInvoke.CV_FOURCC(‘P‘, ‘I‘, ‘M‘, ‘1‘); //= MPEG-1 codec
10 CvInvoke.CV_FOURCC(‘M‘, ‘J‘, ‘P‘, ‘G‘); //= motion-jpeg codec (does not work well)
11 CvInvoke.CV_FOURCC(‘M‘, ‘P‘, ‘4‘, ‘2‘);//= MPEG-4.2 codec
12 CvInvoke.CV_FOURCC(‘D‘, ‘I‘, ‘V‘, ‘3‘); //= MPEG-4.3 codec
13 CvInvoke.CV_FOURCC(‘D‘, ‘I‘, ‘V‘, ‘X‘); //= MPEG-4 codec
14 CvInvoke.CV_FOURCC(‘U‘, ‘2‘, ‘6‘, ‘3‘); //= H263 codec
15 CvInvoke.CV_FOURCC(‘I‘, ‘2‘, ‘6‘, ‘3‘); //= H263I codec
16 CvInvoke.CV_FOURCC(‘F‘, ‘L‘, ‘V‘, ‘1‘); //= FLV1 codec*/
17 _writer = new VideoWriter(_path, CvInvoke.CV_FOURCC(‘U‘, ‘2‘, ‘6‘, ‘3‘),30, 640, 480, true);
18 }
19
20 public override void Record(ColorImageFrame frame)
21 {
22 _writer.WriteFrame<Rgb, Byte>(frame.ToOpenCVImage<Rgb, Byte>());
23 }
24
25 public override void Stop()
26 {
27 if(_writer != null)
28 {
29 _writer.Dispose();
30 }
31 }

需要用到emgucv,网上资料很多。但是注意版本问题。我的是64位,原理差不多,运行的时候记得复制opencv的一些dll到debug目录或者release目录下。要指定编码方式,不然数据没有压缩会很大

PS:

还有其他方法比如用aforge.net进行录制等等。还可以参考ispy开源工程。

时间: 2024-10-19 16:48:56

Kinect数据流录制--ColorStream的相关文章

《Kinect应用开发实战》读书笔记---干货集合

本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接: http://blog.csdn.net/cartzhang/article/details/45029841 作者:cartzhang 说明:本帖内容同时在GALAXIX的Kinect区发表.<Kinect应用开发实战>读书笔记 此书内容针对SDK版本为1.5版本,跟后来版本之前有微小的差别. <Kinect应用开发实战>读书笔记 对于初学来说,本书很不错,将来挺多的基础和细节. 非常感谢本书作者. 以

Kinect2.0 Gesture Builder使用方法

=====Gesture Builder概述===== Kinect2.0 新版本SDK发布后,附带了一个Gesture Builder工具,这是微软发布的进行姿势识别的软件,就是不需要写姿势识别代码,直接调用Gesture Builder生成的.gba数据文件. =====Gesture Builder使用方法===== 以训练一个挥手的动作为例,说明Gesture Builder的使用方法.首先,要使用Kinect Studio录制一个KinectClip,作为训练样本. 现在开始正式使用G

kinect学习笔记(四)&mdash;&mdash;各种数据流

一.kinect开发的一个流程图 1.我们可以知道一个简单的框架就是几部分 (1)选择使用的kinect传感器 KinectSensor.KinectSensors[0] (2)打开需要的数据流 _kinect.DepthStream.Enable(); _kinect.ColorStream.Enable(); _kinect.SkeletonStream.Enable(); (3)注册事件 其实就是主要的算法在这里体现. 有个小窍门:VS的CodeSnippet快速生成事件代码,如在代码"_

Kinect 人机交互开发实践

Kinect for Windows SDK 骨骼追踪 —— 对在Kinect视野范围内移动的一个或两个人进行骨骼追踪,可追踪到人体的20个节点 深度摄像头 —— 通过深度传感器获取到视野内的环境三维位置信息 (深度图像 —— 每个像素为距离Kinect传感器的距离) —— 利用Kinect红外发射器发出的红外线对空间进行编码,无论环境光线如何都不会影响测量结果 音频处理 —— 与 Microsoft Speech 语音识别API集成 Kinect 彩色和红外图像数据的处理 彩色图像质量 ——

Kinect 开发 &mdash;&mdash; ColorBasic

创建一个Kincet项目通常需要: 1. 创建一个VS项目,一般为了展示通常创建一个wpf项目. 2. 添加Microsoft.Kinect.dll引用,如果是早期版本的SDK,这个名称可能不同. 3. 引入Kinect命名空间. Kinect支持3中类型的托管应用程序,分别是:控制台应用程序,WPF以及Windows Form应用程序. 首先来创建一个Windows 控制台应用程序,然后在Main函数所在的代码中引入Kinect命名控件,代码如下: using Microsoft.Kinect

Kinect 开发 &mdash;&mdash; 面部追踪

SDK1.5中新增了人脸识别类库:Microsoft.Kinect.Toolkit.FaceTracking使得在Kinect中进行人脸识别变得简单,该类库的源代码也在Developer Toolkit中.在Developer Toolkit中也自带人脸识别的例子,您也可以打开运行或者查看源代码. 开发前准备 要使用面部追踪功能,Kinect SDK版本应该至少是1.5,最新版本为1.6,您可以参考之前的那篇文章下载安装,Kinect SDK 和 Kinect Developer Toolkit

【翻译】Kinect v2程序设计(C++-) AudioBeam篇

Kinect v2,Microphone Array可以用来对于水平面音源方向的推测(AudioBeam)和语音识别(Speech Recognition).这一节是介绍如何取得AudioBeam. 上一节,介绍如何使用通过Kinect SDK v2预览版,从Kinect v2预览版的Color Camera和Depth 传感器中获取数据的方法. 本节,将介绍从Kinect的Microphone Array中取得AudioBeam(水平面音源方向的推测)的方法. Microphone Array

Kinect V2程序设计(C++) Color篇

Kinect SDK v2预览版,获取数据的基本流程的说明.以及取得Color图像的示例程序的介绍. 上一节,是关于当前型号Kinect for Windows(后面称作Kinect v1)和次世代型的Kinect for Windows的开发者预览版(后面称作Kinect v2 预览版)的配置比较和介绍. 从这一节开始,是Kinect的各种数据的取得方法的比较和介绍. Color Camera Kinect和通常的Web摄像头一样,搭载了 Color Camera,可以取得Color图像.关于

【Kinect开发笔记之(一)】初识Kinect

一.Kinect简介 Kinect是微软在2010年6月14日对XBOX360体感周边外设正式发布的名字.它是一种3D体感摄影机(开发代号"Project Natal"),同时它导入了即时动态捕捉.影像辨识.麦克风输入.语音辨识.社群互动等功能. 二.Kinect分类 Kinect for Xbox 360:该版本设计之初就是为了Xbox 360定制的,并未考虑其他的平台.从微软授权角度而言,它无法用于商业开发. Kinect for Windows : 固件上做了升级,支持"