Opencv-哈尔级联-人脸跟踪非常慢

Opencv - Haar cascade - Face tracking is very slow

本文关键字:跟踪 非常 -人 哈尔 级联 Opencv-      更新时间:2023-10-16

我开发了一个使用OpenCV库通过相机跟踪人脸的项目。我使用haar级联和haarcascade_frontalface_alt.xml来检测人脸。

我的问题是,如果从webcome捕获的图像不包含任何人脸,那么检测人脸的过程会非常缓慢,所以相机连续显示给用户的图像会延迟。

我的源代码:

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 loadingn");
    if (!eyes_cascade.load(eye_cascade_name))
        printf("--(!)Error loadingn");
    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中是并行化的,因此您无法对算法本身进行太多优化。

关于你的代码,唯一需要注意的是:你真的用等于Size(200, 200)minSize检测到过一些人脸吗?当然,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分类器,它相对更快,但不太准确。

希望它能有所帮助。

可能对您有用:

有一个Simd库,它实现了HAAR和LBP级联分类器。它可以使用OpenCV中的标准HAAR和LBP cascade。该实现使用SSE4.1、AVX2和NEON(ARM)进行了SIMD优化,因此其工作速度是原始OpenCV实现的2-3倍。

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

这里有一些你可以尝试的东西。

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

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

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

  4. 使用探查器查看瓶颈是否为.

  5. 如果你还没有这样做,如果你对人脸检测和绘制矩形进行评论,你有没有测量过帧速率?

您可以使用LBP级联来检测人脸。它的重量要轻得多。您可以在OpenCV源目录中找到lbpcascade_frontalface.xml