我正在使用Kinect V2进行体积记录。我正在使用Kinect sdk版本2(在C#中)。 我想保存一个包含几个pointcloud“框架”的文件。我将在Unity中导入文件并将帧作为“Pointcloud动画”播放。我在Unity(https://vimeo.com/140683403)中已经完成了这个,但是这次我使用VisualStudio来访问SDK中的所有方法。
该文件应包含:
最终应该可以添加:
在我的第一次尝试中,我编写了一个非常简单的UserFrame类,其中包含顶点列表。然后我序列化了一个UserFrame列表,我可以在Unity中成功导入。但是,在Unity中反序列化它需要很长时间(大约一分钟录制几秒钟)所以我想知道是否有更好的方法。
这是该课程的编辑版本:
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 ();
答案 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/
因此,您必须实现一个迭代整个数组并将每个浮点放在彼此旁边的方法。然后在另一方面,通过相反的方式反序列化。这意味着您需要添加一个额外的信息,即数组的长度,以便您知道要为特定集合收集多少值。