在本篇博客中,我们将使用Python和OpenCV库实现一个实时人脸检测的小项目。我们将利用OpenCV中的Haar级联分类器来检测摄像头捕获的图像中的人脸。
确保您已经安装了Python和OpenCV。如果尚未安装,请按照以下步骤进行安装:
pip install opencv-python
首先,我们需要导入所需的库:
import cv2
接下来,加载预训练的Haar级联分类器:
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
现在,我们将编写一个函数来检测图像中的人脸并在检测到的人脸周围绘制矩形框:
def detect_faces(img, cascade):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
return img
最后,我们将捕获摄像头的视频流,并对每一帧应用人脸检测:
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
frame = detect_faces(frame, face_cascade)
cv2.imshow('Real-time Face Detection', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
现在,您可以运行上面的代码,启动实时人脸检测程序。在弹出的窗口中,您应该能看到摄像头捕获的图像,检测到的人脸周围用矩形框标记。按“q”键退出程序。
但是如果要实现截图并且保存到文件夹还需要:
导入额外的库来处理时间和文件操作:
def save_faces(img, faces, output_dir):
for i, (x, y, w, h) in enumerate(faces):
face = img[y:y + h, x:x + w]
filename = os.path.join(output_dir, f'face_{i}.png')
cv2.imwrite(filename, face)
现在,我们需要稍微修改 detect_faces
函数,使其返回检测到的人脸坐标:
def detect_faces(img, cascade):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
return img, faces
接下来,在捕获摄像头的视频流的循环中,我们将为每个检测到的人脸创建一个以实时时间命名的文件夹,并将人脸截图保存到其中:
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
frame, faces = detect_faces(frame, face_cascade)
if len(faces) > 0:
timestamp = datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
output_dir = os.path.join('faces', timestamp)
os.makedirs(output_dir, exist_ok=True)
save_faces(frame, faces, output_dir)
cv2.imshow('Real-time Face Detection', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
现在,当程序检测到人脸时,它将自动截取人脸并将其保存为PNG格式的图像。这些图像将保存在一个名为 "faces" 的文件夹中,该文件夹中包含以实时时间命名的子文件夹。按“q”键退出程序。