如何在OpenCV Python中裁剪并保存检测到的人脸?
我们可以使用已经训练好的haar级联分类器来检测图像中的人脸。为了检测人脸, OpenCV 提供了不同的haar级联作为xml文件。我们将使用 haarcascade_frontalface_alt.xml 在图像中进行人脸检测。检测到的人脸坐标为 (x,y,w,h) 。为了裁剪并保存检测到的人脸,我们可保存 image[y:y+h, x:x+w] 。
如何下载Haarcascades?
您可以在GitHub网站上找到不同的haar级联,地址如下 −
https://github.com/opencv/opencv/tree/master/data/haarcascades
要下载用于人脸检测的haar级联,请单击文件 haarcascade_frontalface_alt.xml ,将其以原始格式打开,右键单击并保存该文件。
注意 - 将所有haar级联xml文件保存在 haarcascade 文件夹中。
步骤
要在图像中裁剪并保存检测到的人脸,您可以按照以下步骤进行操作 −
- 导入所需库。在所有以下示例中,需要使用Python库 OpenCV 。请确保已经安装它。
-
使用 cv2.imread() 读取输入图像。指定完整图像路径。将输入图像转换为灰度图像。
-
初始化Haar级联分类器对象 face_cascade=cv2.CascadeClassifier() 进行人脸检测。传递haar级联xml文件的完整路径。您可以使用haar级联文件 haarcascade_frontalface_alt.xml 检测图像中的人脸。
-
使用 face_cascade.detectMultiScale() 检测输入图像中的人脸。它以 (x, y, w, h) 格式返回检测到的人脸的坐标。
-
循环处理所有检测到的人脸。找到 image[y:y+h, x:x+w] 作为裁剪人脸并将其分配给新变量,例如 face 。使用 cv2.imwrite() 保存裁剪的人脸。
-
可选地,为了可视化目的,显示裁剪的人脸。
让我们看一些示例,以获得更清晰的理解。
例子
在此示例中,我们使用haar级联裁剪并保存输入图像中检测到的人脸。
# 导入所需的库
import cv2
# 读入输入图片
img = cv2.imread('woman.jpg')
# 将各帧转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 读取检测图像中的人脸所需的haarcascade
face_cascade = cv2.CascadeClassifier('haarcascades\haarcascade_frontalface_default.xml')
# 检测输入图像中的人脸
faces = face_cascade.detectMultiScale(gray, 1.3, 4)
print('Number of detected faces:', len(faces))
# 循环遍历所有检测到的人脸
if len(faces) > 0:
for i, (x, y, w, h) in enumerate(faces):
# 在脸部绘制矩形
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 255), 2)
face = img[y:y + h, x:x + w]
cv2.imshow("Cropped Face", face)
cv2.imwrite(f'face{i}.jpg', face)
print(f"face{i}.jpg is saved")
# 显示带有检测到的人脸的图像
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们将使用以下图像作为 输入文件 程序 –
当您运行以上Python程序时,它将产生以下 输出 -
Number of detected faces: 1
face0.jpg is saved
我们得到以下 输出 窗:
示例
在此Python示例中,我们使用haar cascade裁剪和保存检测到的人脸。
# 导入所需库
import cv2
# 读入输入图片
img = cv2.imread('two-men.jpg')
# 将每一帧转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 读取用于检测图像中人脸的haarcascade文件
face_cascade = cv2.CascadeClassifier('haarcascades\haarcascade_frontalface_alt.xml')
# 在输入图像中检测人脸
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
print('被检测到的人脸数量:', len(faces))
# 遍历所有检测到的人脸
if len(faces) > 0:
for i, (x,y,w,h) in enumerate(faces):
# 画出人脸矩形
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
face = img[y:y+h, x:x+w]
cv2.imshow(f"裁剪后的人脸 {i}", face)
cv2.imwrite(f'face{i}.jpg', face)
print(f"face{i}.jpg已保存")
# 显示检测到人脸的图像
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们将使用此图片作为 输入文件 进行程序测试 −
执行程序后,将生成以下数字结果 输出 −
被检测到的人脸数量:2
face0.jpg已保存
face1.jpg已保存
并且我们将得到以下数字结果 输出 窗口 −