Obtenir un NullPointerException à des intervalles apparemment aléatoires, ne sais pas pourquoi

StackOverflow https://stackoverflow.com/questions/4582096

  •  14-10-2019
  •  | 
  •  

Question

Je me présente un exemple d'une bibliothèque Kinect pour le traitement (http://www.shiffman.net/2010/11/14/kinect-and-processing/) et parfois obtenir un NullPointerException pointant vers cette ligne:

  int rawDepth = depth[offset];

Le réseau de profondeur est créé dans cette ligne:

  int[] depth = kinect.getRawDepth();

Je ne suis pas sûr de ce que NullPointerException est, et bien googler n'a pas vraiment aidé. Il me semble étrange que le code compile 70% du temps et renvoie l'erreur de façon imprévisible. Pourrait le matériel lui-même l'affecter?

Voici l'exemple entier si elle aide:

// Daniel Shiffman
// Kinect Point Cloud example
// http://www.shiffman.net
// https://github.com/shiffman/libfreenect/tree/master/wrappers/java/processing

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

// Kinect Library object
Kinect kinect;

float a = 0;

// Size of kinect image
int w = 640;
int h = 480;


// 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() {
  size(800,600,P3D);
  kinect = new Kinect(this);
  kinect.start();
  kinect.enableDepth(true);
  // We don't need the grayscale image in this example
  // so this makes it more efficient
  kinect.processDepthImage(false);

  // 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);
  fill(255);
  textMode(SCREEN);
  text("Kinect FR: " + (int)kinect.getDepthFPS() + "\nProcessing FR: " + (int)frameRate,10,16);

  // 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<w; x+=skip) {
    for(int y=0; y<h; y+=skip) {
      int offset = x+y*w;
      // 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;
}

void stop() {
  kinect.quit();
  super.stop();
}

Et voici les erreurs:

processing.app.debug.RunnerException: NullPointerException
    at processing.app.Sketch.placeException(Sketch.java:1543)
    at processing.app.debug.Runner.findException(Runner.java:583)
    at processing.app.debug.Runner.reportException(Runner.java:558)
    at processing.app.debug.Runner.exception(Runner.java:498)
    at processing.app.debug.EventThread.exceptionEvent(EventThread.java:367)
    at processing.app.debug.EventThread.handleEvent(EventThread.java:255)
    at processing.app.debug.EventThread.run(EventThread.java:89)
Exception in thread "Animation Thread" java.lang.NullPointerException
    at org.openkinect.processing.Kinect.enableDepth(Kinect.java:70)
    at PointCloud.setup(PointCloud.java:48)
    at processing.core.PApplet.handleDraw(PApplet.java:1583)
    at processing.core.PApplet.run(PApplet.java:1503)
    at java.lang.Thread.run(Thread.java:637)
Était-ce utile?

La solution

Vous obtenez un NullPointerException puisque la valeur du tableau de profondeur est nulle. Vous pouvez voir à partir du code source de la classe Kinect, il y a une chance d'une valeur nulle étant renvoyée par la méthode getRawDepth (). Il est probable qu'il n'y a pas d'image affichée à l'époque.

Le code peut être trouvé à l'adresse:

https://github.com/shiffman/libfreenect/blob/master/wrappers/java/processing/KinectProcessing/src/org/openkinect/processing/Kinect.java

Votre code doit vérifier si le tableau de profondeur est nul avant d'essayer de traiter. Par exemple ...

int[] depth = kinect.getRawDepth();

if (depth == null) {
  // do something here where you handle there being no image
} else {
  // 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<w; x+=skip) {
    for(int y=0; y<h; y+=skip) {
      int offset = x+y*w;
      // 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;
}

Autres conseils

Je suggère d'utiliser un débogueur Java afin que vous puissiez voir l'état des variables au moment où l'exception est levée. Certaines personnes aiment aussi les déclarations utilisation du journal à la sortie les valeurs des variables à différents points dans l'application.

Vous pouvez ensuite tracer le dos de problème à un point où l'une des valeurs est pas remplie avec une valeur non nulle.

Le pointeur null qui se passe quand offset> kinect.getRawDepth ();

Vous avez beaucoup de code ici, je ne vais pas regarder tout cela. Pourquoi peut-on supposer que décalage est

Modifier :

Le deuxième si, @ commentaire de Asaph est probablement raison.

exception de pointeur nul se produit lorsque depth[offset] n'existe pas ou n'a pas été affecté. Vérifiez quand depth[offset] est indéfini et qui est la cause de l'exception NullPointer.

Vérifier si kinect.getRawDepth(); est supérieure à offset.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top