-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsplitting.py
74 lines (68 loc) · 3.74 KB
/
splitting.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
from datetime import timedelta
import cv2
import numpy as np
import os
# то есть, если видео длительностью 30 секунд, сохраняется 5 кадров в секунду = всего сохраняется 150 кадров
SAVING_FRAMES_PER_SECOND = 5
def format_timedelta(td):
"""Служебная функция для классного форматирования объектов timedelta (например, 00:00:20.05)
исключая микросекунды и сохраняя миллисекунды"""
result = str(td)
try:
result, ms = result.split(".")
except ValueError:
return result + ".00".replace(":", "-")
ms = int(ms)
ms = round(ms / 1e4)
return f"{result}.{ms:02}".replace(":", "-")
def get_saving_frames_durations(cap, saving_fps):
"""Функция, которая возвращает список длительностей, в которые следует сохранять кадры."""
s = []
# получаем продолжительность клипа, разделив количество кадров на количество кадров в секунду
clip_duration = cap.get(cv2.CAP_PROP_FRAME_COUNT) / cap.get(cv2.CAP_PROP_FPS)
# используйте np.arange () для выполнения шагов с плавающей запятой
for i in np.arange(0, clip_duration, 1 / saving_fps):
s.append(i)
return s
def split(video_file):
#filename, _ = os.path.splitext(video_file)
filename = "frames/images_fly"
# создаем папку по названию видео файла
if not os.path.isdir(filename):
os.mkdir(filename)
# читать видео файл
cap = cv2.VideoCapture(video_file)
# получить FPS видео
fps = cap.get(cv2.CAP_PROP_FPS)
# если SAVING_FRAMES_PER_SECOND выше видео FPS, то установите его на FPS (как максимум)
saving_frames_per_second = min(fps, SAVING_FRAMES_PER_SECOND)
# получить список длительностей для сохранения
saving_frames_durations = get_saving_frames_durations(cap, saving_frames_per_second)
# запускаем цикл
count = 0
while True:
is_read, frame = cap.read()
if not is_read:
# выйти из цикла, если нет фреймов для чтения
break
# получаем продолжительность, разделив количество кадров на FPS
frame_duration = count / fps
try:
# получить самую раннюю продолжительность для сохранения
closest_duration = saving_frames_durations[0]
except IndexError:
# список пуст, все кадры длительности сохранены
break
if frame_duration >= closest_duration:
# если ближайшая длительность меньше или равна длительности кадра,
# затем сохраняем фрейм
frame_duration_formatted = format_timedelta(timedelta(seconds=frame_duration))
cv2.imwrite(os.path.join(filename, f"{video_file}{frame_duration_formatted}.jpg"), frame)
# удалить точку продолжительности из списка, так как эта точка длительности уже сохранена
try:
saving_frames_durations.pop(0)
except IndexError:
pass
# увеличить количество кадров
count += 1
split('m_fly.mp4')