def main(in_img_path): rgb_img = cv2.imread(in_img_path) overlay_img = cv2.imread(OVERLAY_IMG_PATH, -1) cascade = cv2.CascadeClassifier(CASCADE_PATH) faces = cascade.detectMultiScale(cv2.cvtColor(rgb_img, cv2.COLOR_BGR2GRAY), scaleFactor=1.1, minNeighbors=1, minSize=(1, 1)) if len(faces) <= 0: return for (x, y, w, h) in faces: face_img = rgb_img[y:y + h, x:x + w] check_img(face_img, 'face_img', CHECK_IMG_FLAG, OUT_IMG_PATH) if not is_skin(face_img): continue alpha_channel = get_alphachannel(face_img) check_img(alpha_channel, 'alpha_channel', CHECK_IMG_FLAG, OUT_IMG_PATH) alpha_channel = fill_void(alpha_channel) resized_overlay_img = cv2.resize(overlay_img, tuple((w, h))) mask_img = cv2.bitwise_and(resized_overlay_img, resized_overlay_img, mask=alpha_channel) check_img(mask_img, 'mask_img', CHECK_IMG_FLAG, OUT_IMG_PATH) for i, j in [(i, j) for i in range(h) for j in range(w)]: if any(mask_img[i, j]): rgb_img[y + i, x + j] = mask_img[i, j] check_img(rgb_img, 'total', CHECK_IMG_FLAG, OUT_IMG_PATH)
def main(in_img_path): rgb_img = cv2.imread(in_img_path) overlay_img = cv2.imread(OVERLAY_IMG_PATH, -1) cascade = cv2.CascadeClassifier(CASCADE_PATH) faces = cascade.detectMultiScale(cv2.cvtColor(rgb_img, cv2.COLOR_BGR2GRAY), scaleFactor=1.1, minNeighbors=1, minSize=(1, 1)) if len(faces) <= 0: check_img(rgb_img, 'total', True, OUT_IMG_PATH) return for (x, y, w, h) in faces: face_img = rgb_img[y:y + h, x:x + w] if not is_skin(face_img): continue # color = hsv_to_bgr(get_hair_color_hsv(face_img)) name, hsv = detect_aikatsu_charactors['anime_based']['bgr_diff']( get_hair_color_hsv(face_img)) color = hsv_to_bgr(hsv) cv2.rectangle(rgb_img, (x, y), (x + w, y + h), color, thickness=7) check_img(rgb_img, 'total', True, OUT_IMG_PATH)
def main(in_img_path): rgb_img = cv2.imread(in_img_path) overlay_img = cv2.imread(OVERLAY_IMG_PATH, -1) cascade = cv2.CascadeClassifier(CASCADE_PATH) faces = cascade.detectMultiScale(cv2.cvtColor(rgb_img, cv2.COLOR_BGR2GRAY), scaleFactor=1.1, minNeighbors=1, minSize=(1, 1)) if len(faces) <= 0: check_img(rgb_img, 'total', True, OUT_IMG_PATH) return for (x, y, w, h) in faces: face_img = rgb_img[y:y + h, x:x + w] if not is_skin(face_img): continue # color = hsv_to_bgr(get_hair_color_hsv(face_img)) name, hsv = detect_aikatsu_charactors['anime_based']['bgr_diff'](get_hair_color_hsv(face_img)) color = hsv_to_bgr(hsv) cv2.rectangle(rgb_img, (x, y), (x + w, y + h), color, thickness=7) check_img(rgb_img, 'total', True, OUT_IMG_PATH)
def overlay(faces, rgb_img, cascade): if len(faces) <= 0: return rgb_img for (x, y, w, h) in faces: face_img = rgb_img[y:y + h, x:x + w] # if w < 40: # continue if not is_skin(face_img): continue overlay_img = switch_overlay_img(face_img) resized_overlay_img = cv2.resize(overlay_img, tuple((w, h))) # alpha_channel = fill_void(get_alphachannel(face_img)) # mask_img = cv2.bitwise_and(resized_overlay_img, resized_overlay_img, # mask=alpha_channel) mask_img = overlay_img for i, j in [(i, j) for i in range(h) for j in range(w)]: if any(mask_img[i, j]): rgb_img[y + i, x + j] = mask_img[i, j] return rgb_img