CheckAppVersion / test.py
Nagase-Kotono's picture
Upload test.py
a492cc4 verified
import cv2
import numpy as np
from moviepy.editor import VideoFileClip
from huggingface_hub import hf_hub_download
# 1. ๊ทธ๋ ˆ์ด์Šค์ผ€์ผ ๋ณ€ํ™˜
def grayscale(frame):
"""
๊ทธ๋ ˆ์ด์Šค์ผ€์ผ ๋ณ€ํ™˜ ํ•จ์ˆ˜.
์ž…๋ ฅ๋œ BGR ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋ ˆ์ด์Šค์ผ€์ผ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„ ๋‹ค์‹œ BGR๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ฐจ์›์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
"""
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
return cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR) # 2์ฐจ์›์„ 3์ฐจ์›์œผ๋กœ ๋ณ€ํ™˜
# 2. ๋„ค๊ฑฐํ‹ฐ๋ธŒ ์ด๋ฏธ์ง€ ๋ณ€ํ™˜
def negative(frame):
"""
๋„ค๊ฑฐํ‹ฐ๋ธŒ ๋ณ€ํ™˜ ํ•จ์ˆ˜.
์ž…๋ ฅ๋œ BGR ์ด๋ฏธ์ง€๋ฅผ ๋„ค๊ฑฐํ‹ฐ๋ธŒ ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค (์ƒ‰์ƒ ๋ฐ˜์ „).
"""
return cv2.bitwise_not(frame)
# 3. ์•ˆ์ •๋œ ๋ฐ๊ธฐ ์กฐ์ ˆ
def adjust_brightness(frame, value):
"""
๋ฐ๊ธฐ ์กฐ์ ˆ ํ•จ์ˆ˜.
์ž…๋ ฅ๋œ BGR ์ด๋ฏธ์ง€์—์„œ HSV๋กœ ๋ณ€ํ™˜ ํ›„, ๋ฐ๊ธฐ ์ฑ„๋„(v)์— value ๊ฐ’์„ ๋”ํ•ด ๋ฐ๊ธฐ๋ฅผ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.
value ๊ฐ’์€ ์Œ์ˆ˜๋ฉด ์–ด๋‘ก๊ฒŒ, ์–‘์ˆ˜๋ฉด ๋ฐ๊ฒŒ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.
"""
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # BGR -> HSV๋กœ ๋ณ€ํ™˜
h, s, v = cv2.split(hsv) # HSV๋กœ ๋ถ„๋ฆฌ
# v ์ฑ„๋„์— ๋ฐ๊ธฐ ์กฐ์ • ๊ฐ’ ์ถ”๊ฐ€, 0~255 ์‚ฌ์ด๋กœ ํด๋ฆฌํ•‘ํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ ์กฐ์ ˆ
v = np.clip(v.astype(np.int16) + value, 0, 255).astype(np.uint8)
# ๋‹ค์‹œ ํ•ฉ์ณ์„œ HSV -> BGR๋กœ ๋ณ€ํ™˜
final_hsv = cv2.merge((h, s, v))
return cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)
# 4. ์•ˆ์ •๋œ ๋Œ€๋น„ ์กฐ์ ˆ
def adjust_contrast(frame, alpha):
"""
๋Œ€๋น„ ์กฐ์ ˆ ํ•จ์ˆ˜.
์ž…๋ ฅ๋œ BGR ์ด๋ฏธ์ง€์—์„œ alpha ๊ฐ’์„ ๊ณฑํ•˜์—ฌ ๋Œ€๋น„๋ฅผ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.
alpha ๊ฐ’์ด ํด์ˆ˜๋ก ์ด๋ฏธ์ง€์˜ ๋Œ€๋น„๊ฐ€ ๊ฐ•ํ•ด์ง‘๋‹ˆ๋‹ค (1.0~3.0 ์ •๋„๊ฐ€ ์ ์ ˆ).
"""
adjusted = cv2.convertScaleAbs(frame, alpha=alpha, beta=0)
# ๋Œ€๋น„ ์กฐ์ • ํ›„ ๊ฐ’์ด 0~255 ๋ฒ”์œ„๋ฅผ ์œ ์ง€ํ•˜๋Š”์ง€ ํ™•์ธ (์ด๋ฏธ convertScaleAbs๊ฐ€ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ ์•ˆ์ •์„ฑ ์ถ”๊ฐ€)
return np.clip(adjusted, 0, 255)
# 5. ๋ธ”๋Ÿฌ๋ง
def blur_image(frame, kernel_size=5):
"""
๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ๋ง ํ•จ์ˆ˜.
์ž…๋ ฅ๋œ BGR ์ด๋ฏธ์ง€๋ฅผ ์ปค๋„ ํฌ๊ธฐ๋งŒํผ ํ๋ฆฌ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
kernel_size ๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ํ™€์ˆ˜์—ฌ์•ผ ํ•˜๋ฉฐ, ์ปค๋„ ํฌ๊ธฐ๊ฐ€ ํด์ˆ˜๋ก ๋” ํ๋ ค์ง‘๋‹ˆ๋‹ค.
"""
blurred = cv2.GaussianBlur(frame, (kernel_size, kernel_size), 0)
return blurred # BGR ์ฐจ์› ์œ ์ง€ (์ถ”๊ฐ€ ๋ณ€ํ™˜ ๋ถˆํ•„์š”)
# 6. ์—ฃ์ง€ ๊ฒ€์ถœ
def edge_detection(frame):
"""
์—ฃ์ง€ ๊ฒ€์ถœ ํ•จ์ˆ˜.
์ž…๋ ฅ๋œ BGR ์ด๋ฏธ์ง€์—์„œ ๊ทธ๋ ˆ์ด์Šค์ผ€์ผ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„ Sobel ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์—ฃ์ง€๋ฅผ ๊ฒ€์ถœํ•ฉ๋‹ˆ๋‹ค.
์ดํ›„, 2์ฐจ์›์œผ๋กœ ๋ณ€ํ™˜๋œ ์—ฃ์ง€ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์‹œ BGR 3์ฐจ์›์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
"""
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
sobelx = cv2.Sobel(gray_frame, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(gray_frame, cv2.CV_64F, 0, 1, ksize=5)
edges = cv2.magnitude(sobelx, sobely)
edges = np.uint8(edges) # 2์ฐจ์› ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜
return cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR) # ๋‹ค์‹œ 3์ฐจ์› BGR๋กœ ๋ณ€ํ™˜
# ํ•„ํ„ฐ๋ฅผ ์„ ํƒํ•ด์„œ ์ ์šฉํ•˜๋Š” ํ•จ์ˆ˜
"""
ํ•„ํ„ฐ ์ ์šฉ ํ•จ์ˆ˜.
์ž…๋ ฅ๋œ ์ด๋ฏธ์ง€์— ์„ ํƒํ•œ ํ•„ํ„ฐ (๊ทธ๋ ˆ์ด์Šค์ผ€์ผ, ๋„ค๊ฑฐํ‹ฐ๋ธŒ, ๋ฐ๊ธฐ ์กฐ์ ˆ, ๋Œ€๋น„ ์กฐ์ ˆ, ๋ธ”๋Ÿฌ๋ง, ์—ฃ์ง€ ๊ฒ€์ถœ)๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•„ํ„ฐ:
- grayscale: ๊ทธ๋ ˆ์ด์Šค์ผ€์ผ ๋ณ€ํ™˜
- negative: ๋„ค๊ฑฐํ‹ฐ๋ธŒ ๋ณ€ํ™˜
- brightness: ๋ฐ๊ธฐ ์กฐ์ ˆ (๊ธฐ๋ณธ๊ฐ’: 50)
- contrast: ๋Œ€๋น„ ์กฐ์ ˆ (๊ธฐ๋ณธ๊ฐ’: alpha=1.5, 1.0~3.0 ๋ฒ”์œ„ ์‚ฌ์šฉ ๊ถŒ์žฅ)
- blur: ๋ธ”๋Ÿฌ๋ง (๊ธฐ๋ณธ ์ปค๋„ ํฌ๊ธฐ: 5, ํ™€์ˆ˜๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
- edge: ์—ฃ์ง€ ๊ฒ€์ถœ
"""
def apply_filter(frame, filter_name, **kwargs):
if filter_name == 'grayscale':
return grayscale(frame)
elif filter_name == 'negative':
return negative(frame)
elif filter_name == 'brightness':
return adjust_brightness(frame, kwargs.get('value', 50)) # ๊ธฐ๋ณธ ๋ฐ๊ธฐ ์กฐ์ ˆ ๊ฐ’
elif filter_name == 'contrast':
return adjust_contrast(frame, kwargs.get('alpha', 1.5)) # ๊ธฐ๋ณธ ๋Œ€๋น„ ๊ฐ’ 1.0~3.0 ์ •๋„๊ฐ€ ์ ์ ˆ
elif filter_name == 'blur':
return blur_image(frame, kwargs.get('kernel_size', 5)) # ๊ธฐ๋ณธ ์ปค๋„ ํฌ๊ธฐ
elif filter_name == 'edge':
return edge_detection(frame)
else:
return frame # ํ•„ํ„ฐ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์œผ๋ฉด ์›๋ณธ์„ ๋ฐ˜ํ™˜
# MoviePy๋กœ ์›๋ณธ๊ณผ ๋ณ€ํ™˜๋œ ์˜์ƒ ์†Œ๋ฆฌ ํฌํ•จํ•ด์„œ ์ €์žฅํ•˜๊ณ  ์žฌ์ƒ (ํ”„๋ฆฌ๋ทฐ ํฌ๊ธฐ์™€ ์ €์žฅ ํฌ๊ธฐ ๋ถ„๋ฆฌ)
def process_and_play_with_audio(input_video, output_video, filter_name, **kwargs):
"""
์„ ํƒํ•œ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•˜์—ฌ ์›๋ณธ๊ณผ ๋ณ€ํ™˜๋œ ์˜์ƒ์„ ๋‚˜๋ž€ํžˆ ๋ฐฐ์น˜ํ•˜๊ณ , ์†Œ๋ฆฌ์™€ ํ•จ๊ป˜ ์žฌ์ƒ ๋ฐ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
ํ”„๋ฆฌ๋ทฐ์—์„œ๋Š” ์›๋ณธ์˜ 50% ํฌ๊ธฐ๋กœ ๋ณด์—ฌ์ฃผ๋ฉฐ, ์ตœ์ข… ์ €์žฅ๋œ ํŒŒ์ผ์€ ์›๋ณธ ํฌ๊ธฐ ๊ทธ๋Œ€๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
"""
# ์›๋ณธ ๋น„๋””์˜ค ๋ถˆ๋Ÿฌ์˜ค๊ธฐ (์†Œ๋ฆฌ ํฌํ•จ)
clip = VideoFileClip(input_video)
# ํ”„๋ ˆ์ž„์„ MoviePy์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€ํ™˜
def make_frame(img):
# ์„ ํƒํ•œ ํ•„ํ„ฐ๋ฅผ ์ ์šฉ
filtered_img = apply_filter(img, filter_name, **kwargs)
# ์›๋ณธ๊ณผ ๋ณ€ํ™˜๋œ ํ”„๋ ˆ์ž„์„ ๋‚˜๋ž€ํžˆ ๋ฐฐ์น˜
combined_frame = np.hstack((img, filtered_img))
return combined_frame
# ๋ณ€ํ™˜๋œ ํ”„๋ ˆ์ž„์œผ๋กœ ์ƒˆ๋กœ์šด ์˜์ƒ ํด๋ฆฝ ์ƒ์„ฑ
new_clip = clip.fl_image(make_frame)
# ํ”„๋ฆฌ๋ทฐํ•  ๋•Œ๋Š” ํฌ๊ธฐ ์กฐ์ • (0.5 = ์›๋ณธ์˜ 50% ํฌ๊ธฐ๋กœ ์žฌ์ƒ)
preview_clip = new_clip.resize(0.5)
# ์†Œ๋ฆฌ๋ฅผ ํฌํ•จํ•ด ์ƒˆ๋กœ์šด ์˜์ƒ์œผ๋กœ ์ €์žฅ (์›๋ณธ ํฌ๊ธฐ๋กœ ์ €์žฅ)
new_clip.write_videofile(output_video, codec='libx264', audio=True)
# ํ”„๋ฆฌ๋ทฐ ๋•Œ๋งŒ ์ถ•์†Œ๋œ ํฌ๊ธฐ๋กœ ์žฌ์ƒ
preview_clip.preview()
# ๋น„๋””์˜ค ์ฒ˜๋ฆฌ ๋ฐ ์‹คํ–‰
repo_id = 'Nagase-Kotono/CheckAppVersion' # Hugging Face์—์„œ ๋„ค ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ID
file_name = 'DECO_27_ใƒใƒใ‚™ใƒผใƒฉใƒณใƒˆใ‚™_feat_ๅˆ้ŸณใƒŸใ‚ฏ.mp4' # ๋‹ค์šด๋กœ๋“œํ•  ํŒŒ์ผ ์ด๋ฆ„
# Hugging Face์—์„œ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ
input_video = hf_hub_download(repo_id=repo_id, filename=file_name)
# ๋ณ€ํ™˜๋œ ์˜์ƒ ํŒŒ์ผ์„ ์ €์žฅํ•  ๊ฒฝ๋กœ
output_video = 'output_video_with_audio.mp4'
# ๋ณ€ํ™˜๋œ ์˜์ƒ ์ €์žฅ + ์†Œ๋ฆฌ ํฌํ•จํ•˜์—ฌ ์žฌ์ƒ (ํ•„ํ„ฐ ์ ์šฉ)
process_and_play_with_audio(input_video, output_video, filter_name='edge') # ํ•„ํ„ฐ ์„ ํƒ