毕设的第一步,人脸检测和图像预处理这一模块已经得已解决。第三方库使用了dlib和opencv。那么我就依次来叙述整个流程:
第三方库的安装
opencv是广大python爱好者熟知的库,安装也十分加单,故不做赘述。
pip3 install opencv
重点在于dlib的安装。如果各位同学直接
pip3 install dlib
的话,100%会失败。因为dlib是需要face_recognition库才可以运行。虽然这么说,在执行上述指令时pip是会自动安装face_recognition的。失败的真正原因是dlib不能直接拿来用,需要用一个c++编译器来交叉编译一遍才可以。命令提示符提示的cmake就是用来做这个的。所以首先应该
pip3 install cmake
但是光安装cmake是不行的。上面说了需要一个c++编译器。我本人的做法是安装了cmake的客户端和visual studio IDE,用的VS里面的c++编译器。mingW搞不明白,弄了好久都没安装成功所以放弃了。要注意的是c++编译器必须添加进环境变量才可以(好在vs会自动添加)。
好,那么整理一下思路:
- 安装c++编译器
- 将其添加进环境变量
- 安装cmake客户端
- pip安装cmake
- pip安装dlib
提示一下,在安装dlib的时候会花费较多时间。千万不要看命令提示符没动静以为它死了,打开任务管理器你就能看到cmake正在使劲占用cpu资源呢
以上就是全部的准备工作,完成之后下面就可以敲代码了√
完整代码如下:
建议按照程序的执行顺序来阅读代码。复制粘贴到ide里面就可以直接跑,但是记得改x。
(当然如果你的电脑没有E盘那就把face_path也改了吧)
在后文中我会对代码进行详细解释。
import os, sys
import cv2
from random import uniform, randint
from dlib import get_frontal_face_detector as GFFD
#初始化所需参数
def begin():
gffd = GFFD() #dlib的人脸识别器
wdnm = 'camera' #窗口名称 window name 的缩写
cut_pixel = 64 #剪裁的像素大小
cv2.namedWindow(wdnm, cv2.WINDOW_KEEPRATIO) #AUTOSIZE
cap = cv2.VideoCapture(0) #调用内置摄像头
cap.set(3, 320) #窗口分辨率 width
cap.set(4, 240) #height
face_path = 'E:/Faces/my_faces' #素材的储存路径
if not os.path.exists(face_path): #若不存在则创建路径
os.makedirs(face_path)
return cut_pixel, wdnm, gffd, cap, face_path
#图像捕捉&显示
def camera(a, b, c, d):
ret, image = cap.read() #变量cap获取到的图像赋给image
if a == b == c == d == 0: #首次循环或者未检测到人脸时abcd为0
frame = cv2.flip(image, 1) #不带框的frame,下面那个是带框的frame
else : #(image, point, point, (rgb color), width),↓弄个框框住人脸
frame = cv2.rectangle(cv2.flip(image, 1), (b, a), (c, d), (0, 255, 0), 1)
cv2.imshow(wdnm, frame) #根据是否检测到人脸选择显示的frame
return image #分离用来显示的帧frame和用来处理的帧image
#检测人脸区域
def coordinate(sample):
flip = cv2.flip(sample, 1) #镜像图片,否则框脸的时候会错位
dlibed = gffd(flip, 1) #调用dlib的识别函数得到人脸区域的rectangles
if str(dlibed) == 'rectangles[]': #当未检测到人脸时dlibed会返回 rectangles[]
a = b = c = d = 0 #当未检测到人脸时强行给出value来return,且要和下面主函数的对应
else:
for x, pot in enumerate(dlibed): #遍历dlibed来获取到人脸区域的坐标点abcd
a = pot.top() if pot.top() >