从视频中提取为ppt或图片

  • 缘由
  • 简介
  • 使用
  • 安装与运行
  • 改进-批量

缘由

在观看视频或会议讲座时,有时觉得演讲者的ppt内容做的不错,想要去下载视频中主持人的ppt演示幻灯片,但由于某些原因,无法下载,有时只能去录制视频去截图某一帧然后最后合成pdf保存。
下面的软件可以帮助从视频中使用算法识别自动提取其中的ppt

简介

这个软件是video2pdfslides, 它的主要作用就是从一个视频里提取有效图片, 去重后并转为 PDF。
官方地址

使用

这是一款开源代码,不属于模块,所以无法通过pip直接安装调用。

安装与运行

安装:

git clone https://github.com/kaushikj/video2pdfslidescd video2pdfslidespip install -r requirements.txt

使用命令行运行

python video2pdfslides.py video/test.mp4python video2pdfslides.py "./input/Test Video 1.mp4"

改进-批量

官方提供代码每次只能转换一个文件(也可能可以批量,但是我没发现调用方法),所以我们可以对其进行改进。

import os
import pathlib
import time
import cv2
import imutils
import shutil
import img2pdf
import glob
import argparse############# 定义常量OUTPUT_SLIDES_DIR = f"./output"  # 默认输出文件夹FRAME_RATE = 3  # 帧率:每秒需要处理的帧数越少,速度越快
WARMUP = FRAME_RATE  # 被跳过的初始帧数
FGBG_HISTORY = FRAME_RATE * 15  # 背景对象中的帧数
VAR_THRESHOLD = 16  # 方差阈值,用于判断当前像素是前景还是背景。一般默认为 16,如果光照变化明显,如阳光下的水面,建议设为 25,值越大灵敏度越低
DETECT_SHADOWS = False  # 是否检测影子,设为 True 为检测,False 为不检测,检测影子会增加程序时间复杂度,一般设置为 False
MIN_PERCENT = 0.1  # 在前景和背景之间的最小差值百分比,以检测运动是否已经停止
MAX_PERCENT = 3  # 在前景和背景之间的最大百分比的差异,以检测帧是否仍在运动def get_frames(video_path):'''从位于 video_path 的视频返回帧的函数此函数跳过 FRAME_RATE 中定义的帧'''# 打开指向视频文件的指针初始化帧的宽度和高度vs = cv2.VideoCapture(video_path)if not vs.isOpened():raise Exception(f'unable to open file {video_path}')total_frames = vs.get(cv2.CAP_PROP_FRAME_COUNT)frame_time = 0frame_count = 0print("total_frames: ", total_frames)print("FRAME_RATE", FRAME_RATE)# 循环播放视频的帧while True:# 从视频中抓取一帧vs.set(cv2.CAP_PROP_POS_MSEC, frame_time * 1000)  # 将帧移动到时间戳frame_time += 1 / FRAME_RATE(_, frame) = vs.read()# 如果帧为None,那么我们已经到了视频文件的末尾if frame is None:breakframe_count += 1yield frame_count, frame_time, framevs.release()def detect_unique_screenshots(video_path, output_folder_screenshot_path):''''''# 用参数初始化 fgbg 一个背景对象# history = 影响背景减法器的帧历史数# varThreshold = 像素与模型之间的平方马氏距离的阈值,以决定像素是否被背景模型很好地描述。该参数不影响后台更新。# detectShadows = 如果为真,算法将检测阴影并标记它们。它会稍微降低速度,因此如果您不需要此功能,请将参数设置为 false。fgbg = cv2.createBackgroundSubtractorMOG2(history=FGBG_HISTORY, varThreshold=VAR_THRESHOLD,detectShadows=DETECT_SHADOWS)captured = Falsestart_time = time.time()(W, H) = (None, None)screenshoots_count = 0for frame_count, frame_time, frame in get_frames(video_path):orig = frame.copy()  # clone the original frame (so we can save it later),frame = imutils.resize(frame, width=600)  # resize the framemask = fgbg.apply(frame)  # apply the background subtractor# apply a series of erosions and dilations to eliminate noise#            eroded_mask = cv2.erode(mask, None, iterations=2)#            mask = cv2.dilate(mask, None, iterations=2)# if the width and height are empty, grab the spatial dimensionsif W is None or H is None:(H, W) = mask.shape[:2]# compute the percentage of the mask that is "foreground"p_diff = (cv2.countNonZero(mask) / float(W * H)) * 100# if p_diff less than N% then motion has stopped, thus capture the frameif p_diff < MIN_PERCENT and not captured and frame_count > WARMUP:captured = Truefilename = f"{screenshoots_count:03}_{round(frame_time / 60, 2)}.png"path = str(pathlib.Path(output_folder_screenshot_path, filename))print("saving {}".format(path))cv2.imencode('.png', orig)[1].tofile(path)  # 防止imwrite中文乱码screenshoots_count += 1# otherwise, either the scene is changing or we're still in warmup# mode so let's wait until the scene has settled or we're finished# building the background modelelif captured and p_diff >= MAX_PERCENT:captured = Falseprint(f'{screenshoots_count} screenshots Captured!')print(f'Time taken {time.time() - start_time}s')returndef initialize_output_folder(video_path):'''Clean the output folder if already exists'''(filesname, extension) = os.path.splitext(video_path)output_folder_screenshot_path = f"{OUTPUT_SLIDES_DIR}/{video_path.rsplit('/')[-1].replace(extension, '')}"if os.path.exists(output_folder_screenshot_path):shutil.rmtree(output_folder_screenshot_path)os.makedirs(output_folder_screenshot_path, exist_ok=True)print('initialized output folder', output_folder_screenshot_path)return output_folder_screenshot_pathdef convert_screenshots_to_pdf(output_folder_screenshot_path):(filesname, extension) = os.path.splitext(video_path)output_pdf_path = f"{OUTPUT_SLIDES_DIR}/{video_path.rsplit('/')[-1].replace(extension, '')}" + '.pdf'print('output_folder_screenshot_path', output_folder_screenshot_path)print('output_pdf_path', output_pdf_path)print('converting images to pdf..')with open(output_pdf_path, "wb") as f:f.write(img2pdf.convert(sorted(glob.glob(f"{output_folder_screenshot_path}/*.png"))))print('Pdf Created!')print('pdf saved at', output_pdf_path)if __name__ == "__main__":input_dir_name = 'test'#要转换的视频所在的文件夹for file_name in os.listdir(input_dir_name):print(f"正在转换:{file_name}")video_path = str(pathlib.Path(input_dir_name, file_name))output_folder_screenshot_path = initialize_output_folder(video_path)detect_unique_screenshots(video_path, output_folder_screenshot_path)# 提取的图片转换为pdfconvert_screenshots_to_pdf(output_folder_screenshot_path)

