【问题标题】:OpenCV not detecting faces from KinectOpenCV 未检测到来自 Kinect 的人脸
【发布时间】:2014-08-31 04:48:59
【问题描述】:

我正在尝试使用带有以下代码的 kinect 检测人脸。当我使用计算机的摄像头时,OpenCV 的 detectMultiScale() 可以正确检测人脸,但它似乎无法处理来自 kinect 的图像。

Device device;
VideoFrameRef colorFrame;
VideoStream ColorStream;
Mat colorImage, grayScaleFrame;

colorStream.create(device, SENSOR_COLOR );
colorStream.start();


while (1){
    colorStream.readFrame(&colorFrame);
    const RGB888Pixel *imageBuffer = (const RGB888Pixel*)colorFrame.getData();
    colorImage.create(colorFrame.getHeight(), colorFrame.getWidth(), CV_8UC3);
    memcpy(colorImage.data, imageBuffer, 3 * colorFrame.getHeight() * colorFrame.getWidth() * sizeof(uint8_t));

    //face detection
    blur(colorImage, colorImage, Size(2, 2), Point(-1, -1), BORDER_DEFAULT);
    cvtColor(colorImage, grayScaleFrame, CV_BGR2GRAY);
    equalizeHist(grayScaleFrame, grayScaleFrame);
    classifier.detectMultiScale(grayScaleFrame, faces, 1.1, 3, CV_HAAR_FIND_BIGGEST_OBJECT|CV_HAAR_SCALE_IMAGE,  Size(30, 30) );
}

任何想法为什么会发生这种情况?

谢谢!

【问题讨论】:

  • 您为 Kinect 使用的驱动程序是什么? Freenect 还是 OpenNI?检查来自 Kinect 的图像是 BGR 还是 RGB。
  • @blackibiza - 我正在使用 OpenNI。我尝试了 CV_BGR2GRAY 和 CV_RGB2GRAY 程序仍然没有检测到任何人脸
  • 您是否尝试过保存来自 kinect 的图像以检查一切是否如您所愿?在尝试在这张图片中运行 opencv 算法以检查该算法是否适用于这张图片之后......
  • @Stralo 认为从 Kinect 检索帧与普通相机的过程不同。使用 OpenNI(我希望您使用带有 avin2 补丁的 1.5.x)您必须首先调用 grab() 然后在 VideoCapture 上调用 retrieve()。
  • @blackibiza - 是我的错,伙计们。对不起。我的 haarcascade 文件位于包含我的源代码的文件夹中,而不是可执行文件所在的位置,我刚刚意识到,因为 classifier.load() 函数不会引发任何错误。我会删除帖子

标签: c++ opencv face-detection openni


【解决方案1】:

请务必按照以下步骤使用 Kinect/OpenNI (1.5.4.0+) 抓取帧:

cv::Mat rgb_image, depth_map;
cv::VideoCapture device.open(CV_CAP_OPENNI);
//set RGB-Depth mapping
device.set(CV_CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION, 1.0);

while(1)
{
  device.grab();
  device.retrieve(rgb_image, CV_CAP_OPENNI_BGR_IMAGE);
  device.retrieve(depth_map, CV_CAP_OPENNI_DEPTH_MAP);
}

【讨论】:

  • 我正在使用 Opencv 2.4 和 OpenNI2。我认为上面的代码不适用于 OpenNI2: main.cpp:341:14: error: 'class openni::Device' has no member named 'grab' main.cpp:342:14: error: 'class openni: :Device' 没有名为 'retrieve' 的成员。不过谢谢!
  • OpenNI2 不适用于 Kinect,除非您在 Windows 上,否则您有适用于 OpenNI2 的 Windows SDK + OpenKinect 交叉补丁。 social.msdn.microsoft.com/Forums/en-US/… 在 Linux 上,没有机会。
  • 我正在使用 OpenNI2 和 Kinect 的 linux 机器上工作,一切正常。
猜你喜欢
  • 2015-08-16
  • 1970-01-01
  • 2013-09-24
  • 2012-02-04
  • 2013-05-24
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多