python+opencv实现人脸识别|采用现成训练好的模型

一、图片人脸检测(opencv)

1、安装opencv环境

介绍windows中opencv在python3上的实现,我的系统环境win10+python3.6+opcv3.4.1

首先去网站下载OpenCV对应的.whl版本压缩包,网址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv 本人下载的版本是:opencv_python‑3.4.1‑cp36‑cp36m‑win_amd64.whl 64位系统对应python3.6的,下载到F盘根目录。
链接:百度云链接
提取码:j5uy
接着用pip命令安装

pip install F:\opencv_python-3.4.1-cp36-cp36m-win_amd64.whl

当命令行窗口显示:

Processing F:\opencv_python-3.4.1-cp36-cp36m-win_amd64.whl
Installing collected packages: opencv-python
Successfully installed opencv-python-3.4.1

说明已经安装成功。
到此,opencv的环境配置已经弄好了,可以在命令行中运行python,然后import cv2 打印输出opencv的版本号,看能否正常输出。
在这里插入图片描述

2、具体实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import cv2

img = cv2.imread('img/1.png') # 读取图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换灰色

# OpenCV人脸识别分类器
classifier = cv2.CascadeClassifier(r'F:\python-project\opencv-master\haarcascade_frontalface_default.xml')#创建人脸检测级联分类器对象实例
color = (0, 255, 0) # 定义绘制颜色为绿色
# 调用识别人脸
faceRects = classifier.detectMultiScale(
gray, scaleFactor=1.2, minNeighbors=3, minSize=(24, 24))
#参数说明,scaleFactor:图像缩放比例,可理解为相机的X倍镜,minNeighbors:对特征检测点周边多少有效点同时检测,这样可避免因选取的特征检测点太小而导致遗漏
#minSize:特征检测点的最小尺寸
if len(faceRects): # 大于0则检测到人脸
for faceRect in faceRects: # 单独框出每一张人脸
x, y, w, h = faceRect
# 框出人脸
cv2.rectangle(img, (x, y), (x + h, y + w), color, 2)
# 左眼
#cv2.circle(img, (x + w // 4, y + h // 4 + 30), min(w // 8, h // 8),
# color)
#右眼
#cv2.circle(img, (x + 3 * w // 4, y + h // 4 + 30), min(w // 8, h // 8),
# color)
#嘴巴
cv2.rectangle(img, (x + 3 * w // 8, y + 3 * h // 4),
(x + 5 * w // 8, y + 7 * h // 8), color)

cv2.imshow("image-detection", img) # 显示图像

cv2.waitKey(0) #表示程序会无限制的等待用户的按键事件
cv2.destroyAllWindows()#关闭所有窗口

3、识别结果

在这里插入图片描述

二、图片人脸检测(dlib)

比opencv更加精准的图片人脸检测库Dlib,Dlib可以检测脸部68甚至更多的特征点。

1、安装dlib

下载地址:https://pypi.org/simple/dlib/
我的环境为win10+python3.6.5
选择dlib的版本为:dlib-19.8.1-cp36-cp36m-win_amd64.whl
在这里插入图片描述
接着用pip命令安装:

pip install dlib-19.8.1-cp36-cp36m-win_amd64.whl

2、训练模型

下载链接:https://pan.baidu.com/s/1xai1X_L8JvDfFJyU3f_0Ig
提取码:g24q

3、具体实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import cv2
import dlib

path = "img/1.png"
img = cv2.imread(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转成灰度图

#人脸分类器
detector = dlib.get_frontal_face_detector()
# 获取人脸检测器
predictor = dlib.shape_predictor(
"F:\\python-project\\shape_predictor_68_face_landmarks.dat"
)

dets = detector(gray, 1)
for face in dets:
shape = predictor(img, face) # 寻找人脸的68个标定点
# 遍历所有点,打印出其坐标,并圈出来
for pt in shape.parts():
pt_pos = (pt.x, pt.y)
cv2.circle(img, pt_pos, 2, (0, 255, 0), 1)
cv2.imshow("image", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

4、识别结果

在这里插入图片描述
参考链接:https://github.com/vipstone/faceai/blob/master/doc/detectionOpenCV.md