目录
一、Dlib库
1、什么是Dlib库
2、OpenCV优缺点
1)优点
2)缺点
3、Dlib库优缺点
1)优点
2)缺点
4、安装Dlib库
二、案例实现
1、对图片进行人脸识别
运行结果:
2、使用摄像头或对视频检测人脸
运行结果:
一、Dlib库
1、什么是Dlib库
Dlib库是一个适用于C++和Python的第三方库。包含机器学习、计算机视觉和图像处理的工具包,被广泛的应用于机器人、嵌入式设备、移动电话和大型高性能计算环境。是开源许可用户免费使用。
2、OpenCV优缺点
1)优点
• 可以在CPU上实时工作
• 简单的架构
• 可以检测不同比例的人脸。
2)缺点
• 会出现大量的把非人脸预测为人脸的情况
• 不适用于非正面人脸图像
• 不抗遮挡。
3、Dlib库优缺点
1)优点
• 适用于正面和略微非正面的人脸
• 语法极简单
• 再小的遮挡下仍可工作。
2)缺点
• 不能检测小脸,因为它训练数据的最小人脸尺寸为80×80,较小尺寸的人脸数据需自己训练检测器
• 边界框通常排除前额的一部分甚至下巴的一部分
• 不适用于侧面和极端非正面,如俯视或仰视。
4、安装Dlib库
1)pip install dlib -i 镜像地址
2)找到dlib库的whl文件进行安装
在whl文件目录下,点击上方文件地址栏,输入cmd,然后使用命令pip install whl文件名即可
二、案例实现
1、对图片进行人脸识别
import cv2
import dlib
# 使用HOG算法、线性分类器、金字塔图像结构和滑动窗口检测等技术。
# 比opencv提供的harr级联分类器效果更好
"""生成人脸检测器"""
detector = dlib.get_frontal_face_detector() # 构造脸部位置检测器HOG
img = cv2.imread("people2.png")
# 参数:image:待检测的可能含有人脸的图像。
# 参数n:表示采用上采样的次数。上采样会让图像变大,能够检测到更多人脸对象,提高小人脸的检测效果
# #通常建议将此參数设置为0 或 1。较大的值会增加检测的准确性,但会降低处理速度。
# 返回值faces:返回检测图像中的所有人脸。
faces = detector(img,3) # 使用构造的脸部位置检测器HOG对图像进行检测,3表示上采样次数
for face in faces: # 对每个人脸框进行逐个处理
# 获取人脸框的坐标
x1 = face.left() # 获取左边像素点的x坐标
y1 = face.top() # 获取上边界y坐标
x2 = face.right() # 右边界x坐标
y2 = face.bottom() # 下边界y坐标
# 绘制人脸框
cv2.rectangle(img,(x1,y1),(x2,y2),(0,255,0),2)
# 是不捕获到的各个人脸框
cv2.imshow("result",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
2、使用摄像头或对视频检测人脸
import cv2
import dlib
detector = dlib.get_frontal_face_detector() # 构造脸部位置检测器HOG
cap = cv2.VideoCapture('笑容.mp4') # 读取视频帧
# cap = cv2.VideoCapture(0) # 打开摄像头
if not cap.isOpened(): # 如果打开失败
print("Cannot open camera")
exit() # 终止程序
while True: # 建立死循环,用来不停地读取视频的每一帧画面
ret, image = cap.read() # 读取视频帧,返回读入状态的布尔值和图片,一次读取一帧画面
if not ret: # 读取失败,则退出循环
print("不能读取摄像头")
break
faces = detector(image,0) # 使用脸部位置检测器对每一帧画面进行识别,0表示上采样次数
for face in faces: # 对每个人脸框进行逐个处理
x1 = face.left()
y1 = face.top()
x2 = face.right()
y2 = face.bottom()
# 绘制人脸框
cv2.rectangle(image,(x1,y1),(x2,y2),(0,255,0),2)
# 展示捕获到的各个人脸框
cv2.imshow("result",image)
k = cv2.waitKey(20) # 每一帧画面执行20毫秒
if k == 27: # 如果键盘点击esc键,终止循环
break
cv2.destroyAllWindows() # 关闭所有窗口释放资源