代码如下:
# -*- coding: utf-8 -*-#
# Author: weiz
# Date: 2019/11/26 10:22
# Name: main
# Description:
import os
import cv2
import shutil
def video2images(video_p_n, img_p, dst_folder, index):
video = cv2.VideoCapture()
if not video.open(video_p_n):
print("can not open the video")
exit(1)
count = 1
while True:
_, frame = video.read()
if frame is None:
break
if count % dst_folder == 0:
save_path = "{}_{:>05d}.png".format(dst_folder, index)
save_path = img_p + '/' + save_path
cv2.imwrite(save_path, frame, (cv2.IMWRITE_PNG_COMPRESSION, 0))
index += 1
count += 1
video.release()
# 打印出所提取帧的总数/以及原本视频总帧数
print("Totally save {:d}/{:d} pics".format((index-1), count))
if __name__ == '__main__':
videoPath = "./video" # 视频存放的文件夹
genImages = "./images" # 最后图片保存的位置
EXTRACT_FREQUENCY = 10 # 帧提取频率
print("workSpace:{}".format(os.getcwd()))
videoName = os.listdir(videoPath)
if os.path.exists(genImages):
shutil.rmtree(genImages) # 删除原来的图片库,以防混乱
print("Old images deleted!")
os.mkdir(genImages)
for name in videoName:
imglib = genImages + '/' + name[:-4]
os.mkdir(imglib)
video_p_n = videoPath + '/' + name
video2images(video_p_n, imglib, EXTRACT_FREQUENCY, 1)
源视频大小为:633.4MB
视频转不同格式图片的情况:
生成图片的格式 | 生成图片总大小 | 单幅图片大小 | 生成时设置的参数 |
jpg | 551.1MB | 286.9KB | 95(jpg默认的参数) |
png | 1.8GB | 913.7KB | 3(png默认的参数) |
png | 11.2GB | 6.2MB | 0(png图片压缩率最小) |
bmp | 11.2GB | 6.2MB | 无 |
说明:
- 只要是jpg格式的图片就会压缩,在opencv中图片压缩后的质量参数为0到100,默认是95。
- png格式比jpg格式会好,属于高质量的图片保存格式。opencv中压缩等级从0到9,默认是3,压缩速度最快。
- bmp格式的图片是无损图片格式,但占用的磁盘内存会比较大。没有找到与bmp格式设置相关的说明及参数。
- 视频转成jpg格式的图片,图片的像素与源视频中的像素会有所不同。如果用视频和转成图片后分别用于训练、识别等任务,可能会造成不一样的结果。这点需要注意。
- 一般生成默认的png图片就够用,即:压缩等级为3。
- 生成图片总大小也与视频转图片时的提取率有关。上面的代码提取率是每10张提取一张。