C++ OpenCV上的慢速人脸检测?

C++ OpenCV上的慢速人脸检测?,c++,macos,opencv,face-detection,C++,Macos,Opencv,Face Detection,我在MacOSX上编译并安装了OpenCV(SVN的最新版本)(这可能是问题的根源) 这个示例是可行的,但是人脸检测算法对我来说似乎很慢。人脸的检测时间约为400ms(我刚刚使用了包含的示例)。此时FPS相当低 在youtube和所有网站上,我看到了带有实时人脸检测的超级平滑视频(甚至在iPhone上),所以我感到困惑。我记得它在我的旧Windows PC上运行得更快 400毫秒是正确的检测时间吗? 注意:我的Macbook并不老(2009年),而且在上面运行的一切都很好。我使用iSight网络

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

这个示例是可行的,但是人脸检测算法对我来说似乎很慢。人脸的检测时间约为400ms(我刚刚使用了包含的示例)。此时FPS相当低

在youtube和所有网站上,我看到了带有实时人脸检测的超级平滑视频(甚至在iPhone上),所以我感到困惑。我记得它在我的旧Windows PC上运行得更快

400毫秒是正确的检测时间吗?


注意:我的Macbook并不老(2009年),而且在上面运行的一切都很好。我使用iSight网络摄像头(集成网络摄像头)。网络摄像头上只有一张脸(我的脸)。如果没有人脸,这几乎是同时发生的。

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

我也遇到了同样的问题,在一台具有4GB RAM的四核机器上,每次检测的速度为500ms,但我注意到有一个缩放选项……将此设置为:

/facedetect——比例=4


在前面的回答中,我得到了的检出率:

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

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


为了获得更好的加速效果,您还可以使用模板匹配消除非更改区域。

在图像上运行时,您应该缩小到一定的范围。对于视频,除了人脸检测,您还可以尝试跟踪。您可以每隔一帧进行人脸检测,并跟踪帧间人脸的位置


此外,OpenCv支持使用Canny来丢弃没有找到人脸机会的区域

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

我用因子10调整了视频序列中的帧大小,效果非常好。此外,为了加快处理速度,请在每个
x
帧中使用人脸检测器,然后在
x-1
帧之间使用人脸跟踪器(以避免漂移)

签出此链接:


还有可能一个示例代码可以帮助某人(这是一个简单的检测,而不是跟踪或识别):

这是ANDROID示例,但在其他平台和语言的opencv中非常相似。”

和“proc”函数类似的东西-我从OpenCV4Android人脸检测示例中找到并升级了它:

我使用的CPU:Snapdragon 720G



同样在一个相关论坛上,我发现LBP比HAAR快得多。我不确定这一点以及性能和质量,但我认为最好也提到这一点。

您是否启用了OpenMP进行编译?没有它就糟透了。我使用默认配置进行编译(所以我不知道)。默认情况下是否启用?取决于您的编译器,但通常不是。您的编译器是什么?查找如何使用OpenMP启用OpenMP,重新编译,然后尝试。我在OpenCV 2.1更新中读到:“OpenCV已完全从OpenMP切换到TBB”,因此我想,鉴于我使用的是上一个SVN版本,我不必担心这一点。(链接:)啊,对不起。我已经有一段时间没有使用OpenCV了。所以,我想下一步应该是看看文档,看看是否有任何预处理器定义需要你来告诉OpenCV你已经/它应该使用TBB。我稍后会忍不住去看。另外,把@GMan放在上面,这样我会得到你的回复。谢谢,这是一个好建议。这是一个pr项目暂时暂停,但答案为+1。我目前正在全高清实时网络摄像头流上运行人脸检测。将视频缩小到480x270,并以交互速率(20-40ms)运行人脸检测在我的Corei7上,使用OpenCV 1.0.Puting Scale=4是错误的!!scalefactor表示要更改searchWindowSize的步长…意味着,假设您最初使用大小为1*100的窗口进行搜索,下次将使用windowSize=1*400进行搜索…因此,我们执行的迭代次数较少,但也可能会漏掉位于两个窗口之间的面默认步长接近1.1,这意味着将窗口大小更改10%。
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);
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;
    }