一個文件夾中有多個子文件夾,子文件夾中有多張圖像。如何把批量把子文件夾中的圖像合成視頻,視頻名稱是子文件夾的名稱,生成的視頻保存到指定文件夾,效果記錄。
代碼
import os
import cv2def create_video_from_images(image_folder, output_folder, fps=30):# 獲取子文件夾名稱,這將作為視頻文件的名稱video_name = os.path.basename(image_folder)video_path = os.path.join(output_folder, f"{video_name}.mp4")# 獲取子文件夾中的所有圖像文件images = [img for img in os.listdir(image_folder) if img.endswith((".png", ".jpg", ".jpeg", ".bmp", ".tiff"))]# 確保圖像列表不為空if not images:print(f"No images found in {image_folder}")return# 對圖像文件進行排序,確保它們按照正確的順序合成視頻images.sort()# 讀取第一張圖像以獲取幀尺寸frame = cv2.imread(os.path.join(image_folder, images[0]))height, width, layers = frame.shape# 定義編碼器并創建VideoWriter對象fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 使用mp4編碼video = cv2.VideoWriter(video_path, fourcc, fps, (width, height))# 遍歷所有圖像并將它們寫入視頻文件for image_file in images:image_path = os.path.join(image_folder, image_file)video.write(cv2.imread(image_path))# 釋放VideoWriter并關閉所有窗口video.release()cv2.destroyAllWindows()print(f"Video {video_path} created successfully.")# 主函數,用于遍歷主文件夾中的所有子文件夾并創建視頻
def main(main_folder, output_folder):# 確保輸出文件夾存在,如果不存在則創建它if not os.path.exists(output_folder):os.makedirs(output_folder)# 遍歷主文件夾中的所有子文件夾for subdir, _, files in os.walk(main_folder):# 檢查子文件夾中是否包含圖像文件if any(file.endswith((".png", ".jpg", ".jpeg", ".bmp", ".tiff")) for file in files):create_video_from_images(subdir, output_folder)# 設置主文件夾和輸出文件夾的路徑
main_folder_path = "F:/test_video/image/"
output_folder_path = "F:/test_video/video/"# 調用主函數開始處理
main(main_folder_path, output_folder_path)
代碼解釋:
-
create_video_from_images 函數接收一個子文件夾路徑和輸出文件夾路徑作為參數,用于將子文件夾中的圖像合成視頻。
-
在函數中,首先通過 os.path.basename 獲取子文件夾的名稱,這將用作視頻文件的名稱。然后,拼接輸出視頻文件的完整路徑。
-
使用列表推導式查找子文件夾中的所有圖像文件,并檢查列表是否非空。
-
對圖像文件進行排序,確保它們按照文件名順序被讀取和寫入視頻。
-
讀取第一張圖像來確定幀的尺寸,這對于創建 VideoWriter 對象是必需的。
-
定義視頻編碼器和創建 VideoWriter 對象。這里使用 ‘mp4v’ 編碼來創建MP4格式的視頻。
-
遍歷子文件夾中的所有圖像,并使用 VideoWriter 的 write 方法將它們寫入視頻文件。
-
釋放 VideoWriter 對象并關閉所有OpenCV窗口。
-
main 函數遍歷主文件夾中的所有子文件夾,并調用 create_video_from_images 函數來為每個子文件夾創建視頻。
10 在 main 函數中,首先檢查輸出文件夾是否存在,如果不存在則創建它。
- 最后,設置主文件夾和輸出文件夾的路徑,并調用 main 函數開始處理。
效果展示
子文件夾
每個子文件夾中都有若干圖像
合成視頻并以子文件夾名稱命名