【Python】Python使用OpenCV识别多个人脸,并把识别到的图像存储到本地
【Python】Python使用OpenCV识别多个人脸,并把识别到的图像存储到本地
使用 OpenCV(cv2)进行人脸检测是一种常见的方法,主要依赖于预训练的 Haar 特征级联分类器或深度学习模型(如 DNN 模块)。以下是如何使用 OpenCV 进行人脸检测的详细步骤和示例代码。
一、安装依赖项
首先,确保你已经安装了 OpenCV 库:
pip install -i https://mirrors.tools.huawei.com/pypi/simple --trusted-host mirrors.tools.huawei.com opencv-python
二、使用 Haar 特征级联分类器进行人脸检测
OpenCV 提供了预训练的 Haar 特征级联分类器,可以用于人脸检测。以下是使用 Haar 特征级联分类器进行人脸检测的示例代码:
import cv2
# 加载预训练的 Haar 特征级联分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 加载图像并转换为灰度图像
image_path = 'path_to_your_image.jpg'
image = cv2.imread(image_path)
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 进行人脸检测
faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 绘制检测到的人脸
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 显示图像
cv2.imshow('Detected Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、使用 DNN 模块进行人脸检测
OpenCV 的 DNN 模块提供了更高级的深度学习模型进行人脸检测。以下是使用 DNN 模块进行人脸检测的示例代码:
3.1、下载预训练模型和配置文件
首先,下载以下预训练模型和配置文件:
deploy.prototxt
res10_300x300_ssd_iter_140000.caffemodel
你可以从以下链接下载这些文件:
3.2、示例代码
import cv2
import numpy as np
from datetime import datetime
"""
Python使用OpenCV识别多个人脸,并把识别到的图像存储到本地
"""
# 加载预训练模型和配置文件
model_file = 'res10_300x300_ssd_iter_140000.caffemodel'
config_file = 'deploy.prototxt'
net = cv2.dnn.readNetFromCaffe(config_file, model_file)
# 加载图像
image_path = 'D:/pic_video/mv3.jpg' # 替换为自己的图像
image = cv2.imread(image_path)
(h, w) = image.shape[:2]
# 将图像转换为 blob
blob = cv2.dnn.blobFromImage(cv2.resize(image, (300, 300)), 1.0, (300, 300), (104.0, 177.0, 123.0))
# 进行人脸检测
net.setInput(blob)
detections = net.forward()
print(str(detections.shape[2]))
# 检测到的人脸计数
face_count = 0
# 绘制检测到的人脸并截取保存
for i in range(detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence > 0.1305:
box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
(startX, startY, endX, endY) = box.astype("int")
# 绘制人脸边界框
cv2.rectangle(image, (startX, startY), (endX, endY), (255, 0, 0), 2)
# 截取人脸图像
face_image = image[startY:endY, startX:endX]
# 生成文件名
timestamp = datetime.now().strftime('%Y%m%d%H%M%S')
face_filename = f'face_{timestamp}_{face_count}.jpg'
# 保存人脸图像
cv2.imwrite(face_filename, face_image)
# 增加人脸计数
face_count += 1
# 显示检测结果图像
cv2.imshow('Detected Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
作者:Tzq@2018