以良好的帧速率将Kinect深度数据写入文件

时间:2013-09-18 10:22:46

标签: c# kinect members

我正在从场景中提取深度信息,我想将点的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):

  1. 第一行中的所有realPoints X
  2. 第二行中的所有realPoints Y
  3. 第三行中的所有realPoints Z
  4. 所以我每帧有三行(640 * 480)元素。

    我的问题:

    1. 如何以这种方式写入数据?
    2. Stream Writer效率是否能够以30 fps的速度运行?

2 个答案:

答案 0 :(得分:0)

我找到了一种方法,

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中显示的图像...

答案 1 :(得分:0)

解决!为了能够保存一个这么大的流(每帧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);
}

我希望这可以帮助其他人解决同样的问题。