一般使用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
三、存放视频格式:
需要用到emgucv,网上资料很多。但是注意版本问题。我的是64位,原理差不多,运行的时候记得复制opencv的一些dll到debug目录或者release目录下。要指定编码方式,不然数据没有压缩会很大
PS:
还有其他方法比如用aforge.net进行录制等等。还可以参考ispy开源工程。