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

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

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

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

我的源代码:

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;
    }
}

最佳答案

Haar 分类器本质上相对较慢。此外,您无法对算法本身进行太多优化,因为 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 分类器,它相对更快但准确度较低。

希望对您有所帮助。

关于c++ - Opencv - Haar 级联 - 面部跟踪非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26869820/

相关文章:

c++ - 有没有更有效的方法来原子地添加两个 float ?

c++ - 在 opencv : no error no output 中播放的视频

ios - UIImageOrientation 到 CIDetectorImageOrientation

c++ - 使用 opencv 时找不到 lopencv_core

c++ - 颜色直方图openCV中的访问维度

javascript - Microsoft 认知服务 - 人脸检测

c++ - 多视角人脸检测

c++ - 代码适用于 CLR 项目但不适用于 Win32

c++ - 将 googletest 与通过 std::cin 从用户获取输入的功能一起使用?

c++ - 字符数组问题C++