食用方法:

input_dir_name 代表要转换的视频所在文件夹

修改后直接运行即可,默认是提取后的图片自动转为pdf

从视频中提取为ppt或图片相关推荐

  1. 从视频中提取图片(截取ppt)

    从视频中提取图片 大聪明2.0上线 本文将介绍如何快速从网课视频中提取ppt Step1 从视频中提取图片 使用win自带的"电影与电视" 点击这个小铅笔,选择"保存视频 ...

  2. python一帧一帧读取视频_用Python从视频中提取每一帧的图片

    大家应该都有这样的情况:在看到某些视频的画面时感觉美如画,想截取下来却又烦于截图的繁琐,现在我就教大家使用Python提取视频中每一帧的画面,让大家不错过每一个精彩的瞬间! •语言:Python •所 ...

  3. FFmpeg命令(三)、 从视频中提取图片

    FFmpeg 从视频中提取图片 ffmpeg -i test.mp4 -r 30 image-%3d.jpg ffmpeg -i test.mp4 -r 30 -t 4 image-%3d.jpg f ...

  4. 【Python编程】三步完成如何从视频中提取音频?

      今天忽然有需要从视频中提取出音频来,外事不决问百度,在度娘上找了找得出来的结果就是使用某某音频转换器,后者是AE.PR或者是会声会影之类的操作.Ab全家桶买不起,只好想想还有没其他路子,所以就有了 ...

  5. 一段很有意思小代码:视频中提取心率

    通过功率谱的方法估计视频中人脸的心率 原理: 由麻省理工学院多媒体实验室提出的,基于光电容积脉搏波描记( Photoplethysmography,PPG)原理,结合独立成分分析,利用人面部视频测量出 ...

  6. 如何使用matlab从视频中提取出一帧帧图像

    如何使用matlab从视频中提取出一帧帧图像 原文链接:http://blog.sina.com.cn/s/blog_a5fdbf010101ao4f.html 近期有需要,从视频里面提取图片,以前用 ...

  7. php如何截取出视频中的指定帧作为图片

    php如何截取出视频中的指定帧作为图片 一.总结 一句话总结:截取视频指定帧为图片,php ffmpeg扩展已经完美实现,并且php ffmpeg是开源的 二.php如何截取出视频中的指定帧作为图片 ...

  8. 如何从视频中提取音频?

    抖音.快手上有许多视频中的音乐特别好听,可以我们有时不知道这些歌曲的名字,所以有时需要从视频中将音频给提取出来.有的则是看到某些视频中合成的背景音乐很炫酷,想要拿过来为自己用,所以需要从视频中将音频给 ...

  9. Android 音视频配音之音频提取、截断、混音、合并、合成(一)——从视频中提取音频文件

    目录 前言 提取前提----了解提取需要用到的工具类:MediaExtractor.MediaCodec 1.MediaExtractor 2.MediaCodec 3.释放 具体提取转码代码 调用 ...

  10. 动态水印跟踪去除_视频动态水印如何去除 视频中不定时出现的图片加文字广告如何尽量模糊处理...

    『狸窝是帮助用户解决问题 提供教程解决方案 在这个过程中有使用我们自己开发的软件 也有网上找的工具 只要帮助用户解决问题就好!』 离别真是个伤感的事情,每天都走人来来去去,每天也都有人走走停停,当离别 ...

