视频处理之视频抽帧的python脚本

这篇具有很好参考价值的文章主要介绍了视频处理之视频抽帧的python脚本。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在计算机视觉研究中,处理视频的时候,往往需要将视频抽帧成图片。如果多个视频都存放在一个文件夹里,并且希望抽帧出来的图片,以一个视频对应一个文件夹的形式存放,可以用以下代码,抽帧频率可自己手动修改,下面是抽所有帧的代码:

'''
批量提取视频的所有帧
'''
import os
import cv2
#视频地址
videos_src_path = '/home/videos/'
#存放图片的地址
videos_save_path = '/home/frames/'

#返回videos_src_path路径下包含的文件或文件夹名字的列表(所有视频的文件名),按字母顺序排序
videos = os.listdir(videos_src_path)
for each_video in videos:
    #获取每个视频的名称
    each_video_name, _ = each_video.split('.')
    #创建目录保存抽出的帧
    os.mkdir(videos_save_path + each_video_name)
    #获取保存图片的完整路径,每个视频的图片帧存在以视频名为文件名的文件夹中
    each_video_save_full_path = os.path.join(videos_save_path, each_video_name) + '/'
    #每个视频的完整路径
    each_video_full_path = os.path.join(videos_src_path, each_video)
    #读入视频
    cap = cv2.VideoCapture(each_video_full_path)
    print(each_video_full_path)
    frame_count = 1
    success = True
    while (success):
        #提取视频帧,success为是否成功获取视频帧(true/false),第二个返回值为返回的视频帧
        success, frame = cap.read()
        # 如果想间隔比如25帧抽一张,可以在下方if里加条件:frame_count % 25 == 0
        if success == True:
            #存储视频帧,%04d则每张图片以4位数命名,比如0001.jpg
            cv2.imwrite(each_video_save_full_path + "%04d.jpg" % frame_count, frame)
        frame_count += 1

主要用到的是cv2里的cv2.VideoCapture()read()

上面是所有视频存储在一个文件夹里,即如下的组织结构:

—videos
	—video1.mp4
	—video2.mp4
	—video3.mp4
	—video4.mp4
	...

但很多数据集,它不是将所有视频放在一个文件夹下,而是有各级子文件夹,每个子文件夹里放有同名的视频,而是如下这种组织形式:

—videos
	—user_0
		—run_0
			—video.mp4
		—run_1
			—video.mp4
		—run_2
			—video.mp4
		...
	—user_1
		—run_0
			—video.mp4
		—run_1
			—video.mp4
		...
	—user_2
	...

这个时候就要递归一下各级文件夹了,而且抽出的视频帧的文件夹的命名也不能是每个视频的名字,因为每个视频名字都一样,所以这个时候不仅要递归,而且要记录每个视频的路径,然后以视频的路径来命名这些图片文件夹。
我们先将每个视频的路径保存在txt文件里:

import  os
from os import path

def scanner_video(inputSrc,video_list):
    file_list = os.listdir(inputSrc)
    for file in file_list:
        curr_file=path.join(inputSrc,file)

        #递归搜索
        if(path.isdir(curr_file)):
            scanner_video(curr_file,video_list)
        else:
            curr_file_name=curr_file.split(".")
            curr_file_type=curr_file_name[len(curr_file_name)-1]
			# 各种格式视频
            if curr_file_type=="mp4"or curr_file_type=="avi"or curr_file_type=="wmv" or curr_file_type=="vm4":
                video_list.append(curr_file)
    return video_list

if __name__ == '__main__':
    inputSrc= '/home/Finalised/'
    # 保存txt的路径
    outputSrc= '/home/videoList.txt'
    video_list=[]
    video_list=scanner_video(inputSrc,video_list)

    f = open(outputSrc, 'w', encoding="utf-8", newline='\n')

    for file in video_list:
        f.write(file)
        f.write("\n")
    
    f.close()

然后读取这个videoList.txt文件,修改之前的代码,之前是直接按照文件夹下的视频名称来拼出每个视频的路径,要保存的图片文件夹的名字也是按照视频名称。现在每个视频的路径从txt文件中去读取,然后图片文件夹的名字是按照视频路径的一部分来截取,比如截取出 User_11/run_1,然后将"/“替换成”-"
即可得到User_11-run_1,这里就是第12个文件夹里的第2个文件夹里的视频抽帧后的图片被保存到的文件夹的名字。
注意的点是,txt的每一行的末尾都有个\n符号,得用strip('\n')来删除

import  os
import cv2

# 图片保存路径
videos_save_path = '/home/dataset/frames/' 
lines = 0
    # 从txt中找每个视频的路径
   
for each_video in open('/home/videoList.txt', encoding='utf-8'):
    # if each_video == '\n':
    #    continue
    # 原先的这种方式不行:这一行是换行符的话就跳过—— ——但换行符在each_video末尾,txt里没有空行
    
    # strip删除指定字符
    each_video = each_video.strip('\n')
    lines += 1
    last = each_video.rfind('/') # 返回最后一个'/'的下标
    # 根据实际路径情况设置切片的下标
    each_video_name = each_video[54:last] # /User_11/run_1/
    each_video_name = each_video_name.replace('/','-')
    #创建目录,每个来保存图片帧
    os.mkdir(videos_save_path + each_video_name)
    #获取保存图片的完整路径,每个视频的图片帧存在以视频名为文件名的文件夹中
    each_video_save_full_path = os.path.join(videos_save_path, each_video_name) + '/'
    
    #读入视频
    cap = cv2.VideoCapture(each_video)
    #输出调试信息
    print(cap.isOpened())
    print(each_video)
    frame_count = 1
    success = True
    while (success):
    	#提取视频帧,success为是否成功获取视频帧(true/false),第二个返回值为返回的视频帧
        success, frame = cap.read()
        # print(success)
        if success == True:
        #存储视频帧
            cv2.imwrite(each_video_save_full_path + "%04d.jpg" % frame_count, frame)
        frame_count += 1	

