實時面具覆蓋人臉小程序

實時面具覆蓋人臉小程序

        這個實時面具覆蓋人臉的小程序參考了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()

        處理結果的視頻截圖如下圖所示:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章