生活中或工作中都有遇到需要將某個視頻轉成圖片。一兩個視頻文件或十幾個視頻文件還好,但是當上百個視頻文件且還不在一個文件夾下存放,還需要轉好的圖可以按照原來的路徑存放,這就是一個麻煩又費時間的事情了。試着在網上找了代碼,但都運行不起來,因此寫了這麼個程序來批量處理這些視頻文件。
編碼語言:python python3
文件類型:avi
目錄結構:D:/a/b/c/xxxxx.avi,a層目錄下有多個不同的b文件夾,b層目錄下又有多個不同的c文件夾,c文件夾下又有多個不同的avi文件
需求:avi視頻按幀轉圖,轉出來的圖片需要放在與avi文件同名的文件夾下,並且目錄結構必須保證不變。
import cv2
import os
# 遞歸方法訪問文件並按照文件夾及文件名稱新建對應的新文件夾
# 轉換avi文件爲jpg圖,當前程序缺點:視頻切割的圖片有重複圖片存在。
def close_VideoCapture(cap):
cap.release()
def load_avi_file_sid_cid_time(video_filename):
try:
cap = cv2.VideoCapture(video_filename)
if cap.isOpened():
return cap
else:
print("load avi file failed!\n")
return None
except:
return None
def search_avi_and_get_frame(path1,savepath):
for filename in os.listdir(path1):
if os.path.isdir(os.path.join(path1,filename)):
path1_ = os.path.join(path1,filename)
savepath_ = os.path.join(savepath,filename)
search_avi_and_get_frame(path1_,savepath_)
print('is dir',filename)
elif filename[0] == '.':
print('is . continue')
continue
else:
print(filename)
firstname,lastname =filename.split('.')[0],filename.split('.')[1]
# print(firstname,lastname)
if lastname == 'avi':
# try:
# new_dir = savepath+'\\' + newmakedirname
newmakedir = os.path.join(savepath,firstname)
# newmakedir = os.path.join(new_dir, firstname)
if not os.path.exists(newmakedir):
os.makedirs(newmakedir)
cap = load_avi_file_sid_cid_time(os.path.join(path1,filename))
startframe = 1
skipframe = 1
while cap:
# 以幀率的形式進行抽幀
cap.set(cv2.CAP_PROP_POS_FRAMES, startframe)
ret, frame = cap.read()
if ret:
cv2.imwrite(os.path.join(newmakedir,'{}.jpg'.format(startframe)), frame)
startframe += skipframe
else:
close_VideoCapture(cap)
break
# except:
# print('errorfile',filename)
if __name__ == '__main__':
# avi文件存放的根目錄
path_ = r'D:\test\a'
#需要存放jpg圖的根目錄
savepath_ = r'D:\test\jpg'
search_avi_and_get_frame(path_,savepath_)
只要你的環境等沒問題可以直接複製來用,不過需要注意的是這裏的路徑不要出現中文否則圖片保存不下。