c# - 保存原始深度数据

标签 c# kinect kinect-sdk

我正在尝试保存我的 kinect 原始深度数据,但我不想使用 Kinect Studio,因为我需要原始数据进行进一步计算。我正在使用 kinectv2 和 kinect sdk!

我的问题是保存数据的 FPS 很低。大约为 15-17FPS。

这是我的 Framereader(在进一步的步骤中我还想保存颜色流):

frameReader = kinectSensor.OpenMultiSourceFrameReader(FrameSourceTypes.Depth);
frameReader.MultiSourceFrameArrived += Reader_MultiSourceFrameArrived;

这里是事件:

void Reader_MultiSourceFrameArrived(object sender, MultiSourceFrameArrivedEventArgs e)
{
   var reference = e.FrameReference.AcquireFrame();
   saveFrameTest(reference);
   frame_num++;
}

这里是保存函数:

private unsafe void saveFrameTest(Object reference)
{
  MultiSourceFrame mSF = (MultiSourceFrame)reference;

  using (var frame = mSF.DepthFrameReference.AcquireFrame())
  {
      if (frame != null)
      {
          using (Microsoft.Kinect.KinectBuffer depthBuffer = frame.LockImageBuffer())
          {
              if ((frame.FrameDescription.Width * frame.FrameDescription.Height) == (depthBuffer.Size / frame.FrameDescription.BytesPerPixel))
              {
                  ushort* frameData = (ushort*)depthBuffer.UnderlyingBuffer;
                  byte[] rawDataConverted = new byte[(int)(depthBuffer.Size / 2)];

                  for (int i = 0; i < (int)(depthBuffer.Size / 2); ++i)
                  {
                      ushort depth = frameData[i];
                      rawDataConverted[i] = (byte)(depth >= frame.DepthMinReliableDistance && depth <= frame.DepthMaxReliableDistance ? (depth) : 0);
                  }

                  String date = string.Format("{0:hh-mm-ss}", DateTime.Now);
                  String filePath = System.IO.Directory.GetCurrentDirectory() + "/test/" +date+".raw";
                  File.WriteAllBytes(filePath, rawDataConverted);
                  rawDataConverted = null;

              }
          }
      }
    }
 }

更多信息: 我将我的代码包含在 Intel® Xeon® 处理器 E5-1620 3.7GHz 和 16 GB RAM 上的一个简单的控制台应用程序中。

我认为 for 循环花费了很多时间:

  for (int i = 0; i < (int)(depthBuffer.Size / 2); ++i)
                      {
                          ushort depth = frameData[i];
                          rawDataConverted[i] = (byte)(depth >= frame.DepthMinReliableDistance && depth <= frame.DepthMaxReliableDistance ? (depth) : 0);
                      }

我可以提高我的帧率。现在,我直接访问 kinectbuffer 并退出 for 循环。

Microsoft.Kinect.KinectBuffer depthBuffer = frame.LockImageBuffer();

Marshal.Copy(depthBuffer.UnderlyingBuffer, rawData_depth, 0, (depthImageSize));

depthBuffer.Dispose();
frame.Dispose();

但是我无法获得 30FPS 的速率。现在大约是 25 FPS。

最佳答案

你可以尝试这样的事情来获取你的数组。 这是我通常使用的。

var frame = frameReference.AcquireFrame();
var frameDescription = frame.FrameDescription;
ushort[] frameData = new ushort[frameDescription.Width * frameDescription.Height];
frame.CopyFrameDataToArray(frameData);

关于c# - 保存原始深度数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32883611/

相关文章:

processing - 具有多个 Kinect 的点云

c# - 在当前终端执行命令,无需打开新终端。

c# - Nest 1.0 Elasticsearch,将DateTime索引为ISO 8601

c# - 是否可以从另一个线程修改内存 'unsafe' ly 中的 WPF BitmapSource

javascript - 使用 Node.js 和 Javascript 在浏览器上输出 Kinect 2

c# - 在 Kinect v2 中强制关闭红外发射器

c# - Kinect V2 背景去除 - 在脚和头发上切割像素

c# - 从 Windows 服务启动 Windows 应用程序

java - 将 rgbMap 映射到深度Map

c++ - 内存泄漏,找不到源头