使用 OpenCV 人脸检测时提高 FPS

Increasing FPS while using OpenCV Face detection

我知道实时人脸检测需要很多 cpu 时间,在游戏中实现它的时间太多(这是我的目标)。因此,我正在寻找提高 FPS 的方法。

在游戏中,应该只有两张脸。这些面孔几乎总是在相同的位置。一张在屏幕左下中,一张在屏幕右下中。

我可以假设总是恰好有 2 张面孔,正如我之前所说,它们与之前的帧大致位于相同的位置。

我的想法是告诉算法他必须在哪里搜索。

第一帧: 计算屏幕上人脸的位置。为下一帧存储面部坐标。

以下帧: 使用之前的帧坐标开始在存储位置周围的区域中寻找面孔。如果没有找到,则增加与它要找人脸的位置的距离,然后重新搜索。

这样做会大大提高我的表现,但是我没有找到任何方法告诉算法它必须在哪里寻找面孔。

有办法吗?

谢谢。

如果想直接使用OpenCV算法而不修改它,可以在上一帧的人脸位置周围提取子图像。通过这种方式,OpenCV 人脸检测器在更小的区域上执行滑动 window 搜索。然后在全帧坐标系中重新映射面部位置。如果你的脸移动不太快,你可以 运行 每 n 帧并在检测帧之间插入位置以进一步加速。 要获取 subImg,您可以使用:

cv::Rect roi(xTl,yTl,w,h);
cv::Mat subImg = img(roi);

其中 xTl,yTl 是搜索的左上角坐标 window,w,h 是大小。

或者,一旦检测到人脸,您可以使用 MeanShift/CamShift 跟踪器(或其他跟踪器)在每一帧中找到位置: http://docs.opencv.org/trunk/doc/py_tutorials/py_video/py_meanshift/py_meanshift.html.

感谢您的提示! 使用子图像进行检测会得到 30 帧而不是 10 帧。

我将使用你提到的这个插值法。我认为在自己的线程中计算检测会进一步提高性能。