訂閱
糾錯
加入自媒體

如何使用OpenCV和DLIB在圖像上操作人臉?

這是一個關(guān)于如何使用OpenCV和DLIB在圖像上應(yīng)用虛擬唇膏的快速教程。同樣的原理也可以推廣到其他面部特征,比如某人的眼睛、鼻子、下巴……。為了獲得上圖所示的結(jié)果,我們需要執(zhí)行以下一系列步驟:檢測面部標(biāo)志使用由嘴標(biāo)志組成的凸多邊形創(chuàng)建掩碼使用形態(tài)學(xué)操作增強掩碼,并使其模糊,以獲得更好的混合效果隔離嘴唇和臉部將顏色變換應(yīng)用于嘴唇把嘴唇和臉放在一起首先要做的是檢測人臉的面部標(biāo)志。庫Dlib提供了一種方便的方法來實現(xiàn)這一點;但是,請記住,被攝對象的面部需要面對攝影機。如果頭部姿勢不正確,檢測結(jié)果將不好。

在這個例子中,我們只對嘴唇的點感興趣。下圖顯示了Dlib返回的面部標(biāo)志點的索引。如你所見,我們對48點到60點(嘴唇的外部“輪廓”)感興趣。

利用這些點,我們可以制作一個掩碼,讓我們在不影響面部整體外觀的情況下處理嘴唇的顏色。但是,等一下。在開始操作這些顏色之前,我們需要改進掩碼。在這個例子中,一個帶有4x4矩形內(nèi)核的形態(tài)學(xué)閉合操作就足夠了。注意下面的圖片,這個步驟填補了由cv2生成的原始多邊形右上角的一個空白。右:使用唇部創(chuàng)建的凸多邊形/左:關(guān)閉操作后的多邊形

為了獲得自然的效果,我們還需要模糊掩碼。模糊掩碼將產(chǎn)生更好的混合效果。我們將cv2.GaussianBlur應(yīng)用于掩碼。最后,我們反轉(zhuǎn)掩碼(我們需要兩個,一個用于嘴唇,一個用于面部)。右:模糊掩碼/左:模糊反向掩碼

我們將應(yīng)用這些掩碼,方法是將它們從0–255(uint8)轉(zhuǎn)換為0–1(float)范圍,然后將它們與圖像相乘。右下方的圖像是原始圖像乘以反轉(zhuǎn)掩碼。左側(cè)的圖像是原始圖像上的顏色變換乘以掩碼的結(jié)果。顏色變換由cv2.a(chǎn)pplyColorMap(im, cv2.COLORMAP_INFERNO)給出。右:原始圖像和反向模糊掩碼的位與運算/左:顏色變換圖像和模糊掩碼的位與運算

現(xiàn)在,剩下要做的就是將這兩個圖像相加。右:原始圖像/左:結(jié)果圖像

這是代碼。

import cv2

import dlib

import faceBlendCommon as face

import numpy as np


# 加載圖像

im = cv2.imread("cv2/girl-no-makeup.jpg")


# 檢測人臉關(guān)鍵點

PREDICTOR_PATH = r"C:Users elipe.cunhaDocuments envcv2week1-pytondatamodelsshape_predictor_68_face_landmarks.dat"

faceDetector = dlib.get_frontal_face_detector()

landmarkDetector = dlib.shape_predictor(PREDICTOR_PATH)

landmarks = face.getLandmarks(faceDetector, landmarkDetector, im)


# 為嘴唇制作一個掩碼

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)


# 計算逆掩碼

inverseMask = cv2.bitwise_not(mask)


# 將掩碼轉(zhuǎ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)


聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標(biāo)題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號