0

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

该文件应包含:

  1. 顶点数组(点)
  2. 一组颜色(每个点的颜色)

最终应该可以添加:

  1. 一组三角形
  2. 用户关节(我目前正在使用它来记录人类)

在我的第一次尝试中,我编写了一个非常简单的 UserFrame 类,其中包含一个顶点列表。然后我序列化了一个 UserFrame 列表,我可以在 Unity 中成功导入它。但是,在 Unity 中反序列化它需要很长时间(大约一分钟,几秒钟的记录)所以我想知道是否有更好的方法。

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

这是该课程的编辑版本:

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 ();        
4

2 回答 2

1

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

一种方法 大小为 3xN 的二维浮点数组,其中 N 是顶点数。大小为 4xN 的二维字节数组,其中四个分量中的每一个都引用颜色的 R、G、B 和 A 分量。这非常慢。

第二种方法我决定尝试一下Protbuf-net。但是,protbuf 不适用于二维数组,因此我必须将数据转换为一维数组:

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

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

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

于 2017-10-21T03:06:08.863 回答
0

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

请参阅此基准:

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

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

于 2017-09-10T07:59:18.473 回答