一、实践目标
本项目在行空板上外接USB摄像头,通过摄像头来检测人脸的面部,并在其上绘制网格。
二、知识目标
1、学习使用MediaPipe的Face Mesh模型进行面部网格绘制的方法。
三、实践准备
硬件清单:
软件使用:Mind+编程软件x1
四、实践过程
1、硬件搭建
将摄像头接入行空板的USB接口。
2、通过USB连接线将行空板连接到计算机。
2、软件编写
第一步:打开Mind+,远程连接行空板
第二步:在“行空板的文件”中找到名为AI的文件夹,在其中新建一个名为“基于行空板的mediapipe人脸检测面部网格绘制”的文件夹,导入本节课的依赖安装包和文件。
第三步:编写程序
在上述图片和模型文件的同级目录下新建一个项目文件,并命名为“main.py”。
示例程序:
import cv2 # 导入OpenCV库,这是一个实现了许多常见图像处理任务的强大开源库
import mediapipe as mp # 导入MediaPipe库,这是一个开源的跨平台的应用于机器学习推断的库,特别适用于视频和图像处理
mp_drawing = mp.solutions.drawing_utils # 导入MediaPipe的绘图实用程序
mp_drawing_styles = mp.solutions.drawing_styles # 导入MediaPipe的绘图风格
mp_face_mesh = mp.solutions.face_mesh # 导入MediaPipe的面部网格模型
# 设置绘图规格
drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1)
# 开启摄像头
cap = cv2.VideoCapture(0)
# 设置摄像头的分辨率
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
# 设置缓冲区大小
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
# 设置窗口属性,全屏显示
cv2.namedWindow('MediaPipe Face Mesh', cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty('MediaPipe Face Mesh', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
# 使用MediaPipe的面部网格模型
with mp_face_mesh.FaceMesh(max_num_faces=1, refine_landmarks=True, min_detection_confidence=0.5, min_tracking_confidence=0.5) as face_mesh:
# 持续从摄像头捕获视频帧,直到窗口被关闭
while cap.isOpened():
# 从摄像头读取一帧
success, image = cap.read()
# 如果未成功读取帧,则跳过此循环,并继续下一个循环
if not success:
print("Ignoring empty camera frame.")
continue
# 标记图像为只读,以提高性能
image.flags.writeable = False
# 将图像从BGR格式转换为RGB格式
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 使用面部网格模型处理图像
results = face_mesh.process(image)
# 将图像标记为可写
image.flags.writeable = True
# 将图像从RGB格式转换回BGR格式
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
# 如果检测到面部
if results.multi_face_landmarks:
# 对每个检测到的面部进行处理
for face_landmarks in results.multi_face_landmarks:
# 绘制面部网格
mp_drawing.draw_landmarks(image=image, landmark_list=face_landmarks, connections=mp_face_mesh.FACEMESH_TESSELATION, landmark_drawing_spec=None, connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style())
mp_drawing.draw_landmarks(image=image, landmark_list=face_landmarks, connections=mp_face_mesh.FACEMESH_CONTOURS, landmark_drawing_spec=None, connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_contours_style())
mp_drawing.draw_landmarks(image=image, landmark_list=face_landmarks, connections=mp_face_mesh.FACEMESH_IRISES, landmark_drawing_spec=None, connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_iris_connections_style())
# 旋转图像
image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)
# 显示图像
cv2.imshow('MediaPipe Face Mesh', cv2.flip(image, 1))
# 如果按下ESC键,则退出循环
if cv2.waitKey(5) & 0xFF == 27:
break
# 释放摄像头
cap.release()
运行调试
第一步:运行“1-Install_dependency.py”程序文件,等待自动安装依赖包,完成示意图如下。
第二步:运行主程序
运行“main.py”程序,可以看到初始时屏幕上显示着摄像头拍摄到的实时画面,将摄像头画面对准人脸,可以看到人脸的面部被检测了出来并贴上了一张网格。
4、程序解析
在上述的“main.py”文件中,我们主要通过opencv库来调用摄像头,获取实时视频流,然后借助MediaPipe的Face Mesh模型对每一帧图像进行面部检测并绘制网格。整体流程如下,
① 导入必要的库:首先,程序导入了OpenCV库(用于图像处理和摄像头控制),以及MediaPipe库(用于机器学习模型的推断)。
② 设置绘图规格:程序定义了一个DrawingSpec对象,用于指定绘制面部网格时的线条粗细和圆圈半径。
③ 开启摄像头:程序使用cv2.VideoCapture(0)打开摄像头,并获取一个视频捕获对象。
④ 设置摄像头参数:程序设置了摄像头的分辨率和缓冲区大小。
⑤ 创建全屏窗口:程序创建了一个全屏的窗口,用于显示处理后的图像。
⑥ 创建FaceMesh对象:程序中创建了一个FaceMesh对象,用于面部网格的检测。
⑦ 处理摄像头的视频流:程序进入一个无限循环,不断地从摄像头读取图像,然后使用FaceMesh对象对图像进行处理。如果检测到面部,就在图像上绘制网格。然后,将处理后的图像显示在前面创建的窗口中。
⑧ 等待用户操作:程序会检测用户是否按下了ESC键,如果按下了ESC键,就跳出循环,释放摄像头,然后结束程序。
五、知识园地
1.了解MediaPipe的Face Mesh模型
Face Mesh是一个跨平台的、实时的面部网格模型。它基于机器学习,能够从图像或视频中检测并跟踪468个面部关键点,包括眼睛、嘴巴、鼻子、脸颊、下巴等区域。这些关键点共同构成了面部的一个详细的三维网格,可以用于面部表情的识别、面部形状的估计等各种应用。
MediaPipe的Face Mesh模型是一个基于深度学习的模型,它使用了一个名为BlazeFace的面部检测模型来首先定位面部,然后使用一个名为Face Landmark的模型来预测面部上的468个关键点。这些关键点被映射到面部的3D空间,形成了一个详细的面部网格。
附录
附录1:素材及拓展程序链接
链接:https://pan.baidu.com/s/1huEh3dftTZ_QD6nga9Kzsw?pwd=m062
评论