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

在實際項目中,尤其是涉及人臉識別、換臉、圖像修復等任務時,我們經常需要生成人臉區域的掩膜(mask)。這篇文章分享一個簡單易用的小工具,利用 MediaPipe 和 OpenCV,快速提取人臉輪廓并生成二值掩膜圖像。

下面是完整代碼,配合詳細講解,適合初學者和需要快速上手的小伙伴!

環境準備

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

pip install opencv-python mediapipe pillow numpy

核心代碼

import cv2
import numpy as np
import mediapipe as mp
from PIL import Imagedef generate_face_mask(image_path, save_path=None, show=False):# 初始化 MediaPipe 的 FaceMesh 模型mp_face_mesh = mp.solutions.face_meshface_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))# 初始化黑色背景的 maskmask = 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)# 可選:展示生成的 maskif 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 區域單獨提取。

希望這篇分享能幫到你,動手試試看吧!👍

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79387.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79387.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79387.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【動態導通電阻】GaN功率器件中動態導通電阻退化的機制、表征及建模方法

2019年,浙江大學的Shu Yang等人在《IEEE Journal of Emerging and Selected Topics in Power Electronics》上發表了一篇關于GaN(氮化鎵)功率器件動態導通電阻(Dynamic On-Resistance, RON)的研究論文。該文深入探討了GaN功率器件中動態導通電阻退化的機制、表征方法、建模…

從括號匹配看棧:數據結構入門的實戰與原理

在計算機科學的世界里,數據結構是程序員的 “瑞士軍刀”,不同的數據結構適用于不同的場景,能高效解決各類問題。其中,棧作為一種簡單卻強大的數據結構,在很多實際應用中發揮著關鍵作用。今天,我們就通過一個…

Dubbo(89)如何設計一個支持多語言的Dubbo服務?

設計一個支持多語言的Dubbo服務需要考慮以下幾個方面: 服務接口設計:確保服務接口的定義可以被不同語言實現。序列化協議:選擇一個支持多語言的序列化協議,例如Protobuf、Thrift、gRPC等。服務注冊與發現:確保服務注冊…

力扣面試150題--分隔鏈表

day 39 題目描述 思路 遍歷鏈表,每一個點與值比較,比值小就繼續,比值大就放到鏈表尾部即可 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int…

VSCode 查看文件的本地修改歷史

