前言
随着科技的发展, 人脸识别技术在许多领域得到的非常广泛的应用, 手机支付, 银行身份验证, 手机人脸解锁等等.
识别
废话少说, 这里我们使用 opencv 中自带了 haar 人脸特征分类器, 利用训练好的 haar 特征的 xml 文件, 在图片上检测出人脸的坐标, 利用这个坐标, 我们可以将人脸区域剪切保存, 也可以在原图上将人脸框出.
代码实现:
- # -*-coding:utf8-*-#
- import os
- import cv2
- from PIL import Image, ImageDraw
- from datetime import datetime
- """
- 分类器 https://github.com/opencv/opencv/tree/master/data/haarcascades
- 安装模块: pip install Pillow pip install opencv-python
- 博客: https://blog.52itstyle.vip/archives/3771/
- """
- def detectFaces(image_name):
- img = cv2.imread(image_name)
- face_cascade = cv2.CascadeClassifier(os.getcwd()+"\\haarcascade\\haarcascade_frontalface_alt.xml")
- if img.ndim == 3:
- gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- else:
- gray = img # if 语句: 如果 img 维度为 3, 说明不是灰度图, 先转化为灰度图 gray, 如果不为 3, 也就是 2, 原图就是灰度图
- faces = face_cascade.detectMultiScale(gray, 1.2, 5) # 1.3 和 5 是特征的最小, 最大检测窗口, 它改变检测结果也会改变
- result = []
- for (x, y, width, height) in faces:
- result.append((x, y, x + width, y + height))
- return result
- # 保存人脸图
- def saveFaces(image_name):
- faces = detectFaces(image_name)
- if faces:
- # 将人脸保存在 save_dir 目录下.
- # Image 模块: Image.open 获取图像句柄, crop 剪切图像 (剪切的区域就是 detectFaces 返回的坐标),save 保存.
- save_dir = image_name.split('.')[0] + "_faces"
- os.mkdir(save_dir)
- count = 0
- for (x1, y1, x2, y2) in faces:
- file_name = os.path.join(save_dir, str(count) + ".jpg")
- Image.open(image_name).crop((x1, y1, x2, y2)).save(file_name)
- count += 1
- if __name__ == '__main__':
- time1 = datetime.now()
- result = detectFaces(os.getcwd()+"\\images\\gaoyuanyuan.jpg")
- time2 = datetime.now()
- print("耗时:" + str(time2 - time1))
- if len(result)> 0:
- print("有人存在!!---》人数为:" + str(len(result)))
- else:
- print('视频图像中无人!!')
- drawFaces(os.getcwd()+"\\images\\", "hanxue.jpg")
- saveFaces(os.getcwd()+"\\images\\gaoyuanyuan.jpg")
识别效果图:
多人识别效果:
经过测试, 最终选用了 haarcascade_frontalface_alt.xml 做人脸识别, 识别率最高.
人脸检测分类器对比:
级联分类器的类型 | XML 文件名 |
---|---|
人脸检测器(默认) | haarcascade_frontalface_default.xml |
人脸检测器(快速的 Haar) | haarcascade_frontalface_alt2.xml |
人脸检测器(Tree) | haarcascade_frontalface_alt_tree.xml |
人脸检测器(Haar_1) | haarcascade_frontalface_alt.xml |
小结
开源的人脸检测分类器对于标准的人脸识别足够了, 要想精确识别比如, 侧脸, 模糊, 光照, 遮挡的人脸, 只能通过深度机器学习进一步优化识别精度和速度.
源码
来源: https://www.cnblogs.com/smallSevens/p/10462516.html