最新文章

  1. HTML 各种鼠标手势
  2. linux 串口工具_Zynq下linux系统搭建
  3. 【JFreeChart】JFreeChart—输出区域图
  4. MySQL源码学习——DBUG调试
  5. 从零开始学电脑_带你从零开始学装机 打造自己的专属电脑之固态和机械硬盘搭配篇...
  6. vbox设置剪切板共享
  7. ROS学习笔记基础2(基础知识和ROS架构)
  8. php 持久化对象,php-对类持久化的引用
  9. VB中PictureBox控件使用教程
  10. 4米乘以12米CAD图_CAD套图技巧大揭秘及坐标问题小结
  11. 【系统分析师之路】原创章节 重构与改善设计思维导图
  12. 前端 | 数据可视化之ECharts
  13. 外包的水有多深?华为15k+的外包测试岗能去吗?
  14. 完全java实现一款开源的报表工具简表(JOR)
  15. css 如何实现文本竖排、横排展示
  16. 算法图解第七章狄克斯特拉算法读书笔记
  17. linux指令——刘雯丽
  18. 数组,向量和矩阵以及空间的维数
  19. vscode插件默认安装位置
  20. 美国互联网理论是伪科学?

热门文章

  1. 风力摆控制系统,stm32f1程序,通过pid控制算法实现了风力摆摆定长直线,变长直线,一定角度摆动,定点停滞
  2. 模拟医院信息管理系统
  3. 上海链家网二手房成交数据爬取
  4. MVVM框架理解及其原理实现
  5. 详解K均值聚类算法(K-means Clustering)简易实例:从空调温度判别使用者
  6. 跨平台数据库ODB实战3-Person类的存储、查询、更新和删除
  7. Netapp存储 硬盘显示bad label的解决办法
  8. 基于朴素贝叶斯分类器的西瓜数据集 2.0 预测分类_朴素贝叶斯算法知识点总结...
  9. java新手代码翻译成中文_急!老师让我把以下代码翻译成中文的
  10. 基于 Mybatis 和 Springboot 的后台管理系统 BootDo | 软件推介