【问题标题】:Best way of saving an array of pointclouds in a file在文件中保存点云数组的最佳方法
【发布时间】:2017-09-08 23:29:02
【问题描述】:

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

该文件应包含:

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

最终应该可以添加:

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

在我的第一次尝试中,我编写了一个非常简单的 UserFrame 类,其中包含一个顶点列表。然后我序列化了一个 UserFrames 列表,我可以在 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 ();        

【问题讨论】:

  • 您需要显示您当前正在使用的代码以保存速度较慢的代码。你这样做的原因是为了让人们写出对你不起作用的答案。编辑您的问题并添加该代码
  • 谢谢。刚刚编辑了问题。
  • 找不到任何问题。我猜你的数据太大了。考虑为此使用 Protobuf-net。它非常快。

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


【解决方案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 方法也是如此。所以我结束了使用它。

【讨论】:

    【解决方案2】:

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

    查看此基准:

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

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

    【讨论】:

      猜你喜欢
      • 2018-09-01
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多