personal_color / modules /visualize_donut.py
turnning2025's picture
1128_first_uploading
d562845 verified
Raw
History Blame Contribute Delete
2.18 kB
import cv2
import numpy as np
from pathlib import Path
def append_face_to_donut(face_image_path, donut_image_path, save_path="face_in_donut.jpg", scale=1.0):
"""
์–ผ๊ตด ์ด๋ฏธ์ง€๋ฅผ ๋„๋„› ์ค‘์•™ ๋นˆ ๊ณต๊ฐ„์— ๋ฐฐ์น˜ํ•˜์—ฌ ํ•ฉ์„ฑ
face_image_path: ์–ผ๊ตด ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ
donut_image_path: ๋„๋„› ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ (ํˆฌ๋ช… ๋ฐฐ๊ฒฝ PNG ๊ถŒ์žฅ)
scale: ๋„๋„› ์ด๋ฏธ์ง€ ์ „์ฒด ํฌ๊ธฐ ์กฐ์ ˆ ๋น„์œจ
"""
# ์–ผ๊ตด ์ด๋ฏธ์ง€ ์ฝ๊ธฐ
face_img = cv2.imread(str(face_image_path))
if face_img is None:
raise FileNotFoundError(f"์–ผ๊ตด ์ด๋ฏธ์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ: {face_image_path}")
# ๋„๋„› ์ด๋ฏธ์ง€ ์ฝ๊ธฐ (์•ŒํŒŒ ์ฑ„๋„ ํฌํ•จ)
donut_img = cv2.imread(str(donut_image_path), cv2.IMREAD_UNCHANGED)
if donut_img is None:
raise FileNotFoundError(f"๋„๋„› ์ด๋ฏธ์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ: {donut_image_path}")
# ๋„๋„› ์•ŒํŒŒ ์ฑ„๋„ ๋ถ„๋ฆฌ
if donut_img.shape[2] == 4:
alpha_donut = donut_img[:, :, 3] / 255.0
donut_bgr = cv2.cvtColor(donut_img, cv2.COLOR_BGRA2BGR)
else:
alpha_donut = None
donut_bgr = donut_img
# ๋„๋„› ํฌ๊ธฐ ์กฐ์ ˆ
h_d, w_d = donut_bgr.shape[:2]
new_w = int(w_d * scale)
new_h = int(h_d * scale)
donut_resized = cv2.resize(donut_bgr, (new_w, new_h))
if alpha_donut is not None:
alpha_resized = cv2.resize(alpha_donut, (new_w, new_h))
else:
alpha_resized = None
# ์–ผ๊ตด ์ด๋ฏธ์ง€ ๋„๋„› ์ค‘์•™ ๊ตฌ๋ฉ ํฌ๊ธฐ์— ๋งž๊ฒŒ ์กฐ์ •
# ๋„๋„› ๊ตฌ๋ฉ ํฌ๊ธฐ๋Š” ๋„๋„› ์„ธ๋กœ ํฌ๊ธฐ์˜ ์•ฝ 50% ์ •๋„๋กœ ๊ฐ€์ •
hole_diameter = int(new_h * 0.5)
face_resized = cv2.resize(face_img, (hole_diameter, hole_diameter))
# ์–ผ๊ตด ํ•ฉ์„ฑ ์ขŒํ‘œ
y_offset = new_h // 2 - hole_diameter // 2
x_offset = new_w // 2 - hole_diameter // 2
# ํ•ฉ์„ฑ
combined = donut_resized.copy()
face_h, face_w = face_resized.shape[:2]
# ๋‹จ์ˆœ ์˜ค๋ฒ„๋ ˆ์ด (alpha blending optional)
combined[y_offset:y_offset+face_h, x_offset:x_offset+face_w] = face_resized
# ์ €์žฅ
cv2.imwrite(save_path, combined)
print(f"์–ผ๊ตด ํ•ฉ์„ฑ ๋„๋„› ์ด๋ฏธ์ง€ ์ €์žฅ ์™„๋ฃŒ โ†’ {save_path}")
return save_path