Nagase-Kotono
commited on
Upload test.py
Browse files
test.py
ADDED
@@ -0,0 +1,151 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import cv2
|
2 |
+
import numpy as np
|
3 |
+
from moviepy.editor import VideoFileClip
|
4 |
+
from huggingface_hub import hf_hub_download
|
5 |
+
|
6 |
+
# 1. ๊ทธ๋ ์ด์ค์ผ์ผ ๋ณํ
|
7 |
+
def grayscale(frame):
|
8 |
+
"""
|
9 |
+
๊ทธ๋ ์ด์ค์ผ์ผ ๋ณํ ํจ์.
|
10 |
+
์
๋ ฅ๋ BGR ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ ์ด์ค์ผ์ผ๋ก ๋ณํํ ํ ๋ค์ BGR๋ก ๋ณํํ์ฌ ์ฐจ์์ ์ ์งํฉ๋๋ค.
|
11 |
+
"""
|
12 |
+
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
13 |
+
return cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR) # 2์ฐจ์์ 3์ฐจ์์ผ๋ก ๋ณํ
|
14 |
+
|
15 |
+
# 2. ๋ค๊ฑฐํฐ๋ธ ์ด๋ฏธ์ง ๋ณํ
|
16 |
+
def negative(frame):
|
17 |
+
"""
|
18 |
+
๋ค๊ฑฐํฐ๋ธ ๋ณํ ํจ์.
|
19 |
+
์
๋ ฅ๋ BGR ์ด๋ฏธ์ง๋ฅผ ๋ค๊ฑฐํฐ๋ธ ์ด๋ฏธ์ง๋ก ๋ณํํฉ๋๋ค (์์ ๋ฐ์ ).
|
20 |
+
"""
|
21 |
+
return cv2.bitwise_not(frame)
|
22 |
+
|
23 |
+
# 3. ์์ ๋ ๋ฐ๊ธฐ ์กฐ์
|
24 |
+
def adjust_brightness(frame, value):
|
25 |
+
"""
|
26 |
+
๋ฐ๊ธฐ ์กฐ์ ํจ์.
|
27 |
+
์
๋ ฅ๋ BGR ์ด๋ฏธ์ง์์ HSV๋ก ๋ณํ ํ, ๋ฐ๊ธฐ ์ฑ๋(v)์ value ๊ฐ์ ๋ํด ๋ฐ๊ธฐ๋ฅผ ์กฐ์ ํฉ๋๋ค.
|
28 |
+
value ๊ฐ์ ์์๋ฉด ์ด๋ก๊ฒ, ์์๋ฉด ๋ฐ๊ฒ ์กฐ์ ํฉ๋๋ค.
|
29 |
+
"""
|
30 |
+
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # BGR -> HSV๋ก ๋ณํ
|
31 |
+
h, s, v = cv2.split(hsv) # HSV๋ก ๋ถ๋ฆฌ
|
32 |
+
|
33 |
+
# v ์ฑ๋์ ๋ฐ๊ธฐ ์กฐ์ ๊ฐ ์ถ๊ฐ, 0~255 ์ฌ์ด๋ก ํด๋ฆฌํํ์ฌ ์์ ํ๊ฒ ์กฐ์
|
34 |
+
v = np.clip(v.astype(np.int16) + value, 0, 255).astype(np.uint8)
|
35 |
+
|
36 |
+
# ๋ค์ ํฉ์ณ์ HSV -> BGR๋ก ๋ณํ
|
37 |
+
final_hsv = cv2.merge((h, s, v))
|
38 |
+
return cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)
|
39 |
+
|
40 |
+
# 4. ์์ ๋ ๋๋น ์กฐ์
|
41 |
+
def adjust_contrast(frame, alpha):
|
42 |
+
"""
|
43 |
+
๋๋น ์กฐ์ ํจ์.
|
44 |
+
์
๋ ฅ๋ BGR ์ด๋ฏธ์ง์์ alpha ๊ฐ์ ๊ณฑํ์ฌ ๋๋น๋ฅผ ์กฐ์ ํฉ๋๋ค.
|
45 |
+
alpha ๊ฐ์ด ํด์๋ก ์ด๋ฏธ์ง์ ๋๋น๊ฐ ๊ฐํด์ง๋๋ค (1.0~3.0 ์ ๋๊ฐ ์ ์ ).
|
46 |
+
"""
|
47 |
+
adjusted = cv2.convertScaleAbs(frame, alpha=alpha, beta=0)
|
48 |
+
|
49 |
+
# ๋๋น ์กฐ์ ํ ๊ฐ์ด 0~255 ๋ฒ์๋ฅผ ์ ์งํ๋์ง ํ์ธ (์ด๋ฏธ convertScaleAbs๊ฐ ์ฒ๋ฆฌํ์ง๋ง ์์ ์ฑ ์ถ๊ฐ)
|
50 |
+
return np.clip(adjusted, 0, 255)
|
51 |
+
|
52 |
+
# 5. ๋ธ๋ฌ๋ง
|
53 |
+
def blur_image(frame, kernel_size=5):
|
54 |
+
"""
|
55 |
+
๊ฐ์ฐ์์ ๋ธ๋ฌ๋ง ํจ์.
|
56 |
+
์
๋ ฅ๋ BGR ์ด๋ฏธ์ง๋ฅผ ์ปค๋ ํฌ๊ธฐ๋งํผ ํ๋ฆฌ๊ฒ ๋ง๋ญ๋๋ค.
|
57 |
+
kernel_size ๊ฐ์ ๋ฐ๋์ ํ์์ฌ์ผ ํ๋ฉฐ, ์ปค๋ ํฌ๊ธฐ๊ฐ ํด์๋ก ๋ ํ๋ ค์ง๋๋ค.
|
58 |
+
"""
|
59 |
+
blurred = cv2.GaussianBlur(frame, (kernel_size, kernel_size), 0)
|
60 |
+
return blurred # BGR ์ฐจ์ ์ ์ง (์ถ๊ฐ ๋ณํ ๋ถํ์)
|
61 |
+
|
62 |
+
# 6. ์ฃ์ง ๊ฒ์ถ
|
63 |
+
def edge_detection(frame):
|
64 |
+
"""
|
65 |
+
์ฃ์ง ๊ฒ์ถ ํจ์.
|
66 |
+
์
๋ ฅ๋ BGR ์ด๋ฏธ์ง์์ ๊ทธ๋ ์ด์ค์ผ์ผ๋ก ๋ณํํ ํ Sobel ์ฐ์ฐ์ ํตํด ์ฃ์ง๋ฅผ ๊ฒ์ถํฉ๋๋ค.
|
67 |
+
์ดํ, 2์ฐจ์์ผ๋ก ๋ณํ๋ ์ฃ์ง ์ด๋ฏธ์ง๋ฅผ ๋ค์ BGR 3์ฐจ์์ผ๋ก ๋ณํํ์ฌ ๋ฐํํฉ๋๋ค.
|
68 |
+
"""
|
69 |
+
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
70 |
+
sobelx = cv2.Sobel(gray_frame, cv2.CV_64F, 1, 0, ksize=5)
|
71 |
+
sobely = cv2.Sobel(gray_frame, cv2.CV_64F, 0, 1, ksize=5)
|
72 |
+
edges = cv2.magnitude(sobelx, sobely)
|
73 |
+
edges = np.uint8(edges) # 2์ฐจ์ ์ด๋ฏธ์ง๋ก ๋ณํ
|
74 |
+
return cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR) # ๋ค์ 3์ฐจ์ BGR๋ก ๋ณํ
|
75 |
+
|
76 |
+
# ํํฐ๋ฅผ ์ ํํด์ ์ ์ฉํ๋ ํจ์
|
77 |
+
"""
|
78 |
+
ํํฐ ์ ์ฉ ํจ์.
|
79 |
+
์
๋ ฅ๋ ์ด๋ฏธ์ง์ ์ ํํ ํํฐ (๊ทธ๋ ์ด์ค์ผ์ผ, ๋ค๊ฑฐํฐ๋ธ, ๋ฐ๊ธฐ ์กฐ์ , ๋๋น ์กฐ์ , ๋ธ๋ฌ๋ง, ์ฃ์ง ๊ฒ์ถ)๋ฅผ ์ ์ฉํฉ๋๋ค.
|
80 |
+
|
81 |
+
์ฌ์ฉ ๊ฐ๋ฅํ ํํฐ:
|
82 |
+
- grayscale: ๊ทธ๋ ์ด์ค์ผ์ผ ๋ณํ
|
83 |
+
- negative: ๋ค๊ฑฐํฐ๋ธ ๋ณํ
|
84 |
+
- brightness: ๋ฐ๊ธฐ ์กฐ์ (๊ธฐ๋ณธ๊ฐ: 50)
|
85 |
+
- contrast: ๋๋น ์กฐ์ (๊ธฐ๋ณธ๊ฐ: alpha=1.5, 1.0~3.0 ๋ฒ์ ์ฌ์ฉ ๊ถ์ฅ)
|
86 |
+
- blur: ๋ธ๋ฌ๋ง (๊ธฐ๋ณธ ์ปค๋ ํฌ๊ธฐ: 5, ํ์๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
|
87 |
+
- edge: ์ฃ์ง ๊ฒ์ถ
|
88 |
+
"""
|
89 |
+
def apply_filter(frame, filter_name, **kwargs):
|
90 |
+
if filter_name == 'grayscale':
|
91 |
+
return grayscale(frame)
|
92 |
+
elif filter_name == 'negative':
|
93 |
+
return negative(frame)
|
94 |
+
elif filter_name == 'brightness':
|
95 |
+
return adjust_brightness(frame, kwargs.get('value', 50)) # ๊ธฐ๋ณธ ๋ฐ๊ธฐ ์กฐ์ ๊ฐ
|
96 |
+
elif filter_name == 'contrast':
|
97 |
+
return adjust_contrast(frame, kwargs.get('alpha', 1.5)) # ๊ธฐ๋ณธ ๋๋น ๊ฐ 1.0~3.0 ์ ๋๊ฐ ์ ์
|
98 |
+
elif filter_name == 'blur':
|
99 |
+
return blur_image(frame, kwargs.get('kernel_size', 5)) # ๊ธฐ๋ณธ ์ปค๋ ํฌ๊ธฐ
|
100 |
+
elif filter_name == 'edge':
|
101 |
+
return edge_detection(frame)
|
102 |
+
else:
|
103 |
+
return frame # ํํฐ๋ฅผ ์ ํํ์ง ์์ผ๋ฉด ์๋ณธ์ ๋ฐํ
|
104 |
+
|
105 |
+
# MoviePy๋ก ์๋ณธ๊ณผ ๋ณํ๋ ์์ ์๋ฆฌ ํฌํจํด์ ์ ์ฅํ๊ณ ์ฌ์ (ํ๋ฆฌ๋ทฐ ํฌ๊ธฐ์ ์ ์ฅ ํฌ๊ธฐ ๋ถ๋ฆฌ)
|
106 |
+
def process_and_play_with_audio(input_video, output_video, filter_name, **kwargs):
|
107 |
+
"""
|
108 |
+
์ ํํ ํํฐ๋ฅผ ์ ์ฉํ์ฌ ์๋ณธ๊ณผ ๋ณํ๋ ์์์ ๋๋ํ ๋ฐฐ์นํ๊ณ , ์๋ฆฌ์ ํจ๊ป ์ฌ์ ๋ฐ ์ ์ฅํฉ๋๋ค.
|
109 |
+
|
110 |
+
ํ๋ฆฌ๋ทฐ์์๋ ์๋ณธ์ 50% ํฌ๊ธฐ๋ก ๋ณด์ฌ์ฃผ๋ฉฐ, ์ต์ข
์ ์ฅ๋ ํ์ผ์ ์๋ณธ ํฌ๊ธฐ ๊ทธ๋๋ก ์ ์ฅ๋ฉ๋๋ค.
|
111 |
+
"""
|
112 |
+
# ์๋ณธ ๋น๋์ค ๋ถ๋ฌ์ค๊ธฐ (์๋ฆฌ ํฌํจ)
|
113 |
+
clip = VideoFileClip(input_video)
|
114 |
+
|
115 |
+
# ํ๋ ์์ MoviePy๏ฟฝ๏ฟฝ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ๋ณํ
|
116 |
+
def make_frame(img):
|
117 |
+
# ์ ํํ ํํฐ๋ฅผ ์ ์ฉ
|
118 |
+
filtered_img = apply_filter(img, filter_name, **kwargs)
|
119 |
+
|
120 |
+
# ์๋ณธ๊ณผ ๋ณํ๋ ํ๋ ์์ ๋๋ํ ๋ฐฐ์น
|
121 |
+
combined_frame = np.hstack((img, filtered_img))
|
122 |
+
|
123 |
+
return combined_frame
|
124 |
+
|
125 |
+
# ๋ณํ๋ ํ๋ ์์ผ๋ก ์๋ก์ด ์์ ํด๋ฆฝ ์์ฑ
|
126 |
+
new_clip = clip.fl_image(make_frame)
|
127 |
+
|
128 |
+
# ํ๋ฆฌ๋ทฐํ ๋๋ ํฌ๊ธฐ ์กฐ์ (0.5 = ์๋ณธ์ 50% ํฌ๊ธฐ๋ก ์ฌ์)
|
129 |
+
preview_clip = new_clip.resize(0.5)
|
130 |
+
|
131 |
+
# ์๋ฆฌ๋ฅผ ํฌํจํด ์๋ก์ด ์์์ผ๋ก ์ ์ฅ (์๋ณธ ํฌ๊ธฐ๋ก ์ ์ฅ)
|
132 |
+
new_clip.write_videofile(output_video, codec='libx264', audio=True)
|
133 |
+
|
134 |
+
# ํ๋ฆฌ๋ทฐ ๋๋ง ์ถ์๋ ํฌ๊ธฐ๋ก ์ฌ์
|
135 |
+
preview_clip.preview()
|
136 |
+
|
137 |
+
# ๋น๋์ค ์ฒ๋ฆฌ ๋ฐ ์คํ
|
138 |
+
repo_id = 'Nagase-Kotono/CheckAppVersion' # Hugging Face์์ ๋ค ๋ฆฌํฌ์งํ ๋ฆฌ ID
|
139 |
+
file_name = 'DECO_27_ใใใใผใฉใณใใ_feat_ๅ้ณใใฏ.mp4' # ๋ค์ด๋ก๋ํ ํ์ผ ์ด๋ฆ
|
140 |
+
|
141 |
+
# Hugging Face์์ ํ์ผ ๋ค์ด๋ก๋
|
142 |
+
input_video = hf_hub_download(repo_id=repo_id, filename=file_name)
|
143 |
+
|
144 |
+
# ๋ณํ๋ ์์ ํ์ผ์ ์ ์ฅํ ๊ฒฝ๋ก
|
145 |
+
output_video = 'output_video_with_audio.mp4'
|
146 |
+
|
147 |
+
# ๋ณํ๋ ์์ ์ ์ฅ + ์๋ฆฌ ํฌํจํ์ฌ ์ฌ์ (ํํฐ ์ ์ฉ)
|
148 |
+
process_and_play_with_audio(input_video, output_video, filter_name='edge') # ํํฐ ์ ํ
|
149 |
+
|
150 |
+
|
151 |
+
|