# 查看读取到的txt的行数,此时就知道所有视频都抽取完了
print(lines)

当然也可以不用保存在txt里,可以两份代码合一块,直接读取视频的路径然后挨个抽帧。
但是先将视频的路径保存在txt文档里相对还是更有容错空间,比如部分视频没抽成功,可以修改txt的内容为没有读到的这批视频,然后再次运行后面这份代码。文章来源地址https://www.toymoban.com/news/detail-690825.html

到了这里,关于视频处理之视频抽帧的python脚本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • python+moviepy音视频处理(二):视频添加文字(字幕)、视频添加汉字不显示问题

    目录 添加文字报错处理 中文不显示处理 代码实例 给视频添加滚动文字(一) 给视频添加滚动文字(二) 报错内容 :OSError: MoviePy Error: creation of None failed because of the following error: [WinError 2] 系统找不到指定的文件。. .This error can be due to the fact that ImageMagick is not installed on your comput

    2024年02月09日
    浏览(28)
  • 【音视频笔记】Mediacodec+Muxer生成mp4,浏览器无法播放问题处理

    最近在测试视频录制功能时发现,AudioRecord + MediaCodec + MediaMuxer生成的MP4,PC浏览器无法播放 ,但是Android、Windows、Mac的播放器应用都能正常播放。虽然不禁想吐槽浏览器视频组件的容错性差,但我也意识生成的文件格式肯定也是有问题的。 然后尝试了合成MP4视频时,只保留视

    2024年02月07日
    浏览(62)
  • python+moviepy音视频处理(一):基本操作

    python+moviepy音视频处理(一):基本操作

    目录 视频处理 视频加载和输出 视频转换gif 视频裁剪 视频音量调节 去掉视频声音 视频中的音频提取与替换 获取视频属性 倍数播放视频 截取视频某帧为封面 多视频拼接 音频处理 替换视频文件的音频 多个音频文件拼接 安装:pip install moviepy 中文官网:moviepy-cn 文档 \\\'\\\'\\\' movie

    2023年04月23日
    浏览(14)
  • 如何使用Python进行可视化/音视频处理?

    要使用Python进行可视化和音视频处理,可以使用以下库: matplotlib:用于绘制各种类型的图表和图形,包括折线图、柱状图、散点图等。 seaborn:基于matplotlib的可视化库,提供更高级别的图表和样式,用于创建各种吸引人的统计图表。 plotly:用于创建交互式图表和数据可视化

    2024年02月09日
    浏览(14)
  • python moviepy 自动化音视频处理实践

    MoviePy是一个用于视频编辑的Python库。它提供了一种简单且直观的方式来处理视频文件,包括剪辑、合并、裁剪、添加文本、添加音频等操作。使用MoviePy,你可以通过编写Python代码来创建和编辑视频,而无需使用复杂的视频编辑软件。 MoviePy建立在另一个库Pygame和软件MoviePy

    2024年02月14日
    浏览(15)
  • pydub,一个有趣的 Python 音视频处理库!

    pydub,一个有趣的 Python 音视频处理库!

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站零基础入门的AI学习网站~。   目录 ​编辑 前言 什么是 pydub? 安装 pydub 基本用法  1. 播放音频文件  2. 剪切音频文件 高级用法  1. 合并音频文件  2. 调整音量 实际

    2024年02月21日
    浏览(11)
  • javacv处理rtsp流,抽帧,转hls流,播放视频

    javacv处理rtsp流,抽帧,转hls流,播放视频

    整体项目结构: pom文件引入依赖: 1.播放视频 video类: 效果展示:   2.转换hls流 效果展示   3.抽帧 效果: 工具类代码:  

    2024年02月13日
    浏览(10)
  • 「Python|音视频处理|场景案例」如何使用ffmpeg下载m3u8视频到本地并保存成mp4

    本文主要介绍如何使用ffmpeg批量下载视频到本地并保存成指定格式。 当我们希望将网页上的视频下载到本地的时候,我们可能获取到的视频地址是指向 .m3u8 格式的,当视频多的时候,手动下载并使用工具转换格式就显得工作量过大。 ffmpeg 是一个强大的音视频处理工具,具体

    2024年02月16日
    浏览(19)
  • 常用脚本-持续更新(文件重命名、视频抽帧、拆帧、删除冗余文件、yolo2xml、转换图片格式、修改xml)

    所有代码位置 :Learning-Notebook-Codes/Python/常用脚本 脚本路径: codes/files_rename.py 脚本说明:可以自动重命名某个文件夹下指定类型的文件。 修改前文件名称: img1.jpg 修改后文件名称: Le0v1n-20231123-X-0001.jpg 脚本路径: codes/extract_frames.py 脚本说明:根据帧间隔对某个文件夹下指定

    2024年02月20日
    浏览(15)
  • Py之AV:Python下音视频处理的良伴,AV库的全面介绍、详细安装和使用方法!

    Py之AV:Python下音视频处理的良伴,AV库的全面介绍、详细安装和使用方法! Python作为一门广泛使用的编程语言,其实也可以用来进行音视频的处理。AV库就是一个功能强大、易于使用的Python音视频处理库,能够方便地完成多种音视频格式的读取、解码和编码等操作。 本文将全

    2024年02月12日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包