回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

基于行空板的mediapipe人脸检测面部网格绘制 简单

头像 木子呢 2024.04.25 28 0

一、实践目标

本项目在行空板上外接USB摄像头,通过摄像头来检测人脸的面部,并在其上绘制网格。

 

二、知识目标
1、学习使用MediaPipe的Face Mesh模型进行面部网格绘制的方法。


三、实践准备

 

硬件清单:
文字文稿1_01.jpg

软件使用:Mind+编程软件x1

 

四、实践过程


1、硬件搭建


将摄像头接入行空板的USB接口。

image.png

2、通过USB连接线将行空板连接到计算机。

image.png

2、软件编写

 

第一步:打开Mind+,远程连接行空板

image.png

第二步:在“行空板的文件”中找到名为AI的文件夹,在其中新建一个名为“基于行空板的mediapipe人脸检测面部网格绘制”的文件夹,导入本节课的依赖安装包和文件。

image.png

第三步:编写程序

在上述图片和模型文件的同级目录下新建一个项目文件,并命名为“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”程序文件,等待自动安装依赖包,完成示意图如下。

image.png

第二步:运行主程序
运行“main.py”程序,可以看到初始时屏幕上显示着摄像头拍摄到的实时画面,将摄像头画面对准人脸,可以看到人脸的面部被检测了出来并贴上了一张网格。

image.png
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 
 

评论

user-avatar