在处理中使用opencv,open kinect和kinect v2进行人脸检测

时间:2016-09-12 13:41:32

标签: opencv processing face-detection openkinect kinect-v2

我正在尝试使用opencv和openkinect库构建一个面部检测。对于图像输入我想使用xbox kinect v2。我将我的代码基于opencv库中的面部检测示例。我正在使用Mac。

到目前为止,这是我的代码:

import gab.opencv.*;
import java.awt.Rectangle;

/* KINECT */
import org.openkinect.freenect.*;
import org.openkinect.freenect2.*;
import org.openkinect.processing.*;

OpenCV opencv;
Kinect2 kinect2;

Rectangle[] faces;

void setup() {
  opencv = new OpenCV(this, 640/2, 480/2);
  size(640, 480);
  // Kinectv2
  kinect2 = new Kinect2(this);
  kinect2.initVideo();
  kinect2.initDevice();

  opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);  
  faces = opencv.detect();
}

void draw() {
  opencv.loadImage(kinect2.getVideoImage());
  image(kinect2.getVideoImage(), 0, 0, 640, 480);

  noFill();
  stroke(0, 255, 0);
  strokeWeight(3);
  for (int i = 0; i < faces.length; i++) {
    rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
  }
}

问题似乎在“opencv.loadImage(kinect2.getVideoImage());”中。因为检测不起作用。 当使用isight相机(使用内置功能“capture”和“video”-add-on)而不是kinect时,一切都运行得很好。

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

将来,请尝试提供MCVE。这意味着从空白草图开始,只添加足够的代码,以便我们可以看到问题。在您的情况下,我们不需要查看任何kinect代码。只需加载硬编码图像并将其传递给OpenCV。

这是一个示例草图。我从human Wikipedia page获得了图片网址。

import gab.opencv.*;
import java.awt.Rectangle;

PImage image;
OpenCV opencv;

void setup() {
  size(500, 500);
  image = loadImage("https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/A_young_Man_and_Lady.png/800px-A_young_Man_and_Lady.png");
  image.resize(width, height);

  opencv = new OpenCV(this, width, height);
  opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
}

void draw() { 

  image(image, 0, 0);

  opencv.loadImage(image);
  Rectangle[] faces = opencv.detect();

  noFill();
  stroke(255, 0, 0);
  strokeWeight(3);
  for (Rectangle face : faces) {
    rect(face.x, face.y, face.width, face.height);
  }
}

OpenCV face detection

请注意,我每帧调用opencv.detect()函数 。您只能从setup()调用它,这意味着您只在第一帧中检测到面孔。

如果仍然无法使其正常工作,那么您将不得不进行一些调试。尝试尽可能地隔离您的问题。摆脱kinect代码,只使用硬编码图像。拍摄通过kinect获取的图像的屏幕截图,并使用它而不是直播。以较小的步骤工作,这样你就可以在遇到问题时发布一个更具体的问题(一般情况下很难提供帮助&#34;这不是工作问题&#34;问题 - 它&#39; s更容易帮助特定&#34;我试过X,期望Y,但得到Z而不是#34;键入问题)。祝你好运。