如何使用OpenCV和DLIB在圖像上操作人臉?
這是一個(gè)關(guān)于如何使用OpenCV和DLIB在圖像上應(yīng)用虛擬唇膏的快速教程。同樣的原理也可以推廣到其他面部特征,比如某人的眼睛、鼻子、下巴……。為了獲得上圖所示的結(jié)果,我們需要執(zhí)行以下一系列步驟:檢測(cè)面部標(biāo)志使用由嘴標(biāo)志組成的凸多邊形創(chuàng)建掩碼使用形態(tài)學(xué)操作增強(qiáng)掩碼,并使其模糊,以獲得更好的混合效果隔離嘴唇和臉部將顏色變換應(yīng)用于嘴唇把嘴唇和臉放在一起首先要做的是檢測(cè)人臉的面部標(biāo)志。庫(kù)Dlib提供了一種方便的方法來實(shí)現(xiàn)這一點(diǎn);但是,請(qǐng)記住,被攝對(duì)象的面部需要面對(duì)攝影機(jī)。如果頭部姿勢(shì)不正確,檢測(cè)結(jié)果將不好。
在這個(gè)例子中,我們只對(duì)嘴唇的點(diǎn)感興趣。下圖顯示了Dlib返回的面部標(biāo)志點(diǎn)的索引。如你所見,我們對(duì)48點(diǎn)到60點(diǎn)(嘴唇的外部“輪廓”)感興趣。
利用這些點(diǎn),我們可以制作一個(gè)掩碼,讓我們?cè)诓挥绊懨娌空w外觀的情況下處理嘴唇的顏色。但是,等一下。在開始操作這些顏色之前,我們需要改進(jìn)掩碼。在這個(gè)例子中,一個(gè)帶有4x4矩形內(nèi)核的形態(tài)學(xué)閉合操作就足夠了。注意下面的圖片,這個(gè)步驟填補(bǔ)了由cv2生成的原始多邊形右上角的一個(gè)空白。右:使用唇部創(chuàng)建的凸多邊形/左:關(guān)閉操作后的多邊形
為了獲得自然的效果,我們還需要模糊掩碼。模糊掩碼將產(chǎn)生更好的混合效果。我們將cv2.GaussianBlur應(yīng)用于掩碼。最后,我們反轉(zhuǎn)掩碼(我們需要兩個(gè),一個(gè)用于嘴唇,一個(gè)用于面部)。右:模糊掩碼/左:模糊反向掩碼
我們將應(yīng)用這些掩碼,方法是將它們從0–255(uint8)轉(zhuǎn)換為0–1(float)范圍,然后將它們與圖像相乘。右下方的圖像是原始圖像乘以反轉(zhuǎn)掩碼。左側(cè)的圖像是原始圖像上的顏色變換乘以掩碼的結(jié)果。顏色變換由cv2.a(chǎn)pplyColorMap(im, cv2.COLORMAP_INFERNO)給出。右:原始圖像和反向模糊掩碼的位與運(yùn)算/左:顏色變換圖像和模糊掩碼的位與運(yùn)算
現(xiàn)在,剩下要做的就是將這兩個(gè)圖像相加。右:原始圖像/左:結(jié)果圖像
這是代碼。
import cv2
import dlib
import faceBlendCommon as face
import numpy as np
# 加載圖像
im = cv2.imread("cv2/girl-no-makeup.jpg")
# 檢測(cè)人臉關(guān)鍵點(diǎn)
PREDICTOR_PATH = r"C:Userselipe.cunhaDocumentsenvcv2week1-pytondatamodelsshape_predictor_68_face_landmarks.dat"
faceDetector = dlib.get_frontal_face_detector()
landmarkDetector = dlib.shape_predictor(PREDICTOR_PATH)
landmarks = face.getLandmarks(faceDetector, landmarkDetector, im)
# 為嘴唇制作一個(gè)掩碼
lipsPoints = landmarks[48:60]
mask = np.zeros((im.shape[0], im.shape[1], 3), dtype=np.float32)
cv2.fillConvexPoly(mask, np.int32(lipsPoints), (1.0, 1.0, 1.0))
mask = 255*np.uint8(mask)
# 應(yīng)用閉合操作改善掩碼
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (40,40))
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel, 1)
# 模糊掩碼以獲得自然效果
mask = cv2.GaussianBlur(mask,(15,15),cv2.BORDER_DEFAULT)
# 計(jì)算逆掩碼
inverseMask = cv2.bitwise_not(mask)
# 將掩碼轉(zhuǎn)換為浮點(diǎn)以執(zhí)行混合
mask = mask.a(chǎn)stype(float)/255
inverseMask = inverseMask.a(chǎn)stype(float)/255
# 為嘴唇應(yīng)用顏色貼圖
lips = cv2.a(chǎn)pplyColorMap(im, cv2.COLORMAP_INFERNO)
# 將嘴唇和人臉轉(zhuǎn)換為0-1范圍
lips = lips.a(chǎn)stype(float)/255
ladyFace = im.a(chǎn)stype(float)/255
# 用掩碼調(diào)整嘴唇和臉
justLips = cv2.multiply(mask, lips)
justFace = cv2.multiply(inverseMask, ladyFace)
# 加上臉和嘴唇
result = justFace + justLips
# 顯示結(jié)果
cv2.imshow("", result)
cv2.waitKey(0)
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
即日-12.26立即報(bào)名>>> 【在線會(huì)議】村田用于AR/VR設(shè)計(jì)開發(fā)解決方案
-
1月8日火熱報(bào)名中>> Allegro助力汽車電氣化和底盤解決方案優(yōu)化在線研討會(huì)
-
即日-1.14火熱報(bào)名中>> OFweek2025中國(guó)智造CIO在線峰會(huì)
-
即日-1.24立即參與>>> 【限時(shí)免費(fèi)】安森美:Treo 平臺(tái)帶來出色的精密模擬
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
-
精彩回顧立即查看>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
推薦專題
-
2
- 1 人形機(jī)器人核心零部件,誰是盈利最強(qiáng)企業(yè)?
- 2 AI Agent現(xiàn)狀如何?聊聊近期國(guó)內(nèi)的智能體市場(chǎng)動(dòng)向
- 3 5nm重大突破,研祥智能助力半導(dǎo)體企業(yè)高效發(fā)展!
- 4 人形機(jī)器人引爆“PEEK材料”!概念股梳理(名單)
- 5 馬云沒回牌桌,但重注全壓在了
- 6 7 豆包AI登頂國(guó)內(nèi)第一!概念股梳理(名單)
- 8 押注AI王者歸來,歌爾股份“智能體”在下一盤“大棋”
- 9 AI超級(jí)應(yīng)用什么時(shí)候才能出現(xiàn)?
- 10 英偉達(dá)迎來當(dāng)頭一棒
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容