在文件中保存一系列pointcloud的最佳方法

时间:2017-09-08 23:29:03

标签: c# unity3d kinect-sdk point-clouds kinect-v2

我正在使用Kinect V2进行体积记录。我正在使用Kinect sdk版本2(在C#中)。 我想保存一个包含几个pointcloud“框架”的文件。我将在Unity中导入文件并将帧作为“Pointcloud动画”播放。我在Unity(https://vimeo.com/140683403)中已经完成了这个,但是这次我使用VisualStudio来访问SDK中的所有方法。

该文件应包含:

  1. 顶点数组(点)
  2. 一系列颜色(每个点的颜色)
  3. 最终应该可以添加:

    1. 三角形数组
    2. 用户关节(我目前用它来记录人类)
    3. 在我的第一次尝试中,我编写了一个非常简单的UserFrame类,其中包含顶点列表。然后我序列化了一个UserFrame列表,我可以在Unity中成功导入。但是,在Unity中反序列化它需要很长时间(大约一分钟录制几秒钟)所以我想知道是否有更好的方法。

      • 我是否应该编写和解析ASCII文件?
      • 在之前的尝试中,我的顶点是数组而不是List。这会提高反序列化的速度吗?

      这是该课程的编辑版本:

      public class UserFrame
      {
      
          //Frame time-stamp. Could be long int in milliseconds
          //public float time;
      
      
          // Each element in the vertexList contains an array of 3 floats.    
          public List<float[]> vertexList;
      
      
          public UserFrame(List<float[]> _vertexList) {
              vertexList = _vertexList;
          }
      
      
      }
      

      序列化代码:

      Stream stream;
      
      stream = File.Open(finalPath, FileMode.Create);
      
      BinaryFormatter bf = new BinaryFormatter();
      
      bf.Serialize(stream, userFrameList);
      stream.Close();
      

      和反序列化(这是缓慢的部分):

      Stream stream = File.Open (fileName, FileMode.Open);
      BinaryFormatter bf = new BinaryFormatter ();
      
      dummyFrames = (List <UserFrame>)bf.Deserialize (stream);
      stream.Close ();        
      

2 个答案:

答案 0 :(得分:1)

我尝试了两种保存数据的方法。

第一种方法 尺寸为3xN的二维浮点数组,其中N是顶点数。 尺寸为4xN的二维字节数组,其中四个分量中的每一个都指代颜色的R,G,B和A分量。 这很慢。

第二种方法我决定尝试this answer。但是,protbuf不适用于二维数组,所以我不得不将我的数据转换为一维数组:

public float[] vertexX;
public float[] vertexY;
public float[] vertexZ;

public float [] r;
public float [] g;
public float [] b;
public float [] a;

事实证明,即使使用BinaryFormatter方法,更改为此数据结构显着也可提高反序列化的速度。所以我结束了那个。

答案 1 :(得分:0)

使用自定义序列化程序而不是BinaryFormatter将使您的数据更小,更快地反序列化。它需要更多代码,因为您需要知道确切的顺序,但在您的情况下,它可能值得一试。

参见此基准:

http://codebetter.com/gregyoung/2008/08/24/fast-serialization/

因此,您必须实现一个迭代整个数组并将每个浮点放在彼此旁边的方法。然后在另一方面,通过相反的方式反序列化。这意味着您需要添加一个额外的信息,即数组的长度,以便您知道要为特定集合收集多少值。