2017-09-08 45 views
0

我正在使用Kinect V2進行體積記錄。我正在使用Kinect sdk版本2(使用C#)。 我想保存一個包含幾個點雲「幀」的文件。我將在Unity中導入文件並將幀作爲「Pointcloud動畫」播放。我過去在Unity(https://vimeo.com/140683403)內完成了這個工作,但是這次我使用VisualStudio來訪問SDK中的所有方法。在文件中保存點雲數組的最佳方法

該文件應包含:

  1. 頂點數組(點)
  2. 的顏色數組(每個點的顏色)

最終應該有可能增加:

  1. 一排三角形
  2. 用戶關節(我目前用它來記錄人類)

在我的第一次嘗試中,我編寫了一個非常簡單的包含頂點列表的UserFrame類。然後我序列化了一列用戶框架,我可以在Unity中成功導入。然而,在Unity中對它進行反序列化需要很長時間(大約一分鐘記錄幾秒鐘),所以我想知道是否有更好的方法。

  • 我是否應該編寫和解析ASCII文件?
  • 在之前的嘗試中,我的頂點是一個Array而不是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();   
+1

您需要顯示您當前使用的代碼以保存速度較慢的代碼。你這樣做的原因是爲了讓人們寫出完全不適合你的答案。編輯您的問題並添加該代碼 – Programmer

+0

謝謝。剛剛編輯了這個問題。 – Sergio

+0

找不到任何問題。我猜你的數據太大了。考慮爲此使用Protobuf-net。它非常快。 – Programmer

回答

1

我嘗試了幾種保存數據的方法。

第一種方法 大小爲3xN的浮點數的二維數組,其中N是頂點數。 大小爲4xN的二維字節數組,其中四個組件中的每一個都指向顏色的R,G,B和A分量。 這很慢。

第二種方法我決定給Protbuf-net一試。然而,protbuf不與2維數組工作,所以我只好我的數據轉換成一個維數組:

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

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

原來,改變這種數據結構大幅提高反序列化的速度,甚至與BinaryFormatter方法。所以我結束了使用。

0

使用自定義序列化器而不是BinaryFormatter會使你的數據越來越小,反序列化速度越快。它需要更多的代碼,因爲你需要知道確切的順序,但在你的情況下,它可能是值得的拍攝。

看到這個基準:

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

所以你必須執行,通過整個數組進行迭代,並把每個浮點的方法,彼此相鄰。然後在另一邊,你通過相反的方式反序列化。這意味着您需要添加一個額外的信息,即數組的長度,以便知道要爲特定集合收集多少個值。

相關問題