1. 使用時間線視圖(Timeline) 新版 VSCode 內置了一個叫 Timeline(時間線) 的功能,可以查看: 本地文件修改記錄(包括保存歷史)Git 提交歷史(如果倉庫是 Git 管理的&…

C++學習-入門到精通-【3】控制語句、賦值、自增和自減運算符

C學習-入門到精通-【3】控制語句、賦值、自增和自減運算符 控制語句、賦值、自增和自減運算符 C學習-入門到精通-【3】控制語句、賦值、自增和自減運算符一、什么是算法二、偽代碼三、控制結構順序結構選擇結構if語句if...else語句switch語句 循環結構while語句 四、算法詳述&a…

父子組件雙向綁定

v-model 語法糖實現 vue中我們在input中可以直接使用v-model來完成雙向綁定,這個時候 v-model 通常會幫我們完成兩件事: v-bind:value的數據綁定@input的事件監聽如果我們現在封裝了一個組件,其他地方在使用這個組件時,是否也可以使用v-model來同時完成這兩個功能呢? 當我…

用Selenium開啟自動化網頁交互與數據抓取之旅

用Selenium開啟自動化網頁交互與數據抓取之旅 在當今數字化時代,數據的價值不言而喻,而網頁作為海量數據的重要載體,如何高效獲取其中的關鍵信息成為眾多開發者和數據愛好者關注的焦點。Selenium這一強大工具,為我們打開了自動化…

VB.net序列化和反序列化的使用方法和實用場景

引言 相信很多初學編程的人都會提出過這個疑問:“既然我的變量可以存在內存之中,那么是否也可以存在硬盤之中呢” 其實我想回答的是,完全可以而且方法不止一種,而今天講的是序列化最經典的——二進制序列化 由于序列化的部分已…

Android OTA

一、OTA運行原理 Android 平臺提供 Google diff arithmetic 差分機制,升級包支持完整升級以及差分升級,OTA 運行原理圖如下所示。 1. OTA Server 負責對更新包進行上傳,下載以及版本的管理。 2. 開發者在修改 Android 系統后,通…

Untiy基礎學習(三)Untiy中編寫腳本的基本規則

一、怎么創建腳本 在Project窗口下,右鍵Create C#Script 即可創建腳本 創建腳本的注意事項 : 1)類名和文件名必須一致,不然不能掛載(因為反射機制創建對象,會通過文件名去找Type) 2)沒有特殊需…

VBA宏即根據第一列的內容和第二列的數字,按照數字數量生成對應內容并依次放在第三列、第四列等

打開你的 Excel 工作表。按下 Alt F11 組合鍵,打開 VBA 編輯器。在 VBA 編輯器中,點擊 插入 -> 模塊。在模塊窗口中,輸入以下 VBA 代碼: Sub GenerateItems()Dim lastRow As LongDim i As Long, j As LongDim item As String…

深度學習系統學習系列【1】之基本知識

文章目錄 說明基礎知識人工智能、機器學習、深度學習的關系機器學習傳統機器學習的缺陷選擇深度學習的原因深度學習的關鍵問題深度學習的應用深度學習的加速硬件GPU環境搭建主流深度學習框架對比 說明 文章屬于個人學習筆記內容,僅供學習和交流。內容參考深度學習原…

論文筆記-基于多層感知器(MLP)的多變量橋式起重機自適應安全制動與距離預測

《IET Cyber-Systems and Robotics》出版山東大學 Tenglong Zhang 和 Guoliang Liu 團隊的研究成果,文章題為“Adaptive Safe Braking and Distance Prediction for Overhead Cranes With Multivariation Using MLP”。 摘要 橋式起重機的緊急制動及其制動距離預測是…

DeepSeek實戰--各版本對比

1.對比 版本參數量優勢劣勢使用場景競品DeepSeek-V36710億(MoE架構,激活370億)開源、高效推理(60 TPS)、低成本(API費用低)、中文處理能力突出(90%準確率多模態能力有限通用任務&am…

從0開始建立Github個人博客(hugoPaperMod)

從0開始建立Github個人博客(hugo&PaperMod) github提供給每個用戶一個網址,用戶可以建立自己的靜態網站。 一、Hugo hugo是一個快速搭建網站的工具,由go語言編寫。 1.安裝hugo 到hugo的github標簽頁Tags gohugoio/hugo選擇一個版本&#xff0c…

【AI論文】WebThinker:賦予大型推理模型深度研究能力

摘要:大型推理模型(LRMs),如OpenAI-o1和DeepSeek-R1,展示了令人印象深刻的長期推理能力。 然而,他們對靜態內部知識的依賴限制了他們在復雜的知識密集型任務上的表現,并阻礙了他們生成需要綜合各…

Linux_sudo命令的使用與機制

1、sudo命令的作用 sudo(全稱 superuser do)是 Linux/Unix 系統中權限管理的核心工具。 允許普通用戶在授權下以其他用戶(默認是 root)的權限執行命令,而無需直接登錄賬戶。 2、sudo命令的典型使用場景 sudo 覆蓋了系…

Scrapy框架之 中間件的使用

爬蟲中間件 特點:主要處理蜘蛛(Spider)和下載器(Downloader)之間的請求和響應。可以對蜘蛛生成的請求進行攔截、修改或過濾,也可以對下載器返回給蜘蛛的響應進行處理。適用場景: 請求過濾與修改…

供應鏈算法整理(一)--- 銷量預估

在供應鏈管理領域有較多的預估場景,例如送達時長預估、銷量預估、用電量預估。特別的在智能供應鏈領域,銷量和庫存的管理的智能化也依賴銷量預估,因此在本文我們整理了 銷量預估的算法詳細的技術方案。 時間序列預測在最近兩年內發生了巨大的…