使用Haar模型进行OpenCV人脸检测卡住

时间:2016-10-04 08:54:28

标签: c++ opencv opencv3.0

我正在尝试使用opencv的CascadeClassifier进行人脸检测。 以下是我正在运行的opencv docs教程的简化代码。

我遇到的问题是对CascadeClassifier::detectMultiScale()的调用不会返回(至少在第一帧20分钟后没有)。什么可能导致这种行为以及如何解决它?

当我使用预先训练的LBP模型运行相同的代码时,分类器运行速度很快,没有任何问题。然而,当我取消注释equalizeHist()调用时,正如教程中使用的那样,LBP模型卡住了,类似于Haar模型。

在对类似问题的回答中,我已经读过,当没有面部存在时,分类器可能会花费很长时间。 由于背景较暗,使用均衡的直方图,凸轮上的脸变得有些过度曝光。也许这可能是问题的一部分?

#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>

using namespace cv;

int main(int argc, const char* argv[])
{
    CascadeClassifier face_cascade;
    if(!face_cascade.load("haarcascade_frontalface_alt.xml"))
        return -1;

    VideoCapture capture(0);
    if (!capture.isOpened())
        return -1;

    UMat frame, frame_gray;

    for (;;) {
        capture >> frame;
        if (!frame.empty()) {
            cvtColor(frame, frame_gray, CV_BGR2GRAY);
            //equalizeHist(frame_gray, frame_gray);    // uncomment and LBP gets stuck too

            std::vector<Rect> faces;
            face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30));

            for(size_t i = 0; i < faces.size(); ++i) {
                Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5);
                ellipse(frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0);
            }
        }

        imshow("Face detection", frame);

        if(waitKey(10) > 0)
            break;
    }

    return 0;
}

0 个答案:

没有答案