代碼如下:
# -*- 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張提取一張。