2016-02-01 5 views
1

Я следующий код работает на Processing 2, с Kinect:Сохранение множества точек данных в файл

import org.openkinect.freenect.*; 
import org.openkinect.processing.*; 

// Kinect Library object 
Kinect kinect; 

// Angle for rotation 
float a = 0; 

// We'll use a lookup table so that we don't have to repeat the math over and over 
float[] depthLookUp = new float[2048]; 

void setup() { 
    // Rendering in P3D 
    size(1200, 800, P3D); 
    kinect = new Kinect(this); 
    kinect.initDepth(); 

    // Lookup table for all possible depth values (0 - 2047) 
    for (int i = 0; i < depthLookUp.length; i++) { 
    depthLookUp[i] = rawDepthToMeters(i); 
    } 
} 

void draw() { 

    background(0); 

    // Get the raw depth as array of integers 
    int[] depth = kinect.getRawDepth(); 

    // We're just going to calculate and draw every 4th pixel (equivalent of 160x120) 
    int skip = 4; 

    // Translate and rotate 
    translate(width/2, height/2, -50); 
    rotateY(a); 

    for (int x = 0; x < kinect.width; x += skip) { 
    for (int y = 0; y < kinect.height; y += skip) { 
     int offset = x + y*kinect.width; 

     // Convert kinect data to world xyz coordinate 
     int rawDepth = depth[offset]; 
     PVector v = depthToWorld(x, y, rawDepth); 

     stroke(255); 
     pushMatrix(); 
     // Scale up by 200 
     float factor = 200; 
     translate(v.x*factor, v.y*factor, factor-v.z*factor); 
     // Draw a point 
     point(0, 0); 
     popMatrix(); 
    } 
    } 

    // Rotate 
    a += 0.015f; 
} 

// These functions come from: http://graphics.stanford.edu/~mdfisher/Kinect.html 
float rawDepthToMeters(int depthValue) { 
    if (depthValue < 2047) { 
    return (float)(1.0/((double)(depthValue) * -0.0030711016 + 3.3309495161)); 
    } 
    return 0.0f; 
} 

PVector depthToWorld(int x, int y, int depthValue) { 

    final double fx_d = 1.0/5.9421434211923247e+02; 
    final double fy_d = 1.0/5.9104053696870778e+02; 
    final double cx_d = 3.3930780975300314e+02; 
    final double cy_d = 2.4273913761751615e+02; 

    PVector result = new PVector(); 
    double depth = depthLookUp[depthValue];//rawDepthToMeters(depthValue); 
    result.x = (float)((x - cx_d) * depth * fx_d); 
    result.y = (float)((y - cy_d) * depth * fy_d); 
    result.z = (float)(depth); 
    return result; 
} 

Я хотел бы сохранить pointcloud данных в файл, так что я могу импортировать его позже на другую программу, таких как Cinema 4D.

Как мне создать этот файл?

ответ

0

Обработка имеет несколько функций для сохранения данных в файл, самым простым из которых является saveStrings().

Чтобы использовать функцию saveStrings(), вы просто сохраните все, что хотите сохранить, в файл String array, а затем передайте это в функцию вместе с именем файла.

Затем вы можете использовать функцию loadStrings() для чтения данных из файла обратно в String array.

Как вы форматируете данные в String, полностью зависит от вас. Вы можете сохранить его как значения, разделенные запятыми.

Дополнительная информация может быть найдена в the reference.

Если вы хотите сохранить данные в файл, который может прочитать другая программа, вам нужно сначала выяснить, в каком формате должен находиться файл. Я бы начал с открытия некоторых файлов примеров в основном тексте редактор.