Opencv - Haar级联 - 面部跟踪非常慢

时间:2014-11-11 16:36:50

标签: c++ opencv face-detection face-recognition

我开发了一个使用OpenCV库通过摄像头跟踪人脸的项目。 我使用haar级联与haarcascade_frontalface_alt.xml来检测脸部。

我的问题是,如果从网络摄像头捕获的图像不包含任何面部,则检测面部的过程非常慢,因此相机的图像会连续显示给用户,会延迟。

我的源代码:

void camera() 
{
    String face_cascade_name = "haarcascade_frontalface_alt.xml";
    String eye_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
    CascadeClassifier face_cascade;
    CascadeClassifier eyes_cascade;
    String window_name = "Capture - Face detection";
    VideoCapture cap(0);

    if (!face_cascade.load(face_cascade_name))
        printf("--(!)Error loading\n");

    if (!eyes_cascade.load(eye_cascade_name))
        printf("--(!)Error loading\n");

    if (!cap.isOpened()) 
    {
        cerr << "Capture Device ID " << 0 << "cannot be opened." << endl;
    } 
    else 
    {
        Mat frame;
        vector<Rect> faces;
        vector<Rect> eyes;
        Mat original;
        Mat frame_gray;
        Mat face;
        Mat processedFace;

        for (;;) 
        {
            cap.read(frame);
            original = frame.clone();    
            cvtColor(original, frame_gray, CV_BGR2GRAY);
            equalizeHist(frame_gray, frame_gray);
            face_cascade.detectMultiScale(frame_gray, faces, 2, 0,
                    0 | CASCADE_SCALE_IMAGE, Size(200, 200));

            if (faces.size() > 0)
                rectangle(original, faces[0], Scalar(0, 0, 255), 2, 8, 0);

            namedWindow(window_name, CV_WINDOW_AUTOSIZE);
            imshow(window_name, original);
        }

        if (waitKey(30) == 27)
            break;
    }
}

4 个答案:

答案 0 :(得分:3)

哈尔分类器本质上相对较慢。此外,您无法对算法本身进行太多优化,因为detectMultiScale在OpenCV中是并行化的。

关于您的代码的唯一注意事项:您是否真的通过minSize检测到一些等于Size(200, 200)的面孔?虽然肯定,minSize越大 - 表现越好。

在检测到任何内容之前尝试缩放图像:

const int scale = 3;
cv::Mat resized_frame_gray( cvRound( frame_gray.rows / scale ), cvRound( frame_gray.cols / scale ), CV_8UC1 );
cv::resize( frame_gray, resized_frame_gray, resized_frame_gray.size() );
face_cascade.detectMultiScale(resized_frame_gray, faces, 1.1, 3, 0 | CASCADE_SCALE_IMAGE, Size(20, 20));

(不要忘记将minSize更改为更合理的值并将检测到的面部位置转换为实际比例)

对于任何图像处理算法,图像尺寸减少2,3,5次都是一个很好的性能缓解,特别是在涉及检测等一些昂贵的东西时。

如前所述,如果调整大小不会成功,请尝试使用分析器获取其他一些瓶颈。

你也可以切换到LBP分类器,虽然不太准确但速度相对较快。

希望它会有所帮助。

答案 1 :(得分:1)

可能会对你有用:

Simd Library,其中有implementation个HAAR和LBP级联分类器。它可以使用OpenCV的标准HAAR和LBP casscades。该实现具有使用SSE4.1,AVX2和NEON(ARM)的SIMD优化,因此其工作速度比原始OpenCV快2-3倍。

答案 2 :(得分:0)

我定期使用Haar级联分类器,在具有4GB Ram和2GHz CPU的Intel PC / Mac(Windows / Ubuntu / OS X)上,在640x480图像上轻松获得15帧/秒的人脸检测。你的配置是什么?

以下是您可以尝试的一些事项。

  1. 您不必在每个框架内创建窗口(namedWindow(window_name, CV_WINDOW_AUTOSIZE);)。只需先创建它并更新图像。

  2. 您可以尝试在没有直方图均衡的情况下运行的速度。使用网络摄像头并不总是需要。

  3. 正如Micka上面所建议的,您应该检查您的程序是在调试模式还是在发布模式下运行。

  4. 使用分析器查看是否存在瓶颈。

  5. 如果你还没有完成它,你是否测量了如果你注释掉面部检测和绘制矩形你得到的帧速率?

答案 3 :(得分:0)

您可以使用LBP级联来检测面部。它更轻巧。您可以在OpenCV源目录中找到lbpcascade_frontalface.xml