simple-openni/processing — запись только на определенной глубине z

Я следую примеру RecorderPlay в библиотеке simple-openni для обработки:

http://code.google.com/p/simple-openni/

Он записывает в файл ONI, тип видеоформата, который сохраняет информацию о глубине и rgb. Однако в настоящее время он захватывает все изображение, и я хочу иметь возможность захватывать только определенный диапазон глубины z. Кто-нибудь знает возможно ли это?


person mheavers    schedule 23.07.2012    source источник


Ответы (1)


Я не думаю, что вы можете настроить диапазон глубин для записи, но вы можете обработать информацию, которую вы читаете из записи .oni:

import SimpleOpenNI.*;

SimpleOpenNI  context;
boolean       recordFlag = true;
boolean       saving = false;
int frames = 0;
int savedFrames = 0;
//change these two values as you wish:
float minZ = 100;
float maxZ = 500;

void setup(){
  context = new SimpleOpenNI(this);

  if(! recordFlag){
    if(! context.openFileRecording("test.oni") ){
      println("can't find recording !!!!");
      exit();
    }
    context.enableDepth();
  }else{  
    // recording
    context.enableDepth();
    // setup the recording 
    context.enableRecorder(SimpleOpenNI.RECORD_MEDIUM_FILE,"test.oni");
    // select the recording channels
    context.addNodeToRecording(SimpleOpenNI.NODE_DEPTH,SimpleOpenNI.CODEC_16Z_EMB_TABLES);
  }
  // set window size 
  if((context.nodes() & SimpleOpenNI.NODE_DEPTH) != 0)
    size(context.depthWidth() , context.depthHeight());
  else 
    exit();
}
void draw()
{
  background(0);
  context.update();
  if((context.nodes() & SimpleOpenNI.NODE_DEPTH) != 0) image(context.depthImage(),0,0);
  if(recordFlag) frames++;
  if(saving && savedFrames < frames){
      delay(3000);//hack
      int i = savedFrames;
      int w = context.depthWidth();
      int h = context.depthHeight();
      PrintWriter output = createWriter(dataPath("frame_"+i+".ply"));
      output.println("ply");
      output.println("format ascii 1.0");
      output.println("element vertex " + (w*h));
      output.println("property float x");
      output.println("property float y");
      output.println("property float z");
      output.println("end_header\n");
      rect(random(width),random(height),100,100);
      int[]   depthMap = context.depthMap();
      int     index;
      PVector realWorldPoint;
      for(int y=0;y < h;y++){
        for(int x=0;x < w;x++){
          index = x + y * w;
          realWorldPoint = context.depthMapRealWorld()[index];
          if(realWorldPoint.z > minZ && realWorldPoint.z < maxZ)
            output.println(realWorldPoint.x + " " + realWorldPoint.y + " " + realWorldPoint.z);
        }
      }
      output.flush();
      output.close();
      println("saved " + (i+1) + " of " + frames);
      savedFrames++;
  }
}
void keyPressed(){
  if(key == ' '){
    if(recordFlag){
      saveStrings(dataPath("frames.txt"),split(frames+" ",' '));
      exit();
    }else saveONIToPLY();
  }
}
void saveONIToPLY(){
  frames = int(loadStrings(dataPath("frames.txt"))[0]);
  saving = true;
  println("recording " + frames + " frames");
}
person George Profenza    schedule 23.07.2012
comment
Я думаю ты прав. Я нашел библиотеку кода openFrameworks, которая позволяет мне взять файл ONI и экспортировать его с определенной глубиной z, но этот код отлично подходит для его визуализации. Спасибо! - person mheavers; 24.07.2012
comment
Круто, здорово, что вы можете использовать openFrameworks, скорость намного лучше для kinect. Для более сложной обработки облаков точек вы также можете заглянуть в библиотеку облаков точек, но не забывайте, что это не очень прямолинейно. вперед к настройке (поскольку у него много зависимостей). Ваш проект звучит интересно, было бы здорово когда-нибудь увидеть что-нибудь онлайн :) Удачи! - person George Profenza; 24.07.2012
comment
Конечно, я пришлю вам кое-что, над чем я работаю, как только оно будет закончено. - person mheavers; 25.07.2012