背景
最近在和一家科技设计公司合作,需要从大量图片中挑选出含有人物的图片。因此考虑使用 OpenCV 进行人脸识别,有检测到人脸的图片再进额外的处理
介绍
OpenCV是一个跨平台的计算机视觉库,支持Windows、Linux、macOS等操作系统。它提供了丰富的接口和函数,包括图像处理、计算机视觉、模式识别、机器学习等领域,可用于多种计算机视觉应用,如人脸识别、行人检测、运动跟踪、医学图像处理、目标识别等。
Github仓库:https://github.com/opencv/opencv
安装
1 | pip install opencv-python |
安装完成后,我们就可以开始使用OpenCV在Python中实现各种计算机视觉任务了。
图像处理
使用OpenCV读取和显示图像
1 | import cv2 |
除了读取和显示图像外,OpenCV还提供了许多其他图像处理功能,如调整大小、旋转、裁剪、灰度化、边缘检测、过滤器、形态学运算等。
例如,下面的代码实现了将图像缩小一半,并进行灰度化和Canny边缘检测:
1 | import cv2 |
人脸检测
OpenCV提供了多种方法来实现人脸检测,其中一种常用的方法是使用Haar 特征 (Haar-like Features) Cascade分类器。下面的代码演示了如何使用OpenCV在Python中实现人脸检测:
1 | import cv2 |
这个分类器模型可以在
OpenCV 的 Github 仓库中的 data/haarcascades 目录中找到并且下载 opencv/data/haarcascades
可以看到有
haarcascade_frontalface _default.xml 人脸检测级联分类器的默认模型。它对于一般情况下的人脸检测具有较好的效果,但在某些复杂场景下可能会有一些限制。
haarcascade_frontalface_alt.xml 用于检测正面人脸。它在一般情况下具有较好的检测性能,并且速度相对较快。
haarcascade_ frontalface_alt2.xml alt 的改进版本,对于一些复杂场景或具有不同角度的人脸也能进行较好的检测。
haarcascade_ frontalface_alt_tree.xml 在 alt 的基础上使用了更复杂的级联结构,提高了人脸检测的准确性和鲁棒性。它通常对于复杂背景和表情变化较大的人脸具有更好的效果,但相应的检测速度可能会稍慢一些。
通常我们使用 alt2 就可以取得很好的效果
使用
我们可以看到 detectMultiScale 函数中有需要传入 scaleFactor 和 minNeighbors 参数。
scaleFactor 用于指定在图像金字塔中采用多大的步长搜索人脸。它的值越小,搜索所花费的时间和检测精度都会增加。一般情况下,值在 1.01 到 1.5 之间逐步增加可以获得比较理想的效果。
minNeighbors 是指人脸矩形相邻两个矩形之间的最小有效距离,也就是当检测到一个人脸时,如果该矩形周围有比它更小的矩形,则认为该矩形并非人脸矩形,会被过滤掉。这个参数的值越大,过滤掉的矩形就越多,同时漏检率也会增加,而值越小,检出的矩形较多,但误检率也会增加。一般情况下,建议在 3-6 之间取值。
我们也可以通过跟踪当前检测到的人脸数量和大小与预期值之间的差距,然后根据差距来自动调整检测器的参数。例如,当检测到的人脸数量过少时,可以尝试减小 minNeighbors 参数或增加 scaleFactor 参数,以扩大检测范围;而当检测到的人脸数量过多时,则可以尝试增加 minSize 参数,以过滤掉小尺寸的误检测。
动态调整参数可以使用反馈控制的方法。具体来说,可以根据当前检测到人脸的数量和大小与预期值之间的差距,自动调整检测器的参数,以达到更好的检测效果。
下面是完整代码,请留意 while True 部分代码
1 | import cv2 |
总结
通过本文,我们了解了OpenCV的功能及应用领域、如何在Python中使用OpenCV实现图像处理和人脸检测等计算机视觉任务。OpenCV还支持多种其他计算机视觉操作,例如目标跟踪、形态学运算、特征提取和机器学习等。
需要注意的是,在实际使用过程中,应根据具体要求和数据集选用不同的算法和模型,并对其进行调优和优化,以充分发挥OpenCV的性能和应用优势。


