利用OpenCV进行人脸识别的技术讲解–OpenCV网络OpenCV

雷锋网:这是使用OpenCV进行人脸识别的技术讲解。在阅读本文之前,这里有一些注意事项:

建议在运行代码之前阅读这篇文章——您需要了解代码的作用。成功运行不是目标,它是在新任务中找出错误的能力。

确保您使用的是 OpenCV v2

你需要一个网络摄像头

开放式CV

OpenCV 是最流行的计算机视觉库,最初是用 C 和 C++ 开发的,现在也支持 Python。

它使用机器学习算法在图像中搜索人脸。对于人脸这样复杂的东西,没有简单的检测可以断定是否有人脸,而是需要上千次的特征匹配。该算法将人脸识别任务分解为数千个小任务,没有一个难以处理。这些任务也称为分类器。

对于与人脸相似的对象,您可能需要不少于 6000 个分类器,每个分类器都需要成功匹配(当然还有容错性)才能检测到人脸。但是有一个问题:对于人脸识别,算法从左上角开始,一个一个地计算数据块,不断的问“这是人脸吗”。每个块有超过 6,000 次测试,组合计算量将达到数百万,计算机可能会让你等待。

OpenCV 使用级联来避免这种情况。什么是级联?最好的答案已经在字典中:瀑布或连续瀑布。

就像一个连续的瀑布,OpenCVcascade 将人脸检测问题分解为几个步骤。对于每个数据块,它都会进行粗略、快速的检查。如果通过,将执行更仔细的测试opencv中识别行人的脚,依此类推。该算法有 30 到 50 个这样的阶段或级联。只有通过所有阶段,算法才会判断已检测到人脸。这样做的好处是大多数图在前几个步骤中都会产生负反馈,因此算法不需要在其上测试所有 6000 个特征,从而节省了大量时间。相对于需要数小时的“正常过程”,这可以实现实时人脸检测。

实践中的级联

它的理论听起来可能很复杂,但实际上它非常简单。这些级联只是一系列包含 OpenCV 数据的 XML 文件。你用你想要的级联初始化代码,它会为你做你想做的事。

由于人脸识别无处不在,OpenCV 内置了一系列级联,可以检测从眼睛到手到腿的所有事物。甚至还有非人类物体的级联。例如,如果您经营一家卖香蕉的水果店,并且您想监控偷香蕉的人,那么有人为这种情况开发了一种算法!

安装 OpenCV

首先,您需要为您的操作系统找到正确的设置文件。

我发现安装 OpenCV 是最难的部分。如果您遇到奇怪的、无法解释的错误,则可能是库崩溃、32 位和 64 位兼容性问题等。个人经验是,仅使用 Linux 虚拟机从头开始安装 OpenCV 是最简单的。

安装后,您可以启动 Python 会话并键入以下代码以测试它是否有效:

$蟒蛇

>>> 导入 cv2

>>>

如果没有弹出错误,您可以继续下一步。

理解代码

源代码可以从存储库中下载。记得取 face_detect.py 文本、abba.png 图像和 haarcascade_frontalface_default.xml。下面,我分解代码。

# 获取用户提供的值

imagePath = sys.argv[1]

cascPath = sys.argv[2]

将图像和级联名称作为命令行参数传递。我们将使用 Abba 图像和 OpenCV 提供的默认级联进行人脸检测。

# 创建haar级联

faceCascade = cv2.CascadeClassifier(cascPath)

现在,我们创建一个级联并使用面部级联对其进行初始化。这会将面部级联加载到内存中,因此可以使用。请记住,级联只是一个包含人脸检测数据的 XML 文件。

# 读取图片

图像 = cv2.imread(imagePath)

灰色 = cv2.cvtColor(图像, cv2.COLOR_BGR2GRAY)

读取图像并将其转换为灰度格式。

# 检测图像中的人脸

faces = faceCascade.detectMultiScale(

灰色的,

比例因子=1.1,

minNeighbors=5,

minSize=(30, 30),

标志 = cv2.cv.CV_HAAR_SCALE_IMAGE

)

这个函数所做的是检测人脸,这是代码的核心部分。所以,让我们回顾一下这些选项。

DetectMultiScale 函数是用于检测对象的通用函数。我们称之为人脸级联,它检测人脸。第一个选项是灰度图像。

第二个是比例因子。有些人脸比其他人脸更靠近相机。ScaleFactor 对此进行了补偿。

检测算法使用移动窗口来检测对象。minNeighbors 定义在系统宣布检测到人脸之前当前周围有多少对象。MinSize 给出每个窗口的大小。

我正在为这些字段使用通用值。实际上,您会尝试不同的窗口大小、缩放因子等值,直到找到最适合的值。

当函数认为它找到了一张脸时,它会返回一个矩形列表。接下来,我们循环直到它认为它检测到了某些东西。

print “找到 {0} 个面孔!”.format(len(faces))

# 在人脸周围画一个矩形

对于面中的 (x, y, w, h):

cv2.矩形(图像, (x, y), (x+w, y+h), (0, 255, 0), 2)

该函数返回四个值:矩形的 x 和 y 坐标,以及它的高度和宽度。我们使用这些值和内置的 rectangle() 函数来绘制矩阵。

cv2.imshow(“找到人脸” ,image)

cv2.waitKey(0)

最后,我们显示模型并等待用户按下按钮。

测试结果

与阿巴核实。

$ python face_detect.py abba.png haarcascade_frontalface_default.xml

没问题,换一张照片试试。

那两个东西不是脸,我们再试一次。我调整了参数,发现将 scaleFactor 设置为 1.2 可以消除错误检测。

发生了什么?第一张是用高清摄像头近距离拍摄的,第二张是在比较远的距离拍的,应该是手机拍的。这就是为什么需要调整 scaleFactor 的原因。正如我所说,您需要根据实际场景设置算法并避免误报。

在这里,雷锋网提醒大家opencv中识别行人的脚,既然这是基于机器学习的,结果永远不会100%准确。在大多数情况下,你会得到不错的结果。但是算法偶尔会出错。

最终代码在这里。

带网络摄像头

如果你想使用网络摄像头怎么办?OpenCV 从摄像头读取每一帧,您可以通过处理每一帧来进行人脸检测。你需要一台功能强大的个人电脑,但我用了五年的笔记本电脑没问题。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论