1

每当我从 OpenKinect Kinect v1 示例 PointCloud 运行示例代码时,我都会收到此错误。

 Unsatisfied link error: Unable to load library 'freenect': Native library (linux-arm/libfreenect.so) not found in resource path. 
A library relies on native code that's not available.

OpenKinect 库是专门为 ARM Linux 架构制作的,可以在此处找到。基本问题是我认为它没有正确找到 libfreenect.so 库,即使库有它。我猜它不在路上。

请参阅下面正在运行的示例代码(库 freenect.* 的导入是我认为导致问题的原因):

// Daniel Shiffman
// Kinect Point Cloud example

// https://github.com/shiffman/OpenKinect-for-Processing
// http://shiffman.net/p5/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(800, 600, 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;
}

编辑 这是我得到的图片:

我总是收到这个缺少本机代码的错误

4

2 回答 2

1

所以这是一个比我想象的更简单的修复(不是总是这样吗?)所以我不得不去我的/home/pi/sketchbook/libraries/并删除任何现有的 openKinect 库。然后下载专门为 Raspberry Pi armv6hf 板制作的 openKinect 库 zip 文件并解压到/home/pi/sketchbook/libraries/. 然后重新启动处理并打开示例,然后它找到了库。感谢 George Profenza 的投入。

于 2016-09-23T18:29:23.917 回答
0

我不知道Processing。但以下应该有助于解决问题。

要获取当前java.library.path设置,您可以使用

System.out.println(System.getProperty("java.library.path"));

在命令行上指定它

java -Djava.library.path=/your/additional/directory

库必须在目录中

/your/additional/directory/linux-arm/libfreenect.so

如何在Processing我无法回答中指定此属性。但是您现在应该可以搜索它了。

编辑:如果您的输出是,/usr/java/packages/lib/arm:/lib:/usr/lib那么您可以将库存储为例如

/usr/lib/linux-arm/libfreenect.so
于 2016-09-20T13:18:27.840 回答