我正在使用与kinect结合的处理来捕获点云数据。我的草图将点的矢量位置从kinect写入数组,并使用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++;
}
}
}
保存时AND:
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行。也许它只是超载它所以停止永远不会注册?此外,不确定枚举 - 这是从其他人的代码复制而来的,但我没有看到有关此数据类型的文档。
答案 0 :(得分:2)
我不确定为什么你的程序没有终止,但是将深度数据存储为纯文本绝对是个坏主意。每秒写入30个文件,每行12,000行显然是很多工作,导致应用程序和操作系统之间的许多上下文切换。
作为保存数据的另一种方法,我建议使用原始二进制格式将帧写入文件。这样可以节省大量空间和写入时间,因为帧的结构暗示了x坐标和y坐标,而z坐标每个数字不占用1个字节。
另一项改进包括在内存中组合您要写入的内容并立即将其写入文件。现在,它取决于PrintWriter
,何时实际将文件写入磁盘 - 无法保证它会等待刷新调用。
根据this,您正确使用了Enumeration
,所以我认为没有问题。
结论:写入加载可能导致程序挂起。一旦写入数据变得更有效,您就会知道。