Yaroslav commited on
Commit
19f68b8
·
verified ·
1 Parent(s): d748de4
Files changed (1) hide show
  1. app.py +86 -0
app.py ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import numpy as np
3
+ import os
4
+ import gradio as gr
5
+
6
+ # Функция для увеличения FPS
7
+ def increase_fps(input_video, target_fps=60):
8
+ input_path = "input.mp4"
9
+ output_path = "output.mp4"
10
+
11
+ # Сохранение входного видео
12
+ with open(input_path, "wb") as f:
13
+ f.write(input_video.read())
14
+
15
+ cap = cv2.VideoCapture(input_path)
16
+ input_fps = cap.get(cv2.CAP_PROP_FPS)
17
+ frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
18
+ width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
19
+ height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
20
+ codec = cv2.VideoWriter_fourcc(*"mp4v")
21
+
22
+ # Проверка: если входное FPS >= 60, просто копируем файл
23
+ if input_fps >= target_fps:
24
+ os.rename(input_path, output_path)
25
+ with open(output_path, "rb") as f:
26
+ return f.read()
27
+
28
+ # Расчет коэффициента интерполяции
29
+ ratio = target_fps / input_fps
30
+ output = cv2.VideoWriter(output_path, codec, target_fps, (width, height))
31
+ _, prev_frame = cap.read()
32
+ prev_frame_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY)
33
+
34
+ for _ in range(frame_count - 1):
35
+ ret, next_frame = cap.read()
36
+ if not ret:
37
+ break
38
+ next_frame_gray = cv2.cvtColor(next_frame, cv2.COLOR_BGR2GRAY)
39
+
40
+ # Оптический поток
41
+ flow = cv2.calcOpticalFlowFarneback(
42
+ prev_frame, next_frame_gray, None, 0.5, 3, 15, 3, 5, 1.2, 0
43
+ )
44
+
45
+ # Генерация промежуточных кадров
46
+ for i in range(1, int(ratio)):
47
+ alpha = i / ratio
48
+ intermediate_frame = cv2.addWeighted(prev_frame, 1 - alpha, next_frame_gray, alpha, 0)
49
+ intermediate_bgr = cv2.cvtColor(intermediate_frame, cv2.COLOR_GRAY2BGR)
50
+ output.write(intermediate_bgr)
51
+
52
+ output.write(next_frame)
53
+ prev_frame = next_frame_gray
54
+
55
+ cap.release()
56
+ output.release()
57
+
58
+ # Чтение результата
59
+ with open(output_path, "rb") as f:
60
+ output_video = f.read()
61
+
62
+ # Очистка временных файлов
63
+ os.remove(input_path)
64
+ os.remove(output_path)
65
+
66
+ return output_video
67
+
68
+ # Gradio интерфейс
69
+ def process_video(video):
70
+ return increase_fps(video)
71
+
72
+ interface = gr.Interface(
73
+ fn=process_video,
74
+ inputs=gr.Video(label="Загрузите видео для обработки"),
75
+ outputs=gr.Video(label="Видео с увеличенным FPS"),
76
+ title="Увеличение FPS до 60",
77
+ description=(
78
+ "Этот инструмент увеличивает частоту кадров видео до 60 FPS с использованием "
79
+ "оптического потока. Загрузите видео с низким FPS, чтобы получить плавный результат."
80
+ ),
81
+ examples=[]
82
+ )
83
+
84
+ # Запуск интерфейса
85
+ if __name__ == "__main__":
86
+ interface.launch()