0

シーンから深度情報を抽出しており、ポイントの 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. 2 行目のすべての realPoints Y
  3. 3 行目のすべての realPoints Z

したがって、フレームごとに (640*480) の要素を持つ 3 つの行ができます。

私の質問:

  1. この方法でデータを書き込むにはどうすればよいですか?
  2. Stream Writer は 30 fps で動作するのに十分効率的ですか?
4

2 に答える 2

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 に表示される画像を更新することはできません...

于 2013-09-18T14:35:25.650 に答える
0

解決しました!この大きなストリーム (フレームあたり 307,200 ショート) を高いフレームレートを維持しながら保存できるようにするには、FileStream クラスとメソッド Write(byte[] array, int offset, int count) を使用する必要がありました。このようにして、一連のバイトを含む大きなバイナリ ファイルを書き込みます (すべての short は 2 バイトで構成されます)。明らかに、読み取り側では、文字列ではなくバイトを読み取っていることを考慮する必要があります。これで、ファイルの書き込みと深度画像の視覚化を同時に行うことができます (わずかな遅れが生じる場合もあります)。

using (FileStream fs = File.Open(mypath, FileMode.Append))
{
    fs.Write(byteDepth, 0, byteDepth.Length);
}

これが同じ問題を抱えている他の人に役立つことを願っています。

于 2013-09-19T08:47:01.537 に答える