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 func(hsv): bgr = hsv_to_bgr(hsv) min_name = '' min_bgr = (0, 0, 0) min_diff = 100000 for name, hair_bgr in ref_hair_color_map.items(): diff = np.sqrt(sum([(hair_bgr[0] - bgr[0]) ** 2, (hair_bgr[1] - bgr[1]) ** 2, (hair_bgr[2] - bgr[2]) ** 2])) if diff < min_diff: min_diff = diff min_bgr = hair_bgr min_name = name return min_name, bgr_to_hsv(min_bgr)
def func(hsv): bgr = hsv_to_bgr(hsv) min_name = '' min_bgr = (0, 0, 0) min_diff = 100000 for name, hair_bgr in ref_hair_color_map.items(): diff = np.sqrt( sum([(hair_bgr[0] - bgr[0])**2, (hair_bgr[1] - bgr[1])**2, (hair_bgr[2] - bgr[2])**2])) if diff < min_diff: min_diff = diff min_bgr = hair_bgr min_name = name return min_name, bgr_to_hsv(min_bgr)
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)
import cv2 from functions import get_hair_color_hsv, hsv_to_bgr # カスケード分類器の特徴量を取得する cascade_path = "../cascade/lbpcascade_animeface.xml" cascade = cv2.CascadeClassifier(cascade_path) overlay_img_path = "../test_imgs/face_up3.jpg" in_img_path = "../test_imgs/hirari-hitori-kirari/face_detecting5.png" out_img_path = "../test_imgs/hirari-hitori-kirari/face_detecting_out.png" img = cv2.imread(in_img_path) overlay_img = cv2.imread(overlay_img_path) color = (0, 187, 254) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1)) if len(faces) > 0: # 検出した顔を囲む矩形の作成 for (x, y, w, h) in faces: face_img = img[y:y + h, x:x + w] color = hsv_to_bgr(get_hair_color_hsv(face_img)) cv2.rectangle(img, (x, y), (x + w, y + h), color, thickness=7) # cv2.rectangle(img, (x, y), (x + w, y + h), color, thickness=7) # resized_overlay_img = cv2.resize(overlay_img, tuple((w, h))) # img[y:y + h, x:x + w] = resized_overlay_img[:, :] cv2.imwrite(out_img_path, img)