8

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

该示例有效,但人脸检测算法对我来说似乎很慢。人脸的检测时间约为400 毫秒(我只是使用了包含的示例)。然后FPS相当低。

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

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

注意:我的 Macbook 并不旧(2009 年),一切运行良好。我使用 iSight 网络摄像头(集成网络摄像头)。网络摄像头上只有一张脸(我的脸)。如果没有脸,大约是同一时间。

4

6 回答 6

9

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

于 2011-02-02T19:37:12.813 回答
4

添加到以前的答案:

您还可以通过设置 Max 和最重要的 Min 大小来加快速度detectMultiScale

[此外,正如之前的答案所说,由于 Haar 检测器使用非常简单的特征(对于最多 6 个像素的关系;在更大的比例上,您可以将类似矩形的区域相加,就好像它只是一个像素一样) . 在标准 mac/mbp2011 上,我可以获得大约 60fps 的速度,这已经足够了。]

为了更好的加速,您还可以使用模板匹配来消除不变的区域。

于 2012-11-01T22:48:57.343 回答
4

最近我发现了一个Simd Library,它实现了 HAAR 和 LBP 级联分类器。它可以使用来自 OpenCV 的标准 HAAR 和 LBP 级联。此实现使用 SSE4.1、AVX2 和 NEON(ARM) 进行了 SIMD 优化,因此它的工作速度比原始 OpenCV 实现快 2-3 倍。

于 2016-10-20T12:25:42.680 回答
1

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

./facedetect --scale=4

我得到<20ms的检测率

希望有帮助,

库克帕

于 2011-03-18T09:52:09.673 回答
1

在图像上运行时,您应该缩小到某些限制。如果是视频,除了人脸检测,您还可以尝试跟踪。您可以每隔一帧进行人脸检测,并在帧之间跟踪人脸的位置。

此外,OpenCv 支持使用 Canny 来丢弃无法找到 Face 的区域。

于 2016-05-25T22:19:54.137 回答
0

我将视频序列中的帧大小调整为 10 倍,效果很好。也为了更快的处理在每个帧中使用人脸检测器x,然后在帧之间使用人脸跟踪器(以避免漂移)。x-1

结帐此链接:跟踪与检测


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

这是 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 快得多。我不确定这一点以及性能和质量,但我认为也可以提及这一点。

于 2021-03-19T07:52:47.383 回答