Я хочу поставить бороду на лицо в 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, которая будет накладывать различные фильтры на лицо, такие как характеристики, борода, усы и т. Д. Кроме того, приведу несколько советов о том, как извлечь нужную область из лица для фильтров.