我在 Mac Os X 上编译并安装了 OpenCV (SVN的最新版本)(这可能是问题的根源)。
示例有效,但面部检测算法对我来说似乎很慢。面部的检测时间约为 400ms (我刚才使用了包含的示例)。然后FPS非常低。
在youtube上,我看到超级流畅的视频带有实时人脸检测(即使在iPhone上),所以我感到困惑。我记得在我的旧Windows PC上速度更快。
400 ms是否是正确的检测时间?
注意:我的Macbook不老(2009),一切运行正常。我使用iSight网络摄像头(集成网络摄像头)。我在网络摄像头上只有一张脸(我的脸)。如果没有脸,那就差不多了。
答案 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 快得多。我不确定这一点以及性能和质量,但我认为提及这一点也很好。