1. Навіщо це потрібно?
Перед тим як запустити наш віртуальний верстат по витягненню кадрів, давайте обговоримо, чому це важливо. Витягнення і обробка окремих кадрів може бути корисним для створення ефектів, аналізу змін у часі, а також для підготовки зображень для машинного навчання. Це також чудовий спосіб використовувати кадри для створення слайд-шоу або анімацій.
Основні етапи роботи з кадрами
- Витягнення кадрів із відео.
- Обробка витягнених кадрів.
- Збереження оброблених кадрів.
Тепер, коли ми знаємо, чого хочемо досягти, давайте перейдемо до практики.
2 Витягнення Кадрів із Відео
Почнемо з самого фундаменту — витягнення кадрів. У MoviePy можна легко отримати доступ до окремих кадрів відео, використовуючи методи класу VideoFileClip. Кожен кадр представлений у форматі масиву (багатовимірного масиву пікселів), який можна обробити за допомогою MoviePy або інших бібліотек, наприклад, NumPy чи Pillow.
Відкриття відео та доступ до окремого кадру
from moviepy.editor import VideoFileClip
# Відкриття відеофайлу
video_clip = VideoFileClip("sample_video.mp4")
# Витягнення кадру на 5-й секунді
frame = video_clip.get_frame(5)
# Вивід інформації про кадр
print("Тип даних кадру:", type(frame))
print("Розміри кадру:", frame.shape)
У цьому прикладі:
VideoFileClip("sample_video.mp4")відкриває відеофайл і створює об'єктvideo_clip.video_clip.get_frame(5)витягує кадр на 5-й секунді.frame.shapeпоказує розміри кадру (висоту, ширину і кількість кольорових каналів).
3. Збереження кадрів як зображень
Після витягнення кадру його можна зберегти як зображення. Для цього можна скористатися бібліотекою Pillow (PIL) для роботи із зображеннями.
Встановлення Pillow
Якщо Pillow не встановлена, встановіть її за допомогою pip:
pip install pillow
Збереження кадру як зображення
from PIL import Image
from moviepy.editor import VideoFileClip
# Відкриття відео і витягнення кадру на 5-й секунді
video_clip = VideoFileClip("sample_video.mp4")
frame = video_clip.get_frame(5)
# Конвертація кадру в зображення і збереження
image = Image.fromarray(frame)
image.save("frame_at_5_seconds.png")
Тут:
Image.fromarray(frame)перетворює масив пікселів у об'єкт зображення.image.save("frame_at_5_seconds.png")зберігає кадр як PNG-файл.
4. Витягнення серії кадрів з відео
Якщо потрібно витягнути декілька кадрів на регулярній основі (наприклад, кожен кадр, кожну секунду або з заданим інтервалом), можна використовувати цикл для отримання потрібних кадрів. Це корисно, якщо потрібно провести аналіз або створити мініатюри з відео.
Приклад: Витягнення і збереження кадрів кожну секунду
from PIL import Image
from moviepy.editor import VideoFileClip
# Відкриття відеофайлу
video_clip = VideoFileClip("sample_video.mp4")
# Тривалість відео у секундах
duration = int(video_clip.duration)
# Витягнення і збереження кадрів кожну секунду
for i in range(duration):
frame = video_clip.get_frame(i)
image = Image.fromarray(frame)
image.save(f"frame_{i}_second.png")
Тут:
for i in range(duration)перебирає кожну секунду до кінця відео.- На кожній секунді витягується кадр, перетворюється у зображення і зберігається з унікальним іменем (наприклад,
frame_1_second.png,frame_2_second.png).
5. Зміна розмірів кадру перед збереженням
MoviePy дозволяє змінювати розміри кадрів перед збереженням. Це корисно, якщо потрібно створити мініатюри або зменшені зображення кадрів.
Зміна розміру кадру і його збереження
from PIL import Image
from moviepy.editor import VideoFileClip
# Відкриття відеофайлу
video_clip = VideoFileClip("sample_video.mp4")
# Витягнення кадру на 10-й секунді
frame = video_clip.get_frame(10)
# Конвертація кадру в зображення
image = Image.fromarray(frame)
# Зміна розміру кадру до 200x200 пікселів
image_resized = image.resize((200, 200))
# Збереження зміненого зображення
image_resized.save("resized_frame_at_10_seconds.png")
6. Витягнення кадрів з конкретною частотою
Якщо вам потрібно витягувати кадри з певною частотою (наприклад, кожен 10-й кадр для аналізу руху), можна використовувати параметр частоти кадрів fps.
Приклад: Витягнення кожного 10-го кадру
from PIL import Image
from moviepy.editor import VideoFileClip
# Відкриття відеофайлу
video_clip = VideoFileClip("sample_video.mp4")
# Налаштування частоти вибірки кадрів (наприклад, кожен 10-й кадр)
frame_interval = 10
# Витягнення і збереження кожного 10-го кадру
for i, frame in enumerate(video_clip.iter_frames()):
if i % frame_interval == 0:
image = Image.fromarray(frame)
image.save(f"frame_{i}.png")
Тут:
video_clip.iter_frames()дозволяє перебирати всі кадри відео.if i % frame_interval == 0витягує тільки кожен 10-й кадр.
7. Обробка Кадрів
Витягти кадр — це лише півсправи, можливо, ви захочете додати трохи магії до вашого зображення. Для цього скористаємося бібліотекою Pillow для обробки зображення.
# Перетворення зображення в чорно-біле
image_bw = image.convert("L")
image_bw.save("mid_frame_bw.png")
Тут ми взяли витягнутий кадр і перетворили його в чорно-біле зображення. Просте, але таке ефективне перетворення може зробити ваші кадри більш виразними.
8. Проблеми і рішення
У світі кадрування і обробки відео є свої підводні камені. Переконайтеся, що ваш системний шлях до файлів правильний, інакше ваш код може швидко перетворитися на "пошук голки в стозі коду". А ще перевірте наявність усіх необхідних бібліотек і пакетів, особливо якщо ви перезавантажували систему чи оновлювали Python. Іноді забуті залежності можуть створити раптові "вечірки помилок".
Цей процес витягнення і обробки кадрів може бути надзвичайно корисним у різних сферах. Наприклад, для створення навчальних матеріалів, аналізу спортивних відео для тренування, або для творчого підходу до монтажу і обробки відео.
Тож, як тільки опануєте всі ці техніки, ви зможете легко розкласти будь-яке відео на окремі кадри і зробити з ними що завгодно! Забудьте про нудьгу і монотонність — ваш новий інструментарій відкриває цілий світ можливостей. І пам'ятайте, з MoviePy вам не потрібні надздібності, щоб створювати щось по-справжньому дивовижне.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