實時面具覆蓋人臉小程序
這個實時面具覆蓋人臉的小程序參考了http://datahonor.com/2017/05/18/實時視頻中面具覆蓋的實現/中的處理思路,在此基礎上做了一些改動,應用了python-opencv及其中的人臉識別模塊。
因爲這裏用到的人臉識別比較粗糙,返回的是一個包含臉部的矩形框,所以只能做到簡單的覆蓋,效果並不精細。
import cv2 as cv
import numpy as np
faceCascade = cv.CascadeClassifier('classify/haarcascade_frontalface_default.xml')
# 讀取面具圖像
faceMask = cv.imread("data/maskFace1.jpg")
# 打開攝像頭
cap = cv.VideoCapture(0)
# 開始處理圖像
while True:
ret, img = cap.read()
scalingFactor = 0.75
# 重置輸入圖像大小
frame = cv.resize(img,None,fx = scalingFactor, fy = scalingFactor, interpolation = cv.INTER_AREA)
# 彩色轉灰度圖像
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 直方圖均衡化
frameGray = cv.equalizeHist(gray)
# 檢測臉部,該函數在輸入圖像的不同尺度中檢測物體
faces = faceCascade.detectMultiScale(frameGray, 1.3, 5)
for i in range(0, len(faces)):
for (x1, y1, w1, h1) in faces:
# 自定義參數,使面具適合臉
x = x1 - int(0.1 * w1)
y = y1 - int(0.0 * h1)
w = int(1.1 * w1)
h = int(1.1 * h1)
try:
FaceMaskSmall = cv.resize(faceMask, (w, h), interpolation=cv.INTER_AREA)
# roi確定了面具所在人臉圖像上的位置
roi = frame[y: y+h, x: x+w]
# 面具圖轉換爲灰度圖
gray = cv.cvtColor(FaceMaskSmall, cv.COLOR_BGR2GRAY)
# 對面具圖閾值分割得到mask1,也就是面具圖的背景(0~50部分)
# 保留mask1部分的roi
ret, mask1 = cv.threshold(gray, 50, 255, cv.THRESH_BINARY_INV)
fg1 = cv.bitwise_and(roi, roi, mask=mask1)
# 對面具圖閾值分割得到面具的前景部分(50~255部分)
ret, mask2 = cv.threshold(gray, 50, 255, cv.THRESH_BINARY)
# 保留面具圖像的面具部分
fg2 = cv.bitwise_and(FaceMaskSmall, FaceMaskSmall, mask=mask2)
# 圖像疊加
roi[:] = cv.add(fg1, fg2)
except:
continue
# 設置退出循環條件
if cv.waitKey(1) & 0xFF == ord('q'):
break
cv.imshow("Frame", frame)
# 退出程序
cv.waitKey(0)
cap.release()
cv.destroyAllWindows()
處理結果的視頻截圖如下圖所示: