在 Python 中实现通过摄像头进行实时人脸识别并对指定人脸进行报警的功能,可以使用 OpenCV 和 face_recognition 库。以下是一个完整的解决方案,包括安装必要的库、编写代码和运行程序。
安装必要的库
首先,确保你已经安装了 opencv-python 和 face_recognition 库。如果没有安装,可以使用以下命令进行安装:
pip install opencv-pythonpip install face_recognition编写代码
下面是一个完整的示例代码,展示如何通过摄像头进行实时人脸识别,并对指定人脸进行报警。import cv2
import face_recognition
import numpy as np
import os
from playsound import playsound
# 加载指定人脸照片并进行编码
def load_known_face(image_path):
image = face_recognition.load_image_file(image_path)
face_encoding = face_recognition.face_encodings(image)[0]
return face_encoding
# 初始化已知人脸
known_face_encodings = []
known_face_names = []
# 指定人脸照片路径
known_face_image_path = "path/to/known_face.jpg"
known_face_name = "Person Name"
# 加载并编码已知人脸
known_face_encodings.append(load_known_face(known_face_image_path))
known_face_names.append(known_face_name)
# 打开摄像头
video_capture = cv2.VideoCapture(0)
# 初始化一些变量
face_locations = []
face_encodings = []
face_names = []
process_this_frame = True
while True:
# 抓取一帧视频
ret, frame = video_capture.read()
# 每两帧处理一次
if process_this_frame:
# 将视频帧缩小以加快处理速度
small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
# 将帧转换为RGB颜色空间
rgb_small_frame = small_frame[:, :, ::-1]
# 检测人脸位置
face_locations = face_recognition.face_locations(rgb_small_frame)
face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)
face_names = []
for face_encoding in face_encodings:
# 检查人脸是否与已知人脸匹配
matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
name = "Unknown"
# 使用已知人脸的距离,找到最匹配的已知人脸
face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
best_match_index = np.argmin(face_distances)
if matches[best_match_index]:
name = known_face_names[best_match_index]
face_names.append(name)
process_this_frame = not process_this_frame
# 显示结果
for (top, right, bottom, left), name in zip(face_locations, face_names):
# 将人脸位置还原到原始帧大小
top *= 4
right *= 4
bottom *= 4
left *= 4
# 画出人脸框
cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
# 画出人脸名字标签
cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)
# 如果检测到指定人脸,触发报警
if name == known_face_name:
print(f"Alert! {name} detected!")
playsound('path/to/alarm_sound.mp3')
# 显示视频帧
cv2.imshow('Video', frame)
# 按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头资源并关闭窗口
video_capture.release()
cv2.destroyAllWindows()代码解释
加载指定人脸照片并进行编码:
使用 face_recognition.load_image_file 加载指定人脸照片。
使用 face_recognition.face_encodings 对人脸进行编码。
初始化已知人脸:
将指定人脸的编码和名字添加到已知人脸列表中。
打开摄像头:
使用 cv2.VideoCapture(0) 打开默认摄像头。
处理视频帧:
每两帧处理一次,以提高处理速度。
使用 face_recognition.face_locations 检测人脸位置。
使用 face_recognition.face_encodings 对人脸进行编码。
使用 face_recognition.compare_faces 检查人脸是否与已知人脸匹配。
显示结果:
在视频帧上画出人脸框和名字标签。
如果检测到指定人脸,触发报警(播放报警声音)。
释放资源:
释放摄像头资源并关闭窗口。
注意事项
路径配置:确保已知人脸照片和报警声音文件的路径正确。
性能优化:可以进一步优化代码以提高性能,例如使用多线程处理视频帧。
报警方式:可以根据需要更改报警方式,例如发送邮件或短信。网友回复
有没有兼容Puppeteer和 Playwright使用的docker独立chrome浏览器?
geo与seo区别?
chrome插件能否实现网页远程控制鼠标选择网页文字滚动网页?
nativescript开发的安卓与ios app应用是原生的吗?
go如何写一个类似redis的nosql数据库让python客户端调用?
php7中为啥无法使用$_SERVER['HTTP_RAW_POST_DATA'] ?
chrome插件能否实现2台电脑的远程协助桌面控制?
python如何通过webrtc网页远程协助控制python运行的电脑?
systemd-nspawn与unshare区别?
Firejail、Bubblewrap沙箱与docker、podman容器区别?


