如何在OpenCV Python中裁剪和保存检测到的人脸
我们可以使用预先训练好的haar级联分类器来检测图像中的人脸。为了检测人脸, OpenCV 为我们提供了不同的haar级联作为xml文件。我们将使用 haarcascade_frontalface_alt.xml 来检测图像中的人脸。检测到的人脸坐标为 (x, y, w, h) 。要裁剪并保存检测到的人脸,我们保存图像为 image[y:y+h, x:x+w] 。
如何下载Haarcascades
您可以在GitHub网址中找到不同的Haarcascades –
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 required libraries
import cv2
# read the input image
img = cv2.imread('woman.jpg')
# convert to grayscale of each frames
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# read the haarcascade to detect the faces in an image
face_cascade = cv2.CascadeClassifier('haarcascades\haarcascade_frontalface_default.xml')
# detects faces in the input image
faces = face_cascade.detectMultiScale(gray, 1.3, 4)
print('Number of detected faces:', len(faces))
# loop over all detected faces
if len(faces) > 0:
for i, (x, y, w, h) in enumerate(faces):
# To draw a rectangle in a face
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")
# display the image with detected faces
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们将使用下面的图像作为这个程序的 输入文件 -
当你运行上述Python程序时,它将产生以下 输出 –
Number of detected faces: 1
face0.jpg is saved
以下是我们得到的 输出 窗口 –
示例
在这个Python示例中,我们使用haar级联来裁剪并保存输入图像中检测到的人脸。
# import required libraries
import cv2
# read the input image
img = cv2.imread('two-men.jpg')
# convert to grayscale of each frames
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# read the haarcascade to detect the faces in an image
face_cascade = cv2.CascadeClassifier('haarcascades\haarcascade_frontalface_alt.xml')
# detects faces in the input image
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
print('Number of detected faces:', len(faces))
# loop over all detected faces
if len(faces) > 0:
for i, (x,y,w,h) in enumerate(faces):
# To draw a rectangle in a face
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
face = img[y:y+h, x:x+w]
cv2.imshow(f"Cropped Face {i}", face)
cv2.imwrite(f'face{i}.jpg', face)
print(f"face{i}.jpg is saved")
# display the image with detected faces
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们将把这个图像用作该程序的 输入文件 -
当您执行该程序时,它将产生以下 输出 -
Number of detected faces: 2
face0.jpg is saved
face1.jpg is saved
这里是我们得到的 输出 窗口 −