版权声明:本文为优快云博主「不爱学习的笨蛋」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/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,没有拖影,证明相机帧率满足使用要求: