Извлечение скриншотов PPT из видео с использованием Python: методы ключевых кадров

В этой статье блога мы рассмотрим различные методы извлечения снимков экрана PowerPoint (PPT) из видео с помощью Python. Мы сосредоточимся на методах, основанных на ключевых кадрах, которые позволяют нам идентифицировать репрезентативные кадры в видео, соответствующие слайдам PPT. К концу этой статьи вы получите полное представление о различных подходах и примерах кода для решения этой задачи.

Методы:

  1. Использование OpenCV и сопоставление шаблонов.
    Первый метод предполагает использование библиотеки OpenCV для обработки видео и сопоставления шаблонов для обнаружения слайдов PPT. Вот пример фрагмента кода:

    import cv2
    def extract_ppt_screenshots(video_path, template_path, output_folder):
       template = cv2.imread(template_path, 0)
       vidcap = cv2.VideoCapture(video_path)
       success, image = vidcap.read()
       count = 0
       while success:
           gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
           res = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)
           threshold = 0.8
           loc = np.where(res >= threshold)
           for pt in zip(*loc[::-1]):
               cv2.imwrite(f"{output_folder}/slide_{count}.png", image)
               count += 1
           success, image = vidcap.read()
    # Usage
    video_path = "path/to/video.mp4"
    template_path = "path/to/ppt_template.png"
    output_folder = "path/to/output/folder"
    extract_ppt_screenshots(video_path, template_path, output_folder)
  2. Использование FFmpeg и определения сцен.
    Другой метод предполагает использование FFmpeg и библиотеки обнаружения сцен для определения ключевых кадров в видео. Вот пример фрагмента кода:

    import os
    import subprocess
    def extract_ppt_screenshots(video_path, output_folder):
       command = f"scenedetect --input {video_path} --detector content --stats"
       subprocess.call(command, shell=True)
       scene_list = []
       with open("scenedetect.stats.csv", "r") as f:
           lines = f.readlines()[1:]
           for line in lines:
               scene_start = float(line.split(",")[0])
               scene_end = float(line.split(",")[1])
               scene_list.append((scene_start, scene_end))
       count = 0
       for scene in scene_list:
           scene_start, scene_end = scene
           frame_number = int((scene_start + scene_end) / 2)
           os.makedirs(output_folder, exist_ok=True)
           subprocess.call(
               f"ffmpeg -ss {frame_number} -i {video_path} -vframes 1 {output_folder}/slide_{count}.png",
               shell=True,
           )
           count += 1
    # Usage
    video_path = "path/to/video.mp4"
    output_folder = "path/to/output/folder"
    extract_ppt_screenshots(video_path, output_folder)
  3. Использование PySceneDetect:
    PySceneDetect — это библиотека Python, предоставляющая высокоуровневый интерфейс для обнаружения сцен. Вот пример фрагмента кода:

    from scenedetect import VideoManager
    from scenedetect import SceneManager
    from scenedetect.detectors import ContentDetector
    def extract_ppt_screenshots(video_path, output_folder):
       video_manager = VideoManager([video_path])
       scene_manager = SceneManager()
       scene_manager.add_detector(ContentDetector())
       video_manager.set_downscale_factor()
       video_manager.start()
       scene_manager.detect_scenes(frame_source=video_manager)
       count = 0
       for scene in scene_manager.get_scene_list():
           frame_number = int(scene[0].frame_num + (scene[1].frame_num - scene[0].frame_num) / 2)
           video_manager.seek(frame_number)
           frame_image = video_manager.get_frame()
           frame_image.save(f"{output_folder}/slide_{count}.png")
           count += 1
    # Usage
    video_path = "path/to/video.mp4"
    output_folder = "path/to/output/folder"
    extract_ppt_screenshots(video_path, output_folder)