2016-06-10 17 views
1

Ich arbeite an diesem Code zum Verwalten und Speichern von Daten aus dem Microsoft Kinect, die Daten werden in der Int-Array int [] depthValues, was ich tun möchte gespeichert Speichern und speichern Sie einen Durchschnitt von mehr Frames (sagen wir 10), um glattere Daten zu erhalten und den restlichen Teil des Codes so zu lassen, wie er ist.Wie Durchschnittswerte von mehr Frames in Verarbeitung

Hier ist der Code:

import java.io.File; 
import SimpleOpenNI.*; 
import java.util.*; 
SimpleOpenNI kinect; 
void setup() 
{ 
    size(640, 480); 
    kinect = new SimpleOpenNI(this); 
    kinect.enableDepth(); 
} 
int precedente = millis(); 
void draw() 
{ 
    kinect.update(); 
    PImage depthImage = kinect.depthImage(); 
    image(depthImage, 0, 0); 
    int[] depthValues = kinect.depthMap(); 

    StringBuilder sb = new StringBuilder(); 
    Deque<Integer> row = new LinkedList<Integer>(); 
    int kinectheight = 770; // kinect distance from the baselevel [mm] 
    int scaleFactor = 1; 
    int pixelsPerRow = 640; 
    int pixelsToSkip = 40; 
    int rowNum = 0; 
    for (int i = 0; i < depthValues.length; i++) { 
    if (i > 0 && i == (rowNum + 1) * pixelsPerRow) { 
     fillStringBuilder(sb, row); 
     rowNum++; 
     sb.append("\n"); 
     row = new LinkedList<Integer>(); 
    } 
    if (i >= (rowNum * pixelsPerRow) + pixelsToSkip) { 
     row.addFirst((kinectheight - depthValues[i]) * scaleFactor); 
    } 
    } 
    fillStringBuilder(sb, row); 
    String kinectDEM = sb.toString(); 
    final String[] txt= new String[1]; //creates a string array of 2 elements 
    int savingtimestep = 15000; // time step in millisec between each saving 
    if (millis() > precedente + savingtimestep) { 
    txt[0] = "ncols   600\nnrows   480\nxllcorner  0\nyllcorner  0\ncellsize  91.6667\nNODATA_value 10\n" +kinectDEM; 
    saveStrings("kinectDEM0.tmp", txt); 
    precedente = millis(); 
    // delete the old .txt file, from kinectDEM1 to kinectDEMtrash 
    File f = new File (sketchPath("kinectDEM1.txt")); 
    boolean success = f.delete(); 

    // rename the old .txt file, from kinectDEM0 to kinectDEM1 
    File oldName1 = new File(sketchPath("kinectDEM0.txt")); 
    File newName1 = new File(sketchPath("kinectDEM1.txt")); 
    oldName1.renameTo(newName1); 
    // rename kinectDEM0.tmp file to kinectDEM0.txt 
    File oldName2 = new File(sketchPath("kinectDEM0.tmp")); 
    File newName2 = new File(sketchPath("kinectDEM0.txt")); 
    oldName2.renameTo(newName2); 

    } 
} 
void fillStringBuilder(StringBuilder sb, Deque<Integer> row) { 
    boolean emptyRow = false; 
    while (!emptyRow) { 
    Integer val = row.pollFirst(); 
    if (val == null) { 
     emptyRow = true; 
    } else { 
     sb.append(val); 
     val = row.peekFirst(); 
     if (val != null) { 
     sb.append(" "); 
     } 
    } 
    } 
} 

Antwort

1

Sie haben eine int[] Array Variable mit dem Namen depthValues. Sie können diesen Wert genauso verwenden, wie Sie einen anderen Wert verwenden können. Mit anderen Worten, können Sie einen array oder ArrayList erstellen, der mehrere int[] Werte enthält.

Hier ist, wie Sie vielleicht ein ArrayList verwenden vorherige Werte zu halten:

ArrayList<int[]> previousDepthValues = new ArrayList<int[]>(); 

void draw(){ 

    //add current depth map to ArrayList 
    previousDepthValues.add(kinect.depthMap()); 

    //limit the ArrayList to hold 10 values 
    if(previousDepthValues.size() == 11){ 
     previousDepthValues.remove(0); 
    } 

    //create an array to hold the averaged values 
    int[] averageDepthValues = new int[previousDepthValues.get(0).length]; 

    //loop over the 10 previous depth values in the ArrayList 
    for(int[] depthValue : previousDepthValues){ 
     //loop over the ints in each previous depth values array 
     for(int i = 0; i < averageDepthValues.length; i++){ 
     //add all of the values up 
     averageDepthValues[i] += depthValue[i]; 
     } 
    } 

    //divide each number to get the average 
    for(int i = 0; i < averageDepthValues.length; i++){ 
     averageDepthValues[i] /= averageDepthValues.length; 
    } 

    //averageDepthValues now holds the average of the last 10 frames 

}