close

這是一個關於如何使用OpenCV和DLIB在圖像上應用虛擬唇膏的快速教程。同樣的原理也可以推廣到其他面部特徵,比如某人的眼睛、鼻子、下巴……。
為了獲得上圖所示的結果,我們需要執行以下一系列步驟:
檢測面部標誌
使用由嘴標誌組成的凸多邊形創建掩碼
使用形態學操作增強掩碼,並使其模糊,以獲得更好的混合效果
隔離嘴唇和臉部
將顏色變換應用於嘴唇
把嘴唇和臉放在一起
首先要做的是檢測人臉的面部標誌。庫Dlib提供了一種方便的方法來實現這一點;但是,請記住,被攝對象的面部需要面對攝影機。如果頭部姿勢不正確,檢測結果將不好。
在這個例子中,我們只對嘴唇的點感興趣。下圖顯示了Dlib返回的面部標誌點的索引。如你所見,我們對48點到60點(嘴唇的外部「輪廓」)感興趣。
利用這些點,我們可以製作一個掩碼,讓我們在不影響面部整體外觀的情況下處理嘴唇的顏色。
但是,等一下。在開始操作這些顏色之前,我們需要改進掩碼。在這個例子中,一個帶有4x4矩形內核的形態學閉合操作就足夠了。
注意下面的圖片,這個步驟填補了由cv2生成的原始多邊形右上角的一個空白。
右:使用唇部創建的凸多邊形/左:關閉操作後的多邊形
為了獲得自然的效果,我們還需要模糊掩碼。模糊掩碼將產生更好的混合效果。我們將cv2.GaussianBlur應用於掩碼。最後,我們反轉掩碼(我們需要兩個,一個用於嘴唇,一個用於面部)。
右:模糊掩碼/左:模糊反向掩碼
我們將應用這些掩碼,方法是將它們從0–255(uint8)轉換為0–1(float)範圍,然後將它們與圖像相乘。右下方的圖像是原始圖像乘以反轉掩碼。左側的圖像是原始圖像上的顏色變換乘以掩碼的結果。顏色變換由cv2.applyColorMap(im, cv2.COLORMAP_INFERNO)給出。
右:原始圖像和反向模糊掩碼的位與運算/左:顏色變換圖像和模糊掩碼的位與運算
現在,剩下要做的就是將這兩個圖像相加。
右:原始圖像/左:結果圖像
這是代碼。
importcv2importdlibimportfaceBlendCommonasfaceimportnumpyasnp#加載圖像im=cv2.imread("cv2/girl-no-makeup.jpg")#檢測人臉關鍵點PREDICTOR_PATH=r"C:\Users\felipe.cunha\Documents\venv\cv2\week1-pyton\data\models\shape_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)#應用閉合操作改善掩碼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)#將掩碼轉換為浮點以執行混合mask=mask.astype(float)/255inverseMask=inverseMask.astype(float)/255#為嘴唇應用顏色貼圖lips=cv2.applyColorMap(im,cv2.COLORMAP_INFERNO)#將嘴唇和人臉轉換為0-1範圍lips=lips.astype(float)/255ladyFace=im.astype(float)/255#用掩碼調整嘴唇和臉justLips=cv2.multiply(mask,lips)justFace=cv2.multiply(inverseMask,ladyFace)#加上臉和嘴唇result=justFace+justLips#顯示結果cv2.imshow("",result)cv2.waitKey(0)


☆ END ☆
如果看到這裡,說明你喜歡這篇文章,請轉發、點讚。微信搜索「uncle_pn」,歡迎添加小編微信「 woshicver」,每日朋友圈更新一篇高質量博文。
↓掃描二維碼添加小編↓

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()