利用python将视频逐帧转为图片保存

版权声明:本文为CSDN博主「不爱学习的笨蛋」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011624019/article/details/124705198 

# -*- coding: utf-8 -*-   
import os 
import cv2
import csv
import numpy as np
import concurrent.futures
 
def GetImgNameByEveryDir(file_dir,videoProperty):  
    FileNameWithPath = [] 
    FileName         = []
    FileDir          = []
    # videoProperty=['.png','jpg','bmp']
    for root, dirs, files in os.walk(file_dir):  
        for file in files:  
            if os.path.splitext(file)[1] in videoProperty:  
                FileNameWithPath.append(os.path.join(root, file))  # 保存图片路径
                FileName.append(file)                              # 保存图片名称
                FileDir.append(root[len(file_dir):])               # 保存图片所在文件夹
    return FileName,FileNameWithPath,FileDir
 
# 以视频文件名创建文件夹,然后保存图像到对应文件夹
def AVI_To_Img_And_save(video_file):
	video_name = video_file.split('/')[-1].split('.')[0]
	print('当前处理的视频为:',video_file)
	cap = cv2.VideoCapture(video_file)
	rval = cap.isOpened()
	framenum=0
	while rval:
		rval, frame  = cap.read()
		if framenum%25!=0:
			framenum+=1
			continue
		save_dir     = './图片/'
		Img_savename = save_dir + '/' + 'DKY_image_' + video_name + '_' + '%08d'%framenum +'.jpg'
		if rval:
			if os.path.exists(Img_savename)==False:
				cv2.imwrite(Img_savename, frame,[int(cv2.IMWRITE_JPEG_QUALITY), 100]) 
		else:
			break
		framenum+=1
		print('正在处理视频{}的第{}帧,rval = {}...'.format(video_name,framenum,rval))
	cap.release()
	return ''
	
 
FileName,FileNameWithPath,FileDir = GetImgNameByEveryDir('./2021.12.24处理/',['.wmv','.mkv','.mp4'])
print('FileName = ',FileName)
# raise
with concurrent.futures.ThreadPoolExecutor(max_workers=20) as process:
# with concurrent.futures.ProcessPoolExecutor(max_workers=batch_size) as process:
	process.map(AVI_To_Img_And_save,FileNameWithPath)
 
 

此处save_dir图片保存目录,会存在程序同一目录下;

通过修改Img_savename后缀,可以得到不同格式的图片;

通过在GetImgNameByEveryDir函数后添加视频格式名称,可以读取不同格式的视频;

函数cv2.imwrite(Img_savename, frame, [int(cv2.IMWRITE_JPEG_QUALITY), 100]),用于调节输出得图片质量,数值是(0-100),但是在实际使用中发现,如果数字改为1000,程序也不会报错,而且图像质量也有所改善,参数为100时图像大小也就500KB,参数为1000时,图像大小基本是1.3M,图像质量可以看出明显区别。函数返回值为true时,代表成功保存图片,否则为false;

因项目需求,我所用的相机帧率为70fps,测试照片在测量高速物体时是否会发生拖影,所以在路边拍摄行驶车速不低于50km/h的汽车,下面是转换后的图片,清晰度还OK,没有拖影,证明相机帧率满足使用要求:

利用python将视频逐帧转为图片保存_第1张图片

 
  

你可能感兴趣的:(图像处理,python,音视频,开发语言,opencv)