家里摄像头拍了一堆视频,想找某个人的画面翻得头疼?或者想做个自动打卡系统,又觉得开发太难?其实用Python写个识别人脸的小脚本,几十行代码就能搞定。
准备工具:OpenCV + Python
大多数人用的都是OpenCV这个库,它支持Python调用,安装也简单。打开命令行,输入下面这句就行:
pip install opencv-python
装好之后,就可以开始写识别代码了。OpenCV自带训练好的人脸模型文件,叫haarcascade_frontalface_default.xml,可以直接拿来用。
写个最简单的识别脚本
比如你想从一张照片里圈出人脸,代码是这样的:
import cv2
# 加载人脸检测模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
# 读取图片
img = cv2.imread("family.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
# 在脸上画框
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 显示结果
cv2.imshow("Detected Faces", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行后,所有检测到的人脸都会被蓝色方框圈出来。你可以把family.jpg换成自己照片试试,连爸妈的脸都能认出来。
实时摄像头识别也不难
想用笔记本摄像头实时识别人脸?改几行代码就行:
import cv2
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
cv2.imshow("Face Cam", frame)
if cv2.waitKey(1) == ord('q'): # 按q退出
break
cap.release()
cv2.destroyAllWindows()
运行后打开摄像头,人一露脸就自动画框。公司门口放一台树莓派跑这脚本,员工进门自动记录时间,比打卡机还省事。
注意点别踩坑
光线太暗或者侧脸角度太大,识别率会下降。还有,模型对戴墨镜、口罩的人脸不太敏感。如果想提高准确度,可以换用更高级的模型,比如DNN模块里的ResNet,但对电脑配置要求也高些。
这整套脚本在普通笔记本上跑完全没问题,写一次能用在各种场景:相册分类、访客记录、甚至小孩玩具箱加个“只认脸开锁”功能,玩着玩着就把编程学会了。