已經有很多文章描述了如何將視頻拆分成視頻幀,例如:https://blog.csdn.net/WYKB_Mr_Q/article/details/124929081
那我們如何將很多視頻幀重新組合成視頻呢?
這里我們主要用到了 OpenCV 庫中的 VideoWriter 類。
OpenCV種的 cv2.VideoWriter 類可以將圖片序列保存成視頻文件,也可以修改視頻的各種屬性,還可以完成對視頻類型的轉換。該類種常用的函數包括:構造函數、write 函數等。
1、構造函數
OpenCV中的cv2.Video_fourcc()
用來指定視頻編碼格式:
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # MP4格式
上述代碼指定視頻寫入器的格式為 .mp4 格式。需要注意到’mp4v’中的英文字母,要么全大寫,要么全小寫。
保存為其它視頻參考格式如下:
支持avi格式:
I420,YUV編碼,視頻格式為.avi
PIM1,MPEG-1編碼,視頻格式為.avi
XVID,MPEG-4編碼,視頻格式為.avi
其他編碼器
THEO,Ogg Vorbis,視頻格式為.ogv
FLV1,Flash視頻,視頻格式為.flv
AVC1,H264編碼
DIV3,MPEG-4.3編碼
DIVX,MPEG-4編碼
MP42,MPEG-4.2編碼
MJPG,motion-jpeg編碼
U263,H263編碼
I263,H263I編碼
設置完視頻寫入格式之后,需要完成對象創建,比如設置視頻的幀率,視頻幀的長和寬等參數。這里我們主要用到了cv2.VideoWriter()
函數。
videowrite = cv2.VideoWriter(save_video_path, fourcc, fps=15, frameSize=(w, h))
其中,save_video_path參數表示合成之后視頻保存的路徑及名稱;fourcc表示上述編碼格式;fps就是幀率,即每秒播放多少張圖片;frameSize表示保存視頻的寬和高。
2、write函數
cv2.VideoWriter.write()
用于寫入下一幀視頻。
videowrite.write(img)
其中,img表示讀取到的視頻幀數據。
3、釋放
釋放該類對象時所使用的是函數cv2.VideoWriter.release()
。該函數的語法格式是:
videowrite.release()
在制作視頻時,不用這個也沒關系。
下面是完整的代碼:
import cv2
import os# 視頻幀放置的文件夾路徑,假如有多組視頻幀,在frames文件夾下可放置多個文件夾
frame_path = r"E:\data\frames"
# 生成視頻存放的文件夾路徑
video_path = r"E:\datas\videos"for root, dirs, files in os.walk(frame_path):# 一個文件夾中的第幾個視頻幀i = 0for file in files:# 讀取圖像的地址img_path = os.path.join(root, file)img = cv2.imread(img_path)h, w, c = img.shapei += 1# 如果是第一個視頻幀,則構造視頻對象if i == 1:# 保存視頻的地址dir_lis = root.split("\\")save_videos_path = os.path.join(video_path, dir_lis[-3], dir_lis[-2])# 如果路徑不存在,則創建文件夾if not os.path.exists(save_videos_path):os.makedirs(save_videos_path)# 加入文件名save_video_path = os.path.join(save_videos_path, dir_lis[-1] + '.mp4')# 設置視頻寫入器fourcc = cv2.VideoWriter_fourcc(*'mp4v') # MP4格式# 完成寫入對象的創建,第一個參數是合成之后的視頻的名稱,第二個參數是可以使用的編碼器,第三個參數是幀率即每秒鐘展示多少張圖片,第四個參數是圖片大小信息videowrite = cv2.VideoWriter(save_video_path, fourcc, fps=15, frameSize=(w, h)) # 2是每秒的幀數,size是圖片尺寸# 將視頻幀寫入視頻對象中videowrite.write(img)print("第{}張圖像合成成功".format(i))print('------done!!!------')
參考鏈接:https://zhuanlan.zhihu.com/p/399689868
日常學習記錄,一起交流討論吧!侵權聯系~