如何在OpenCV Python中裁剪并保存检测到的人脸?

如何在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()

我们将使用以下图像作为 输入文件 程序 –

如何在OpenCV Python中裁剪并保存检测到的人脸?

当您运行以上Python程序时,它将产生以下 输出 -

Number of detected faces: 1
face0.jpg is saved

我们得到以下 输出 窗:

如何在OpenCV Python中裁剪并保存检测到的人脸?

示例

在此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()

我们将使用此图片作为 输入文件 进行程序测试 −

如何在OpenCV Python中裁剪并保存检测到的人脸?

执行程序后,将生成以下数字结果 输出

被检测到的人脸数量:2
face0.jpg已保存
face1.jpg已保存

并且我们将得到以下数字结果 输出 窗口 −

如何在OpenCV Python中裁剪并保存检测到的人脸?

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python OpenCV