1. 介绍
人脸采集和表情识别是计算机视觉的一个热门领域。在本篇文章中,我们将使用Python编程语言和Dlib库、Opencv库实现人脸采集并表情判别功能。Dlib是一个C++库,提供了许多面部检测、特征提取和图像变换的工具,而Opencv是一个强大的计算机视觉库。结合这两个库,我们可以实现强大而灵活的人脸识别和表情识别应用程序。
2. 实现过程
2.1 环境配置
在开始本项目之前,需要确保我们的计算机上安装了以下软件:
Python版本3.x
Dlib库
Opencv库
numpy库
如果您的计算机上还没有安装这些软件,您可以在终端中使用以下命令来安装:
pip install dlib
pip install opencv-python
pip install numpy
2.2 人脸采集
在本项目中,我们将使用Dlib库中提供的人脸检测器来检测图像中的人脸。一旦检测到人脸,我们将使用Opencv库来捕捉图像。我们使用示例代码来演示如何使用Dlib和Opencv实现人脸采集。以下是完整的代码:
import cv2
import dlib
# 实例化Dlib的人脸检测器
detector = dlib.get_frontal_face_detector()
# 创建Opencv窗口
cv2.namedWindow("Face Collection")
# 捕捉视频
cap = cv2.VideoCapture(0)
# 创建人脸计数器
face_cnt = 0
while True:
_, frame = cap.read()
# 将RGB图像转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 使用Dlib检测器检测人脸
faces = detector(gray, 1)
# 在检测到的人脸上绘制矩形
for face in faces:
x, y, w, h = face.left(), face.top(), face.right() - face.left(), face.bottom() - face.top()
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
# 显示捕捉到的帧
cv2.imshow("Face Collection", frame)
# 按下'q'键退出程序
if cv2.waitKey(1) == ord('q'):
break
# 将捕捉到的图像保存到文件
if len(faces)>0:
face_cnt += 1
cv2.imwrite("face_"+str(face_cnt)+".jpg", gray[y:y+h, x:x+w])
# 关闭窗口
cv2.destroyAllWindows()
# 释放视频捕捉对象
cap.release()
以上代码将捕捉摄像头的视频流,并在其中识别出人脸。当检测到人脸时,程序会将该帧中的人脸保存到文件中。
2.3 表情识别
接下来,我们将使用Opencv库将表情识别功能添加到我们的应用程序中。在本项目中,我们将使用OpenCV中内置的级联分类器检测面部表情。以下是完整的代码:
import cv2
import dlib
# 实例化Dlib的人脸检测器和面部特征提取器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# 加载基于Haar特征的面部表情分类器
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
eye_cascade = cv2.CascadeClassifier("haarcascade_eye.xml")
smile_cascade = cv2.CascadeClassifier("haarcascade_smile.xml")
# 创建Opencv窗口
cv2.namedWindow("Facial Expression Recognition")
# 加载图像
img = cv2.imread("face_1.jpg")
# 将RGB图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用Dlib检测器检测面部
faces = detector(gray, 1)
# 在面部中检测表情
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) # 绘制面部矩形
roi_gray = gray[y:y+h, x:x+w] # 矩形范围内的灰度图像
roi_color = img[y:y+h, x:x+w] # 矩形范围内的RGB图像
# 在roi_gray中检测眼睛
eyes = eye_cascade.detectMultiScale(roi_gray, scaleFactor=1.5, minNeighbors=5)
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 0, 255), 2)
# 在roi_gray中检测微笑
smiles = smile_cascade.detectMultiScale(roi_gray, scaleFactor=1.5, minNeighbors=15)
for (sx, sy, sw, sh) in smiles:
cv2.rectangle(roi_color, (sx, sy), (sx+sw, sy+sh), (0, 255, 0), 2)
# 显示图像
cv2.imshow("Facial Expression Recognition", img)
# 按下任意键退出程序
cv2.waitKey(0)
# 关闭窗口
cv2.destroyAllWindows()
以上代码可以加载图像,并在其中检测面部表情。程序检测到的眼睛和笑容都将在面部矩形内绘制成矩形。
3. 结论
通过使用Python编程语言和Dlib库、Opencv库,我们实现了人脸采集和表情判别功能。我们学习了如何使用Dlib检测器检测人脸,以及如何使用Opencv中的级联分类器检测面部表情。这是计算机视觉中一个有趣和实用的应用程序,可以应用于许多领域,例如自动人脸识别和情感分析。