如何使用OpenCV Python检测人脸并在其周围绘制边界框?
使用haar级联分类器在图像中检测人脸。haar级联分类器是一种有效的基于机器学习的物体检测方法。我们可以为训练数据训练自己的haar级联,但在这里,我们使用已经训练好的haar级联进行人脸检测。
我们将使用 haarcascade_frontalface_alt.xml 作为进行人脸检测的”haar级联”XML文件。
如何下载Haarcascades?
您可以在GitHub网址中找到不同的haar级联 –
https://github.com/opencv/opencv/tree/master/data/haarcascades
要下载人脸检测的haar级联,请单击 haarcascade_frontalface_alt.xml 文件。以原始格式打开它,右键单击并保存。
注意 - 将所有haar级联XML文件保存在 haarcascades 文件夹中。
步骤
我们可以按照以下步骤检测图像中的人脸并在它们周围绘制边界框 –
- 使用所需的库导入。在下面的所有示例中,所需的Python库为 OpenCV 。请确保您已经安装了它。
-
使用 cv2.imread() 读取输入图像。指定完整的图像路径。
-
为人脸检测初始化一个Haar级联分类器对象 face_cascade = cv2.CascadeClassifier() 。 传递haar级联xml文件的完整路径。您可以使用haar级联文件 haarcascade_frontalface_alt.xml 来在图像中检测人脸。
-
使用 face_cascade.detectMultiScale() 检测输入图像中的人脸。它以 (x,y,w,h) 格式返回检测到的人脸的坐标。
-
使用 cv2.rectangle() 在原始图像的检测到的人脸周围绘制边界矩形。
-
显示带有绘制在脸周围的边框的图像。
让我们看一些示例以获得更清楚的理解。
例子
在这个Python程序中,我们检测一个人脸,并在检测到的人脸周围绘制一个边界框。
# 导入必要的库
import cv2
# 读取输入图片
img = cv2.imread('people.jpg')
# 将每一帧转换为灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 读取haacascade以检测输入图像中的脸部
face_cascade = cv2.CascadeClassifier('haarcascades\haarcascade_frontalface_alt.xml')
# 检测输入图像中的脸部
faces = face_cascade.detectMultiScale(gray, 1.1, 2)
print('检测到的脸部数量:', len(faces))\
# 遍历所有检测到的脸部
for (x,y,w,h) in faces:
# 在检测到的脸部周围画一个矩形
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
# 在窗口中显示一个图像
cv2.imshow('人脸检测',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
将以下图片视为 输入文件 该程序的图像−
输出
运行上述Python程序时,将生成以下 输出 窗口−
检测到的脸部数量: 1
我们得到以下 输出 窗口−
脸部周围的边界框用黄色绘制。
例子
在此Python程序中,我们检测输入图像中的面部,并在检测到的面部周围绘制边界框。
import cv2
img = cv2.imread('window1.jpg')
img1 =cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(img1,170,255,0)
# 画各种形状的椭圆
img = cv2.ellipse(img,(368,250),(100,40),30,0,180,(0,255,255),-1)
img = cv2.ellipse(img,(150,170),(86,45),-30,0,360,(0,255,0),-1)
img = cv2.ellipse(img,(578,250),(60,130),0,0,340,(0,0,255),-1)
# 显示带有绘制椭圆的图像
cv2.imshow("Ellipses", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们将使用该图像作为 输入文件 运行该程序−
输出
编写上述Python程序并运行后,将生成以下 输出 窗口−
Number of detected faces: 15
我们得到以下输出窗口−
黄色 是面部周围的边界框。