Записать данные глубины 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) в файл следующим образом:
- Все realPoints X в первой строке
- Все realPoints Y во второй строке
- Все realPoints Z в третьей строке
Итак, у меня будет три строки с (640*480) элементами на кадр.
Мои вопросы:
- Как я могу записать данные таким образом?
- Эффективен ли 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);
}
Я надеюсь, что это может помочь другим с той же проблемой.