Yaroslav commited on
Commit
982688c
·
verified ·
1 Parent(s): 9a9f3ed

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -83
app.py CHANGED
@@ -1,87 +1,42 @@
1
- import cv2
2
- import os
3
  import gradio as gr
4
-
5
- # Функция для увеличения FPS
6
- def increase_fps(input_video_path, target_fps=60):
7
- output_path = "output.mp4"
8
- cap = cv2.VideoCapture(input_video_path)
9
- input_fps = cap.get(cv2.CAP_PROP_FPS)
10
- frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
11
- width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
12
- height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
13
- codec = cv2.VideoWriter_fourcc(*"mp4v")
14
-
15
- # Проверка: если входное FPS >= 60, просто копируем файл
16
- if input_fps >= target_fps:
17
- cap.release()
18
- return input_video_path # Возвращаем оригинальное видео
19
-
20
- # Расчет коэффициента интерполяции
21
- ratio = target_fps / input_fps
22
- output = cv2.VideoWriter(output_path, codec, target_fps, (width, height))
23
- ret, prev_frame = cap.read()
24
-
25
- # Проверка первого кадра
26
- if not ret:
27
- cap.release()
28
- output.release()
29
- raise ValueError("Не удалось прочитать кадры из видео.")
30
-
31
- prev_frame_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY)
32
-
33
- for _ in range(frame_count - 1):
34
- ret, next_frame = cap.read()
35
- if not ret:
36
- break
37
-
38
- # Преобразуем текущий кадр в черно-белый
39
- next_frame_gray = cv2.cvtColor(next_frame, cv2.COLOR_BGR2GRAY)
40
-
41
- # Убедимся, что размеры кадров совпадают
42
- if prev_frame_gray.shape != next_frame_gray.shape:
43
- next_frame_gray = cv2.resize(next_frame_gray, (prev_frame_gray.shape[1], prev_frame_gray.shape[0]))
44
-
45
- # Оптический поток
46
- flow = cv2.calcOpticalFlowFarneback(
47
- prev_frame_gray, next_frame_gray, None, 0.5, 3, 15, 3, 5, 1.2, 0
48
- )
49
-
50
- # Генерация промежуточных кадров
51
- for i in range(1, int(ratio)):
52
- alpha = i / ratio
53
- intermediate_frame = cv2.addWeighted(prev_frame_gray, 1 - alpha, next_frame_gray, alpha, 0)
54
- intermediate_bgr = cv2.cvtColor(intermediate_frame, cv2.COLOR_GRAY2BGR)
55
- output.write(intermediate_bgr)
56
-
57
- output.write(next_frame)
58
- prev_frame_gray = next_frame_gray
59
-
60
- cap.release()
61
- output.release()
62
-
63
- return output_path
64
-
65
- # Gradio интерфейс
66
- def process_video(video_path):
67
- try:
68
- result_path = increase_fps(video_path)
69
- return result_path
70
- except Exception as e:
71
- return f"Ошибка обработки: {str(e)}"
72
-
73
- interface = gr.Interface(
74
- fn=process_video,
75
- inputs=gr.Video(label="Загрузите видео для обработки"),
76
- outputs=gr.Video(label="Видео с увеличенным FPS"),
77
- title="Увеличение FPS до 60",
78
- description=(
79
- "Этот инструмент увеличивает частоту кадров видео до 60 FPS с использованием "
80
- "оптического потока. Загрузите видео с низким FPS, чтобы получить плавный результат."
81
- ),
82
- examples=[]
83
  )
84
 
85
- # Запуск интерфейса
86
  if __name__ == "__main__":
87
- interface.launch(share=True)
 
 
 
1
  import gradio as gr
2
+ import numpy as np
3
+ from PIL import Image
4
+
5
+ def interpolate_frames(frame1, frame2, num_frames):
6
+ # Преобразовать изображения в массивы NumPy
7
+ frame1 = np.array(frame1)
8
+ frame2 = np.array(frame2)
9
+
10
+ # Вычислить разницу между двумя изображениями
11
+ diff = frame2 - frame1
12
+
13
+ # Создать список для хранения интерполированных кадров
14
+ interpolated_frames = []
15
+
16
+ # Интерполировать кадры
17
+ for i in range(num_frames):
18
+ t = i / (num_frames - 1)
19
+ interpolated_frame = frame1 + t * diff
20
+ interpolated_frame = interpolated_frame.astype(np.uint8)
21
+ interpolated_frames.append(Image.fromarray(interpolated_frame))
22
+
23
+ return interpolated_frames
24
+
25
+ # Создать интерфейс Gradio
26
+ demo = gr.Interface(
27
+ fn=interpolate_frames,
28
+ inputs=[
29
+ gr.Image(type="pil", label="Кадр 1"),
30
+ gr.Image(type="pil", label="Кадр 2"),
31
+ gr.Slider(label="Количество кадров", minimum=2, maximum=100, value=10)
32
+ ],
33
+ outputs=[
34
+ gr.Gallery(label="Интерполированные кадры")
35
+ ],
36
+ title="Интерполяция кадров",
37
+ description="Интерполируйте кадры между двумя изображениями"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  )
39
 
40
+ # Запустить приложение
41
  if __name__ == "__main__":
42
+ demo.launch()