我正在从场景中提取深度信息,我想将点的 X,Y,Z 位置写入文件。
using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
{
if (depthFrame != null)
{
frameWidth = depthFrame.Width;
frameHeight = depthFrame.Height;
depthFrame.CopyDepthImagePixelDataTo(this.depthPixels); //Per essere visualizzati nella finestra
depthFrame.CopyPixelDataTo(this.shortDepth); //Per essere scritti nel file
mapper.MapDepthFrameToSkeletonFrame(DepthImageFormat.Resolution640x480Fps30, depthPixels, this.realPoints);
minDepth = depthFrame.MinDepth;
maxDepth = depthFrame.MaxDepth;
colorizer.ConvertDepthFrame(this.depthPixels, minDepth, maxDepth, this.depthTreatment, this.depthFrame32);
this.writableBitmap.WritePixels(
new Int32Rect(0, 0, frameWidth, frameHeight),
this.depthFrame32,
frameWidth * Bgr32BytesPerPixel,
0);
this.kinectDepthImage.Source = this.writableBitmap;
if (this.record)
{
using (StreamWriter writer = new StreamWriter(File.Open(mypath,FileMode.Append)))
{
writer.Write(realPoints);
writer.WriteLine();
}
}
}
}
现在我想以这种方式编写一个 SkeletonPoint 变量 (realPoints) 来归档:
- 第一行中的所有真实点 X
- 第二行中的所有实点 Y
- 第三行中的所有真实点 Z
所以我会有三行,每帧有 (640*480) 个元素。
我的问题:
- 如何以这种方式写入数据?
- 流编写器是否足够高效,可以以 30 fps 的速度工作?
我找到了一种方法,用
realPoints.Select(p => p.X).ToArray()
我可以独立访问 X、Y 和 Z 坐标。我现在的问题是
using (StreamWriter writer = new StreamWriter(File.Open(mypath, FileMode.Append)))
{
writer.Write(this.framenumber + " " + timestamp.ToString("F3", CultureInfo.InvariantCulture.NumberFormat));
writer.WriteLine();
writer.Write(String.Join(",", realPoints.Select(p => p.X).ToArray()));
writer.WriteLine();
writer.Write(String.Join(",", realPoints.Select(p => p.Y).ToArray()));
writer.WriteLine();
writer.Write(String.Join(",", realPoints.Select(p => p.Z).ToArray()));
writer.WriteLine();
writer.WriteLine();
framenumber++;
}
极慢!它可以以 2fps 左右的速度工作。在写入过程中,它无法更新 GUI 中显示的图像......
解决了!为了能够保存这么大的流(每帧 307,200 个短裤)保持较高的帧速率,我不得不使用 FileStream 类和方法 Write(byte[] array, int offset, int count)。通过这种方式,它写入一个带有字节序列的大二进制文件(每个短音由 2 个字节组成)。显然,在读取方面,您必须考虑到您正在读取字节而不是字符串。现在我可以同时编写文件并可视化深度图像(有时只是有点延迟)。
using (FileStream fs = File.Open(mypath, FileMode.Append))
{
fs.Write(byteDepth, 0, byteDepth.Length);
}
我希望这可以帮助其他有同样问题的人。