2012-07-18 67 views
0

我正在使用处理与kinect一起捕获点云数据。我的素描将点的矢量位置从kinect写入数组,并使用PrintWriter类创建文本文件,将每帧中的所有点存储在单独的文本文件中。它包含一个条件,它应该阻止打印作者写作,但它会继续写下来,并最终挂断。任何想法可能是错误的?这里是我的代码:处理 - printwriter /枚举不完成

当记录:

PVector realWorldPoint; //stores each point as a vector 
PVector[] frame = new PVector[arrayLength]; //stores all of the vectors/real world points in an array 
int index = 0; 

for(int y=0;y < context.depthHeight();y+=steps) //height = 480 
{ 
    for(int x=0;x < context.depthWidth();x+=steps) //width = 640 
    { 
     if (isRecording == true){ 
     int offset = x + y * context.depthWidth(); 
     realWorldPoint = context.depthMapRealWorld()[offset]; 
     frame[index] = realWorldPoint; 
     recording.add(frame); 
     index++; 
     } 
    } 
} 

和保存时:

if (isRecording == true){ 
    isRecording = false; 
    println("Stopped Recording"); 
    Enumeration e = recording.elements(); 
    int i = 0; 
    while (e.hasMoreElements()) { 

    // Create one directory 
    boolean success = (new File("out"+currentFile)).mkdir(); 
    PrintWriter output = createWriter("out"+currentFile+"/frame" + i++ +".txt"); 
    PVector [] frame = (PVector []) e.nextElement(); 

    for (int j = 0; j < frame.length; j++) { 
    output.println(j + ", " + frame[j].x + ", " + frame[j].y + ", " + frame[j].z); 
    } 
    output.flush(); // Write the remaining data 
    output.close(); //Doesn't seem to close 
    } 
    println("done recording"); //NEVER EXECUTES 
} 

这些都是大文件(约12,000线片),和我创建有关的这些30一秒。也许它只是超载,所以停止从未注册?此外,不确定枚举 - 这是从别人的代码复制,但我没有看到有关此数据类型的文档。

回答

2

我不知道为什么你的程序不会终止,但将深度数据存储为纯文本绝对是一个坏主意。每秒写入30个文件,每行12,000行显然是很多工作,导致应用程序和操作系统之间的许多上下文切换。

作为保存数据的替代方法,我建议使用原始二进制格式将帧写入文件。这将节省大量的空间和写入时间,因为x和y坐标由帧的结构隐含,并且z坐标不占用每个数字1个字节。

另外一个改进就是将你要写入内存的内容组装起来并一次写入文件。现在,它实际上取决于PrintWriter何时将文件写入磁盘 - 无法保证它将等待调用刷新。

根据this,您正确使用了Enumeration,所以我认为这没有问题。

结论:写入负载可能导致程序挂起。一旦写入数据变得更加高效,您就会知道。

+0

如何使用原始二进制格式进行写入? – mheavers 2012-07-19 14:40:57

+0

假设你正在使用simple-openni,context.depthMap()提供了一个int数组和深度值。我不是一个真正的Processing pro,所以我不能说写入int数组的适当方式是什么,但我认为saveBytes()(http://processing.org/reference/saveBytes_.html)可能是好的开始。对不起,我可以在概念层面帮助你。 – 2012-07-19 18:52:19

+0

总比没有好。谢谢 - 我会追求它。 – mheavers 2012-07-19 19:18:34