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