【问题标题】:Write Kinect depth data to file at a good framerate以良好的帧速率将 Kinect 深度数据写入文件
【发布时间】:2013-09-18 10:22:45
【问题描述】:

我正在从场景中提取深度信息,我想将点的 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. 第一行中的所有实点 X
  2. 第二行中的所有实点 Y
  3. 第三行中的所有实点 Z

所以我将有三行,每帧包含 (640*480) 个元素。

我的问题:

  1. 我怎样才能这样写数据?
  2. Stream Writer 的效率是否足以以 30 fps 的速度工作?

【问题讨论】:

  • 您阅读过哪些关于将数据写入文件的教程和文档?这是非常基本的东西。至于StreamWriter,设置一个足够大的缓冲区大小,试试看。
  • 感谢您的回答。我找到了一种访问 X、Y 和 Z 的方法,但 StreamWriter 无法以 30 fps 的速度写入所有这些数据量。

标签: c# kinect members


【解决方案1】:

我找到了办法,用

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这个帧速率是多少?
    猜你喜欢
    • 2015-07-04
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多