SimpleOpenNI中的kinect手势识别

时间:2014-06-07 15:50:24

标签: java kinect simple-openni

我想要实现一种鼓。我想播放一首歌。所以我需要检测每一个" hit"和位置。在我开始实现一个能够分析位置并检测"命中"我想确定没有其他解决方案,那么是否有任何事件,手势检测能让我检测到它?

2 个答案:

答案 0 :(得分:1)

据我所知,没有"事件"除了流回调之外的本地定义,当你接收到足以让你开始的联合位置和深度图像等数据时调用这些回调。

我会看一下这个:https://code.google.com/p/kineticspace/,以便知道会发生什么或如何继续使用自己的代码。

一旦你设法获取骨架数据,只需找到当时手的位置,在其位置设置一个阈值并开始跟踪一段时间,看看它的移动路径是否适合特定手势的模式,如"在y方向上平移x秒秒"。然后你就会非常简单地打击"手势检测。这可以根据您的需要变得复杂,但从图书馆方面收到的内容来看,基础知识并不多。

祝你好运。

答案 1 :(得分:0)

我使用Kinect制作了一个鼓组,这是一个在Kinect中放置和使用盒子的绝佳课程。 导入库:

import processing.opengl.*;
import SimpleOpenNI.*;

在Setup()

中使用类似代码的内容
myTrigger = new Hotpoint(200, 10, 800, size); 

使用draw()

中的方法
if(myTrigger.currentlyHit()) { 
          myTrigger.play();
          println("trigger hit");
      }

在此课程中使用以下方法!

class Hotpoint {

  PVector center;
  color fillColor;
  color strokeColor;
  int size;
  int pointsIncluded;
  int maxPoints;
  boolean wasJustHit;
  int threshold;

  Hotpoint(float centerX, float centerY, float centerZ, int boxSize) { 
    center = new PVector(centerX, centerY, centerZ);
    size = boxSize;
    pointsIncluded = 0;
    maxPoints = 1000;
    threshold = 0;
    fillColor = strokeColor = color(random(255), random(255), random(255));
  }

  void setThreshold( int newThreshold ){
    threshold = newThreshold;
  }

  void setMaxPoints(int newMaxPoints) {
    maxPoints = newMaxPoints;
  }

  void setColor(float red, float blue, float green){
    fillColor = strokeColor = color(red, blue, green);
  }

  boolean check(PVector point) { 
    boolean result = false;
    if (point.x > center.x - size/2 && point.x < center.x + size/2) {
      if (point.y > center.y - size/2 && point.y < center.y + size/2) {
        if (point.z > center.z - size/2 && point.z < center.z + size/2) {
          result = true;
          pointsIncluded++;
        }
      }
    }

    return result;
  }

  void draw() { 
    pushMatrix(); 
      translate(center.x, center.y, center.z);

        fill(red(fillColor), blue(fillColor), green(fillColor), 
          255 * percentIncluded());
        stroke(red(strokeColor), blue(strokeColor), green(strokeColor), 255);
        box(size);
    popMatrix();
  }

  float percentIncluded() {
    return map(pointsIncluded, 0, maxPoints, 0, 1);
  }

  boolean currentlyHit() { 
    return (pointsIncluded > threshold);
  }

  boolean isHit() { 
    return currentlyHit() && !wasJustHit;
  }

  void clear() { 
    wasJustHit = currentlyHit();
    pointsIncluded = 0;
  }
}