使用 MediaPipe 和 OpenCV 快速生成人脸掩膜(Face Mask)

在实际项目中,尤其是涉及人脸识别、换脸、图像修复等任务时,我们经常需要生成人脸区域的掩膜(mask) 。这篇文章分享一个简单易用的小工具,利用 MediaPipe 和 OpenCV,快速提取人脸轮廓并生成二值掩膜图像。

下面是完整代码,配合详细讲解,适合初学者和需要快速上手的小伙伴!

环境准备

首先,需要安装以下 Python 库(如果尚未安装,可以用 pip 安装):

bash 复制代码
pip install opencv-python mediapipe pillow numpy

核心代码

python 复制代码
import cv2
import numpy as np
import mediapipe as mp
from PIL import Image

def generate_face_mask(image_path, save_path=None, show=False):
    # 初始化 MediaPipe 的 FaceMesh 模型
    mp_face_mesh = mp.solutions.face_mesh
    face_mesh = mp_face_mesh.FaceMesh(static_image_mode=True, refine_landmarks=True)

    # 读取图像
    img = cv2.imread(image_path)
    h, w, _ = img.shape

    # 人脸检测与关键点提取
    results = face_mesh.process(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

    # 初始化黑色背景的 mask
    mask = np.zeros((h, w), dtype=np.uint8)

    # 如果检测到人脸
    if results.multi_face_landmarks:
        for face_landmarks in results.multi_face_landmarks:
            # 获取人脸关键点坐标
            points = [(int(p.x * w), int(p.y * h)) for p in face_landmarks.landmark]
            # 使用凸包(convex hull)拟合整个脸部区域
            hull = cv2.convexHull(np.array(points))
            # 将凸包区域填充为白色
            cv2.fillConvexPoly(mask, hull, 255)

    # 可选:展示生成的 mask
    if show:
        cv2.imshow("Mask", mask)
        cv2.waitKey(0)

    # 保存 mask 到本地
    if save_path:
        cv2.imwrite(save_path, mask)

    return mask

# 使用示例
generate_face_mask(
    image_path="face.png",  # 替换为你的图像路径
    save_path="face_mask.png",
    # show=True  # 如果想看效果可以打开
)

代码讲解

  • MediaPipe FaceMesh

    • MediaPipe 提供了轻量级的人脸关键点检测(共468个关键点),非常适合快速处理。
    • refine_landmarks=True 参数会进一步优化面部区域,如眼睛轮廓、嘴唇轮廓。
  • 提取关键点并绘制凸包(Convex Hull)

    • 为了保证 mask 的完整性,不直接用单个关键点连线,而是用 OpenCV 的 convexHull 函数,将人脸外围自动拟合成一个封闭轮廓。
    • 这样能确保 mask 覆盖整个脸部,即便脸部角度有倾斜或旋转。
  • 保存掩膜(mask)

    • 最后生成的是一张黑白二值图,白色部分为人脸区域,黑色为背景,非常适合后续做图像分割、融合等任务。

效果示例

输入图片:

生成的人脸掩膜:

应用场景

  • 换脸(Face Swap):掩膜用于融合不同人脸区域。
  • 肖像图像处理:美颜、磨皮、特效。
  • 图像修复(Inpainting):只修复人脸区域,背景保持不变。
  • 身份保护:打码或模糊特定人脸区域。

小结

这个方法虽然简单,但实用性非常高,适用于各种需要人脸掩膜的小项目。如果需要更精细的面部特征(比如眼睛、嘴巴分开处理),还可以在此基础上扩展 ------ 例如结合不同 landmark 区域单独提取。

希望这篇分享能帮到你,动手试试看吧!👍

相关推荐
To_OC6 小时前
大模型蒸馏是啥?说白了就是大厨带徒弟的学问
人工智能·llm·agent
新手来了@click6 小时前
JAVA+AI 简化开发操作|文章被 AI Agent 技术社区收录分享
人工智能
GuWenyue7 小时前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%
前端·数据库·人工智能
GuWenyue7 小时前
传统Agent工具两大痛点!300行代码落地MCP跨语言工具,彻底解耦LLM与工具
前端·人工智能·算法
老云讲算力市场7 小时前
WAIC首日观察:国产算力与机器人加速落地,奇点算力迎来产业新机遇
人工智能·科技
糖果店的幽灵7 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
小林ixn7 小时前
大模型随机说话的秘密:Temperature 和 Top K 深度解析,LangChain 实战调优
人工智能·langchain
ALINX技术博客7 小时前
ALINX 亮相 2026 WAIC 世界人工智能大会,展示 AI 视觉 FPGA+GPU 异构计算与电子后视镜解决方案
人工智能·ai·fpga·世界人工智能大会·电子后视镜
程序员老猫8 小时前
当 AI 能写 80% 的代码时,后端工程师的核心价值还剩什么?
人工智能
想会飞的蒲公英8 小时前
计算机怎样读取中文文本:编码、清洗与标准化
人工智能·python·自然语言处理