python 实现将视频转换为图片
Posted 橙橙小狸猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 实现将视频转换为图片相关的知识,希望对你有一定的参考价值。
代码让人头秃,可是我喜欢上了代码的逻辑感和代码解决问题的力量。
(我要对这个专题的图片进行修改,缩小看和我导头像有点像QAQ)
代码流程图与说明
关于路径检查等操作使用的是Path或os.Path,视频的读取和转换使用的Opencv库函数,这里使用的是4.2.0版本,进行转换的核心库函数是cv2.imwrite
。
代码展示V2.2
更新版本 | 更新点 |
---|---|
V2.0 | 试着加入了from pathlib import Path ,但是还是不熟练,不太会用,就和os.path 混合着用了。你应该使用pathlib替代os.path |
V2.1 | 1. 视频类型判断更加齐全;2. 打印说明更加详细 |
V2.2待优化部分:
- 选帧转换
"""
将视频转换为图片,可以为多个文件夹下的图片。
注:在程序使用前需先配置好main中的地址
视频路径:video_path_list = [path1, path2, ...](路径数量可以为[1,n],每个路径下的视频数也可为[1,m])
paht1 path2 ....
|------video1.avi |-----video1.avi
|------vidoe2.avi |-----...
|------....
图片存储路径:image_save_dir = save_path(存储方式则将按以下方式)
save_path
| -------path1_name
|----video1
|----jpg1.jpg
|----jpg2,jpg
|----video2
...
|-------path2_name
...
"""
import cv2
import os
from pathlib import Path
VID_FORMATS = ('.mov', '.avi', '.mp4', '.mpg', '.mpeg', '.m4v', '.wmv', '.mkv', '.mp3')
def videos2images(root_video_path, root_save_dir):
for video_dir_path in root_video_path:
# 1.检测读取文件路径是否正确
path_video = Path(video_dir_path)
if path_video.is_dir():
print(video_dir_path + '\\t ok')
videos = os.listdir(video_dir_path)
else:
print('\\033[31mLine36 error: \\033[31m' + video_dir_path + 'is not exist!')
return
# 2. 生成存储文件夹
save_name_dir = Path(path_video.name)
save_name_dir = os.path.join(root_save_dir, save_name_dir)
if not os.path.exists(save_name_dir):
os.makedirs(save_name_dir)
file_count = 0
for video in videos:
# 判断是否为视频文件,如果不是视频文件则跳过并进行说明
if Path(video).suffix in VID_FORMATS:
file_count += 1 # 视频文件数+1
save_jpg_dir = os.path.join(save_name_dir, Path(video).stem)
if not os.path.exists(save_jpg_dir):
os.makedirs(save_jpg_dir)
each_video_path = os.path.join(path_video, video)
save_dir = save_jpg_dir
else:
print('\\033[33mLine56 warning: \\033[33m' + os.path.basename(video) + ' is not a video file, so skip.')
continue
# 3. 开始转换。打印正在处理文件的序号和他的文件名,并开始转换
print('\\033[38m' + str(file_count) + ':' + Path(video).stem + '\\033[38m')
cap = cv2.VideoCapture(each_video_path)
flag = cap.isOpened()
if not flag:
print("\\033[31mLine 65 error\\033[31m: open" + each_video_path + "error!")
frame_count = 0 # 给每一帧标号
while True:
frame_count += 1
flag, frame = cap.read()
if not flag: # 如果已经读取到最后一帧则退出
break
if os.path.exists(
save_dir + str(frame_count) + '.jpg'): # 在源视频不变的情况下,如果已经创建,则跳过
break
cv2.imwrite(save_dir + '\\\\' + str(frame_count) + '.jpg', frame)
cap.release()
print('\\033[38m' + Path(video).stem + ' save to ' + save_dir + 'finished. \\033[38m') # 表示一个视频片段已经转换完成
if __name__ == '__main__':
# 需要转换的视频路径列表,直达视频文件(自定义修改)
video_path_list = [r'E:\\Code\\feature_extraction_svm\\video/', r'E:\\Code\\feature_extraction_svm\\video2']
# 预期存储在的主文件夹,即'result'文件夹下
image_save_dir = r'E:\\Code\\feature_extraction_svm\\result2'
path_save = Path(image_save_dir)
if not path_save.exists():
path_save.mkdir()
# 进行转换
videos2images(video_path_list, image_save_dir)
结果展示
-
将创建’result’主文件夹和副文件夹
-
每个副文件夹下都将生成与视频名相对应的子文件夹,并按视频帧数顺序转换为jpg图片。
-
终端上将提示正在处理的文件路径,正在对哪个视频进行转换和转换完成提示。
参考链接
python 如果文件夹不存在 创建文件夹
使用python实现视频与图片相互转换
Python zfill()方法
【Python】如何读取文件夹下的所有文件
python获取路径中的文件名
python如何从路径中获取文件名
Python print()输出颜色设置
python5行代码实现查看指定文件夹中的文件个数
python将视频抽帧的的多种方式
最近有一个需求是将视频抽取为一个个的帧图片,使用python很方便实现,而且有多种方式;
视频转换为帧的三种方式
第一种:使用open-cv
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法;
由于open-cv不是python的内置库,所以使用之前需要先安装;
安装方式推荐有很多种,推荐使用pip;
pip 是 Python 的包安装程序。其实,pip 就是 Python 标准库(The Python Standard Library)中的一个包,只是这个包比较特殊,用它可以来管理 Python 标准库(The Python Standard Library)中其他的包。pip 是一个命令行程序。 安装 pip 后,会向系统添加一个 pip 命令,该命令可以从命令提示符运行。
使用pip安装,打开命令行输入;
pip install open-cv
等待执行安装成功;
安装完成后,导入:
import cv2
需要注意
以上是关于python 实现将视频转换为图片的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV-Python实战 —— OpenCV 实现批量将 bmppngjpg格式图片转换为 png 格式图片
OpenCV | 图片与视频的相互转换(C++&Python)