在OpenCV上进行慢速面部检测?

时间:2010-09-21 19:41:23

标签: c++ macos opencv face-detection

我在 Mac Os X 上编译并安装了 OpenCV (SVN的最新版本)(这可能是问题的根源)。

示例有效,但面部检测算法对我来说似乎很慢。面部的检测时间约为 400ms (我刚才使用了包含的示例)。然后FPS非常低。

在youtube上,我看到超级流畅的视频带有实时人脸检测(即使在iPhone上),所以我感到困惑。我记得在我的旧Windows PC上速度更快。

400 ms是否是正确的检测时间?

注意:我的Macbook不老(2009),一切运行正常。我使用iSight网络摄像头(集成网络摄像头)。我在网络摄像头上只有一张脸(我的脸)。如果没有脸,那就差不多了。

7 个答案:

答案 0 :(得分:5)

输入图像的大小是多少。我猜640x480。发布YouTube视频的人通常会将图片大小调整为160x120。在640x480的全分辨率下,获得超过2-3 fps是非常困难的。尝试发送160x120图像。你应该至少获得10fps。

答案 1 :(得分:3)

添加到之前的答案:

您还可以通过设置最大值来加快速度,最重要的是设置detectMultiScale的最小尺寸。

[另外,正如之前的答案所说,由于哈尔探测器使用非常简单的特征(对于最多6个像素的关系;在较大的尺度上,你加起来像矩形一样的区域,就像它只是一个像素)。在标准的mac / mbp2011上,我可以获得大约60fps的绰绰有余。]

为了获得更好的加速,您还可以使用say templateMatching消除不变区域。

答案 2 :(得分:3)

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

答案 3 :(得分:0)

我遇到了同样的问题,在4GB RAM的四核机器上每次检测时间为500毫秒,但是我注意到有一个Scale选项......将其发送到:

./ facedetect --scale = 4

我的检测率<20ms

希望有所帮助,

Keukpa

答案 4 :(得分:0)

在图像上运行时,您应该缩小到某个限制。如果是视频,还有脸部检测,您还可以尝试跟踪。您可以在每个交替帧中进行面部检测,并在帧之间跟踪面部位置。

此外,OpenCv支持使用Canny来丢弃找到Face的机会为none的区域。

答案 5 :(得分:0)

有人知道为什么OpenCV 3.4.5中的人脸检测这么慢吗?我认为它在3.4.3版本中要快得多,我没有进行任何基准测试,但似乎要快得多。

答案 6 :(得分:0)

我将视频序列中的帧调整为 10 倍,效果很好。也是为了更快的过程在每个 x 帧中使用 Face Detector,然后在 x-1 帧之间使用 Face Tracker 代替(为了避免漂移).

查看此链接:Tracking vs Detecting


也许一个示例代码可以帮助某人(它是一个简单的检测不是跟踪识别):

这是 ANDROID 示例,但它在用于其他平台和语言的 opencv 中非常相似"

mRgba = inputFrame.rgba();
mGray = inputFrame.gray();

int resizeFactor=10;//or any other number based on your input resolution
Imgproc.resize(mGray,mGray,newSize(mGray.width()/resizeFactor,mGray.height()/resizeFactor));
mRgba = proc(mRgba, mGray,resizeFactor);

和“proc”功能类似 - 我从OpenCV4Android 人脸检测示例中找到并升级了它:

public Mat proc(Mat mRgba, Mat mGray, int resizeFactor) {
MatOfRect faces = new MatOfRect();
        if (mJavaDetector != null)
            mJavaDetector.detectMultiScale(mGray, faces, 1.1, 2, 2, new Size(0,0), new Size());//change this according to your usage-> Size(0, 0)

        Rect[] facesArray = faces.toArray();
        for (Rect rect : facesArray) {
            Point t1 = rect.tl();
            t1.x *= resizeFactor;
            t1.y *= resizeFactor;
            Point br = rect.br();
            br.x *= resizeFactor;
            br.y *= resizeFactor;
            Imgproc.rectangle(mRgba, t1, br, FACE_RECT_COLOR, 3);
        }

        return mRgba;
    }

我使用的 CPU:Snapdragon 720G


也是从一个相关论坛,我发现 LBP 比 HAAR 快得多。我不确定这一点以及性能和质量,但我认为提及这一点也很好。