【问题标题】:Face detection with opencv, open kinect and kinect v2 in Processing在处理中使用 opencv、open kinect 和 kinect v2 进行人脸检测
【发布时间】:2016-09-12 13:41:32
【问题描述】:

我正在尝试使用 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 相机(使用内置功能“捕获”和“视频”-add-on)而不是 kinect 时,一切正常。

谁能帮忙?

【问题讨论】:

  • 您必须更加具体。当你说问题似乎出在这条线上时,你到底是什么意思?当你说它不起作用时,你到底是什么意思?你期望会发生什么?相反会发生什么?不同的行为从哪一行代码开始?
  • opencv.loadImage(kinect2.getVideoImage()); //这里我希望opencv处理不工作的kinect记录的视觉数据。当我说“问题必须在那一行”时,它可能与opencv无法处理从函数“kinect2.getVideoImage()”获得的数据有关,并且可能需要不同形式的输入.图像(kinect2.getVideoImage(), 0, 0, 640, 480); // 这里我希望输出由正在工作的 xbox kinect 记录的视觉数据。

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


【解决方案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.detect() 函数。您只是从setup() 调用它,这意味着您只在第一帧中检测人脸。

如果您仍然无法使其正常工作,那么您将不得不进行一些调试。尽量隔离你的问题。摆脱 kinect 代码,只使用硬编码的图像。对通过您的 kinect 获得的图像进行屏幕截图,并使用它而不是实时流。以较小的步骤工作,这样您就可以在遇到困难时发布更具体的问题(很难帮助解决一般的“这不起作用”问题 - 帮助解决具体的“我尝试过 X,预期 Y,但是得到 Z 而不是”类型的问题)。祝你好运。

【讨论】:

  • 感谢您的回复和建议。由于我无法及时找到解决此问题的方法,我转而使用处理库“Kinect 2 for Windows”在 Windows 下进行开发,该处理库与官方 Xbox Kinect SDK 一起使用,该 SDK 也包含人脸识别功能,因此我拒绝 openCV 进行人脸识别。
  • 实际上,使用硬编码的单个图像进行尝试是我在此处询问之前的第一种方法,当然它确实有效。我的问题是,Kinect 连续接收的数据无法由 openCV 处理,至少不是以我预期的方式在代码中实现的方式。但是到目前为止我还没有尝试过在 setup() 函数之外调用 opencv.detect() 。我一有时间就试试。不过,我感谢您的反馈!
猜你喜欢
  • 2012-01-27
  • 2014-08-31
  • 2015-08-16
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多