2012-07-18 3 views
0

Я использую обработку совместно с kinect для сбора данных облачных точек. Мой эскиз записывает векторные местоположения точек из kinect в массив и использует класс PrintWriter для создания текстовых файлов, которые хранят все точки из каждого кадра в отдельных текстовых файлах. Он включает в себя условие, которое должно прекратить писать писателю, но оно продолжает писать и, в конце концов, зависает. Любые идеи относительно того, что может быть неправильным? Вот мой код:Обработка - printwriter/enumeration не завершается

При записи:

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

+0

Предполагая, что вы используете simple-openni, context.depthMap() предоставляет массив int с значениями глубины. Я не являюсь профессионалом обработки, поэтому не могу сказать, какой способ записи массива int является, но я думаю, что saveBytes() (http://processing.org/reference/saveBytes_.html) может быть хорошее начало. Извините, что я могу просто помочь вам на концептуальном уровне. –

+0

Лучше, чем ничего. Спасибо, я продолжу это. – mheavers

 Смежные вопросы

  • Нет связанных вопросов^_^