В приложениях для обработки видео часто необходимо настроить частоту кадров (FPS) видео. Если вам нужно ускорить замедленное видео или замедлить быстрое, OpenCV предлагает различные способы изменения FPS. В этой статье мы рассмотрим различные подходы с примерами кода, которые помогут вам овладеть искусством изменения частоты кадров видео с помощью OpenCV.
Метод 1: дублирование/удаление кадров
Самый простой способ изменить FPS — дублировать или удалять кадры. Этот подход полезен, когда вы хотите увеличить или уменьшить частоту кадров в N раз.
import cv2
def change_fps_simple(input_path, output_path, new_fps):
cap = cv2.VideoCapture(input_path)
fps = cap.get(cv2.CAP_PROP_FPS)
frame_skip = round(fps / new_fps)
writer = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'mp4v'), new_fps, (int(cap.get(3)), int(cap.get(4))))
count = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
if count % frame_skip == 0:
writer.write(frame)
count += 1
cap.release()
writer.release()
Метод 2: Интерполяция по времени
Интерполяция предполагает создание новых кадров путем смешивания существующих кадров. Этот метод полезен, если вы хотите изменить FPS на нецелое значение.
import cv2
def change_fps_interpolation(input_path, output_path, new_fps):
cap = cv2.VideoCapture(input_path)
fps = cap.get(cv2.CAP_PROP_FPS)
frame_interval = round(fps / new_fps)
writer = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'mp4v'), new_fps, (int(cap.get(3)), int(cap.get(4))))
count = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
if count % frame_interval == 0:
writer.write(frame)
else:
prev_frame = cap.get(cv2.CAP_PROP_POS_FRAMES) - 1
next_frame = cap.get(cv2.CAP_PROP_POS_FRAMES)
alpha = (count % frame_interval) / frame_interval
new_frame = cv2.addWeighted(frame, 1 - alpha, cap.read()[1], alpha, 0)
writer.write(new_frame)
count += 1
cap.release()
writer.release()
Метод 3: временная субдискретизация
Временная субдискретизация предполагает пропуск кадров через регулярные промежутки времени для снижения частоты кадров. Этот метод полезен, если вы хотите снизить частоту кадров, сохранив при этом временную непрерывность видео.
import cv2
def change_fps_subsampling(input_path, output_path, new_fps):
cap = cv2.VideoCapture(input_path)
fps = cap.get(cv2.CAP_PROP_FPS)
frame_skip = round(fps / new_fps)
writer = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'mp4v'), new_fps, (int(cap.get(3)), int(cap.get(4))))
count = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
if count % frame_skip == 0:
writer.write(frame)
count += 1
cap.release()
writer.release()
Изменение частоты кадров видео с помощью OpenCV — ценный навык для задач обработки видео. В этой статье мы исследовали три различных метода: дублирование/удаление кадров, интерполяцию по времени и временную подвыборку. Каждый метод имеет свои преимущества и подходит для разных сценариев. Используя эти методы, вы можете эффективно управлять частотой кадров видео в соответствии с вашими конкретными потребностями.
Не забудьте выбрать подходящий метод в зависимости от желаемого результата и характера видеоконтента. Поэкспериментируйте с различными настройками для достижения наилучших результатов. Удачной обработки видео!