【视频转图片】用python-opencv实现视频连续逐帧截图自动生成图片方法

基于python-opencv的视频连续逐帧截图自动生成图片方法(亲测可用!

	经常有小伙伴私信问我说有没有视频的电子版呀,PPT版啊之类的,想着长时间对着视频伤眼要是能打印出来就好了。如果你要是一张张视频截图然后一个个做成PPT那要做到什么时候啊,UP主突然发挥奇想,为什么不结合我大学计算机专业的特长,把这个复杂枯燥的人工过程,转变为简单自动的机器过程呢?毕竟,人生苦短,我用python哈哈哈。办公自动化是真的香!(好家伙,up主的业务越来越广了,秃头警告xN)

今天,图欧君来教大家如何把视频批量生成图片的方法:(这个方法,是up主我在csdn找到的,然后我升级改进了一下,不过目前这个版本只支持输入视频路径和图片路径,还不能自动新建文件夹和修改截图帧率,我会在下一个版本中改进)

废话不多说正片开始:

首先呢,准备工作:

  • 安装好pycharm和python 3(这个最基本的东西我就今天不细讲了哈)
  • 下载好你想要转图片PPT的视频
    【视频转图片】用python-opencv实现视频连续逐帧截图自动生成图片方法_第1张图片
  • 新建一个py文件,然后复制下面这串代码粘贴上去
import cv2
import os

print('————欢迎来到视频连续截图自动生成系统2.0!————')
f = 30  # 截图速率默认为每30帧一张


def transfer():  # 定义转换过程(核心代码)
    try:
        os.makedirs(pic_path)  # 自动在视频文件同一路径生成以视频文件名为名字的新文件夹
    except FileExistsError:
        print('————已存在与视频同名文件夹,请删除后再操作!————')
        quit()  # 存在同名文件夹系统报错,退出程序
    cap = cv2.VideoCapture(video)  # 导入视频文件
    num = 1  # 可在此处修改图片文件名起始序号
    print('————设置完成,即将开始导出图片!————')
    print('————' * 8)
    while True:
        if cap.grab():
            num += 1
            if num % f == 1:  # 每f帧截取一个图片
                flag, frame = cap.retrieve()  # 解码并返回一个帧
                if not flag:
                    continue
                else:
                    cv2.imshow('video', frame)
                    new = pic_path + "/" + pic_name + str(int(num / f)) + ".jpg"  # 定义图片的输出路径以及名字
                    print('正在导出:' + pic_name + str(int(num / f)) + ".jpg (按Esc停止运行)")
                    cv2.imencode('.jpg', frame)[1].tofile(new)  # 将生成的截图输出到新文件夹并命名
        else:  # 运行完毕自动退出
            break
        if cv2.waitKey(10) == 27:  # 检测到按下Esc时退出
            quit()


while True:  # 用户设置阶段
    try:
        video_path = input('请输入你的视频文件所在路径(如:F:/新建文件夹,注意是/斜杠和英文冒号):')  # 获取视频文件路径
        if not os.path.exists(video_path):  # 判断文件路径是否存在
            print('你输入的文件路径有误,请重新输入!')
        else:
            print('————文件路径匹配成功!————')
            break
    except NameError:
        print('你输入的文件路径有误,请重新输入!')


while True:
    try:
        video_name = input('请输入你的mp4视频文件名(不需要加后缀,如:我的视频):')  # 获取视频文件名
        video = video_path + "/" + video_name + ".mp4"   # 格式默认为mp4,如果你要转换别的格式,请在此处更改
        if not os.path.exists(video) or video_name == '':  # 判断文件是否存在
            print('你输入的文件名有误,请重新输入!')
        if os.path.exists(video) and video_name != '':
            print('————视频文件匹配成功!————')
            break
    except ValueError:
        print('你输入的文件名有误,请重新输入!')


while True:
    try:
        f = int(input('请输入你想要的帧数(即每多少帧截一张图,如:最小间隔逐帧截图,则输入2,不输入则默认设置为30):'))  # 获取用户的帧率需求,只限数字
        if f < 0:
            print('帧数不能为负!')
        elif f == 0:
            print('帧数不能为0!')
        elif f == 1:
            f += 1
            print('————帧数不支持设为1,截图速率已设置为' + str(f) + '帧一张!————')  # 帧数为1时,系统不运作,这个是bug
            break
        else:
            print('————截图速率已成功设置为' + str(f) + '帧一张!————')
            break
    except ValueError:
        print('————截图速率已自动设置为默认的' + str(f) + '帧一张!————')
        break


pic_name = input('请输入你要生成的图片名称(不输入则默认为纯数字,推荐不输入名字直接回车键,因为生成PPT需要纯数字的文件名):')  # 获取用户的图片文件名需求,文件名为:输入的名字+数字
if not pic_name:
    pic_name = ""  # 不输入则默认为空名字+数字
pic_path = video[:-4] + "/"  # 根据用户输入的视频文件路径来定义图片存放路径

transfer()  # 主程序启动

print('————' * 8)
print('运行完毕!图片已全部保存在:' + pic_path)

  • 然后,你要装一个外部组件库,名字叫【OpenCV】

    OpenCV的功能十分强大,强烈表白!这里不再多说:https://baike.baidu.com/item/opencv/10320623

方法一:键盘win+R 打开运行,输入cmd进入命令行窗口输入:pip install opencv-python

【视频转图片】用python-opencv实现视频连续逐帧截图自动生成图片方法_第2张图片

它会自动安装完成
【视频转图片】用python-opencv实现视频连续逐帧截图自动生成图片方法_第3张图片

方法二:在pycharm设置中安装opencv-python软件包

【视频转图片】用python-opencv实现视频连续逐帧截图自动生成图片方法_第4张图片

【视频转图片】用python-opencv实现视频连续逐帧截图自动生成图片方法_第5张图片
【视频转图片】用python-opencv实现视频连续逐帧截图自动生成图片方法_第6张图片

最后,点击运行,输入你的视频文件名路径以及图片文件夹路径点击回车键即可!

【视频转图片】用python-opencv实现视频连续逐帧截图自动生成图片方法_第7张图片

要注意两个地方:一个是.mp4的后缀,一个是要么 / 单斜杠,要么就 \ 双斜杠。

【视频转图片】用python-opencv实现视频连续逐帧截图自动生成图片方法_第8张图片

运行展示:
【视频转图片】用python-opencv实现视频连续逐帧截图自动生成图片方法_第9张图片

效果展示:
【视频转图片】用python-opencv实现视频连续逐帧截图自动生成图片方法_第10张图片

按Esc结束运行

对你有用的话点个赞再走吧~

你可能感兴趣的:(python办公自动化,python,计算机视觉,opencv)