Фильтр бороды на лице в OpenCV? - PullRequest
0 голосов
/ 14 октября 2019

Я хочу поставить бороду на лицо в opencv python. Но не могу получить желаемую область от лица.

Мой код -:

import cv2

faceCascade = cv2.CascadeClassifier("cascades/frontalface_default.xml")

imgBeard = cv2.imread('filters/beard.png', -1)

orig_mask = imgBeard[:, :, 3]
orig_mask_inv = cv2.bitwise_not(orig_mask)

imgBeard = imgBeard[:, :, 0:3]
origBeardHeight, origBeardWidth = imgBeard.shape[:2]

video_capture = cv2.VideoCapture(0)

while True:
    ret, frame = video_capture.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30, 30),
        flags=cv2.CASCADE_SCALE_IMAGE
    )

    for (x, y, w, h) in faces:
        # Un-comment the next line for debug (draw box around all faces)
        # face = cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)

        face_w = w
        face_h = h
        face_x1 = x
        face_x2 = face_x1 + face_h
        face_y1 = y
        face_y2 = face_y1 + face_h

        roi_gray = gray[y:y + h, x:x + w]
        roi_color = frame[y:y + h, x:x + w]

        beardWidth = roi_color.shape[1]
        beardHeight = int(beardWidth * origBeardHeight/origBeardWidth)

        beard_x1 = face_x1 + 10
        beard_x2 = beard_x1 + (beardWidth - 10)
        beard_y1 = face_y1 + int(face_y1/2)
        beard_y2 = face_y2

        if beard_x1 < 0:
            beard_x1 = 0
        if beard_y1 < 0:
            beard_y1 = 0
        if beard_x2 > origBeardWidth:
            beard_x2 = origBeardWidth
        if beard_y2 > origBeardHeight:
            beard_y2 = origBeardHeight

        beardWidth = beard_x2 - beard_x1
        beardHeight = beard_y2 - beard_y1
        if beardWidth < 0 or beardHeight < 0:
            continue

        beard = cv2.resize(imgBeard, (beardWidth,beardHeight), interpolation=cv2.INTER_AREA)
        mask = cv2.resize(orig_mask, (beardWidth, beardHeight), interpolation=cv2.INTER_AREA)
        mask_inv = cv2.resize(orig_mask_inv, (beardWidth, beardHeight), interpolation=cv2.INTER_AREA)

        roi = roi_color[beard_y1:beard_y2, beard_x1:beard_x2]

        roi_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
        roi_fg = cv2.bitwise_and(beard, beard, mask=mask)
        dst = cv2.add(roi_bg, roi_fg)
        frame[beard_y1:beard_y2, beard_x1:beard_x2] = dst

        break

    cv2.imshow('Video', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

video_capture.release()
cv2.destroyAllWindows()

Вот ошибка, которую я получаю -:

Traceback (most recent call last):
  File "C:/Users/Shubham/PycharmProjects/MachineLearning/My Codes/FaceFilter/beardFilter.py", line 77, in <module>
    roi_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
cv2.error: OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\core\src\arithm.cpp:245: error: (-215:Assertion failed) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1) in function 'cv::binary_op'

[ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback

МойФильтр для бороды (PNG): - Фильтр для бороды

ПРИМЕЧАНИЕ -: Пожалуйста, кто-нибудь поможет мне в этом, это больше недели. Я пытаюсь создать свою собственную программу faceFilter, которая будет накладывать различные фильтры на лицо, такие как характеристики, борода, усы и т. Д. Кроме того, приведу несколько советов о том, как извлечь нужную область из лица для фильтров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...