Записать данные глубины Kinect в файл с хорошей частотой кадров

Я извлекаю информацию глубины из сцены, и я хочу записать 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 в третьей строке

Итак, у меня будет три строки с (640*480) элементами на кадр.

Мои вопросы:

  1. Как я могу записать данные таким образом?
  2. Эффективен ли Stream Writer для работы на скорости 30 кадров в секунду?

2 ответа

Я нашел способ, с

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 или около того. И во время записи он не может обновить изображение, показанное в графическом интерфейсе...

Решено! Чтобы иметь возможность сохранять такой большой поток (307 200 шорт на кадр), поддерживая повышенную частоту кадров, мне пришлось использовать класс FileStream и метод Write(массив byte[], int offset, int count). Таким образом, он записывает большой двоичный файл с последовательностью байтов (каждый шорт состоит из 2 байтов). Очевидно, что на стороне чтения вы должны принять во внимание, что вы читаете байты, а не строки. Теперь я могу написать файл и визуализировать изображение глубины одновременно (иногда с небольшим отставанием).

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

Я надеюсь, что это может помочь другим с той же проблемой.

Другие вопросы по тегам