【问题标题】:PApplet error on IntelliJIntelliJ 上的 PApplet 错误
【发布时间】:2016-04-18 10:21:43
【问题描述】:

我正在尝试使用 IntelliJ 上的 Processing 和 OpenKinect 库来连接我的 Kinect 以将其用于手部检测,此代码适用于 Processing 3,但由于某种原因,当我以正确的格式将其放在 IntelliJ 上时,我得到了这个错误:

用法:PApplet [options] [sketch args] 请参阅 Javadoc 供 PApplet 解释。

这是我正在使用的两个类。

Main.java

package lol.uk;

import processing.core.*;
//import org.openkinect.freenect.*;
import org.openkinect.processing.*;
import processing.core.PImage;
import processing.core.PVector;
//import processing.core.PImage;

public class Main extends PApplet {

    KinectTracker tracker;
    Kinect kinect;


    public void setup() {
        size(640, 520);
        kinect = new Kinect(this);
        tracker = new KinectTracker();
    }

    public void draw() {
        background(255);

        // Run the tracking analysis
        tracker.track();
        // Show the image
        tracker.display();

        // Let's draw the raw location
        PVector v1 = tracker.getPos();
        fill(50, 100, 250, 200);
        noStroke();
        ellipse(v1.x, v1.y, 20, 20);

        // Let's draw the "lerped" location
        PVector v2 = tracker.getLerpedPos();
        fill(100, 250, 50, 200);
        noStroke();
        ellipse(v2.x, v2.y, 20, 20);

        // Display some info
        int t = tracker.getThreshold();
        fill(0);
        text("threshold: " + t + "    " + "framerate: " + (frameRate) + "    " + "UP increase threshold, DOWN decrease threshold", 10, 500);
    }

    public void keyPressed() {
        int t = tracker.getThreshold();
        if (key == CODED) {
            if (keyCode == UP) {
                t += 5;
                tracker.setThreshold(t);
            } else if (keyCode == DOWN) {
                t -= 5;
                tracker.setThreshold(t);
            }
        }
    }
}

KinectTracker.java

package lol.uk;

import org.openkinect.processing.Kinect;
import processing.core.*;
import processing.core.PImage;
import processing.core.PVector;

public class KinectTracker extends PApplet {
    // Depth threshold
    int threshold = 500;

    Kinect kinect;

    // Raw location
    PVector loc;

    // Interpolated location
    PVector lerpedLoc;

    // Depth data
    int[] depth;

    // What we'll show the user
    PImage display;

    KinectTracker() {
        // This is an awkard use of a global variable here
        // But doing it this way for simplicity
        kinect.initDepth();
        kinect.enableMirror(true);
        // Make a blank image
        display = createImage(kinect.width, kinect.height, RGB);
        // Set up the vectors
        loc = new PVector(0, 0);
        lerpedLoc = new PVector(0, 0);
    }

    public void track() {
        // Get the raw depth as array of integers
        depth = kinect.getRawDepth();

        // Being overly cautious here
        if (depth == null) return;

        float sumX = 0;
        float sumY = 0;
        float count = 0;

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

                int offset =  x + y*kinect.width;
                // Grabbing the raw depth
                int rawDepth = depth[offset];

                // Testing against threshold
                if (rawDepth < threshold) {
                    sumX += x;
                    sumY += y;
                    count++;
                }
            }
        }
        // As long as we found something
        if (count != 0) {
            loc = new PVector(sumX/count, sumY/count);
        }

        // Interpolating the location, doing it arbitrarily for now
        lerpedLoc.x = PApplet.lerp(lerpedLoc.x, loc.x, 0.3f);
        lerpedLoc.y = PApplet.lerp(lerpedLoc.y, loc.y, 0.3f);
    }

    PVector getLerpedPos() {
        return lerpedLoc;
    }

    PVector getPos() {
        return loc;
    }

    public void display() {
        PImage img = kinect.getDepthImage();

        // Being overly cautious here
        if (depth == null || img == null) return;

        // Going to rewrite the depth image to show which pixels are in threshold
        // A lot of this is redundant, but this is just for demonstration purposes
        display.loadPixels();
        for (int x = 0; x < kinect.width; x++) {
            for (int y = 0; y < kinect.height; y++) {

                int offset = x + y * kinect.width;
                // Raw depth
                int rawDepth = depth[offset];
                int pix = x + y * display.width;
                if (rawDepth < threshold) {
                    // A red color instead
                    display.pixels[pix] = color(150, 50, 50);
                } else {
                    display.pixels[pix] = img.pixels[offset];
                }
            }
        }
        display.updatePixels();

        // Draw the image
        image(display, 0, 0);
    }

    int getThreshold() {
        return threshold;
    }

    public void setThreshold(int t) {
        threshold =  t;
    }
}

【问题讨论】:

    标签: java intellij-idea processing kinect openkinect


    【解决方案1】:

    PApplet 需要几个参数才能启动。你提供了这些吗?

    请参阅此页面以获取示例:https://processing.org/tutorials/eclipse/

    【讨论】:

    • 我已经尝试添加参数,但它似乎没有做任何事情,你可以尝试添加参数吗?谢谢
    • @chessefries 不,我当然不能这样做,因为参数是特定于执行程序的。你是如何添加参数的?
    【解决方案2】:

    为什么有两个扩展 PApplet 的类?

    99.99% 的情况下,您应该只有 一个 扩展 PApplet 的类。然后,您可以将该类的实例传递给其他类,以便调用处理函数。

    除非您有充分的理由将PApplet 扩展两次,否则您应该只扩展一次。

    为什么没有main() 方法?

    如果您不是从处理编辑器中运行它,那么您需要编写自己的main() 方法来启动您的代码。在您的main() 方法中,您需要调用PApplet.main("YourSketchClassNameHere") 函数来告诉Processing 启动您的草图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 2013-08-01
      • 2020-03-12
      相关资源
      最近更新 更多