Python OpenCV 儲存寫入video影片到檔案

本篇介紹如何用 Python 搭配 OpenCV 模組的 cv2.VideoCapture 將來源的影像(攝影機或串流影片),儲存寫入video影片到檔案裡。

使用範例

如果遇到 ImportError: No module named 'cv2' 這個錯誤訊息的話,請安裝 python 的 OpenCV 模組,參考這篇安裝吧!。

先前的文章我們學習了如何讀取播放影片,那這篇要來學習如何儲存影片,
如果要將來源影片(不論來源是攝影機影像還是影片)要存成圖片的話只要使用 cv2.imwrite() 就可以了,
那如果想要存成影片檔的話,我們可以使用 VideoWriter 這個 class,
cv2.VideoWriter() 的第一個參數是指定輸出的檔名,例如:下列範例中的 output.avi,
第二個參數為指定 FourCC
第三個參數為 fps 影像偵率,
第四個參數為 frameSize 影像大小,
最後參數代表是否要存彩色,否則就存灰階,預設為 true,

FourCC 是 4-byte 大小的碼,用來指定影像編碼方式,
如同下列範例的 fourcc 變數,它可以由 cv2.VideoWriter_fourcc() 來產生,
cv2.VideoWriter_fourcc() 的參數是傳入四個字元就會回傳該 fourcc,可使用的編碼列表可以參考www.fourcc.org,同時也要看該平台有沒有支援。

常見的編碼格式有,以使用MJPG為例子的話,可以用這兩種寫法都一樣,
cv2.VideoWriter_fourcc(‘M’,’J’,’P’,’G’) 或者是 cv2.VideoWriter_fourcc(*’MJPG’)。

opencv-save-video.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2

cap = cv2.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# 水平上下翻轉影像
#frame = cv2.flip(frame, 0)
# write the flipped frame
out.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) == ord('q'):
break
# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()

如果要輸出附檔名為 mp4 可用下列寫法的其中一種,

1
2
3
4
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V')
fourcc = cv2.VideoWriter_fourcc(*'MP4V')
fourcc = cv2.VideoWriter_fourcc(*'mp4v')

其他參考
OpenCV: Getting Started with Videos
https://docs.opencv.org/master/dd/d43/tutorial_py_video_display.html
OpenCV 擷取網路攝影機串流影像,處理並寫入影片檔案教學 - G. T. Wang
https://blog.gtwang.org/programming/opencv-webcam-video-capture-and-file-write-tutorial/

其它相關文章推薦
Python OpenCV 彩色轉灰階(RGB/BGR to GRAY)
Python OpenCV 彩色轉HSV(RGB/BGR to HSV)
Python OpenCV 彩色轉YCbCr(RGB/BGR to YCbCr)
Python OpenCV 灰階轉彩色(Gray to RGB/BGR)
Python OpenCV 影像二值化 Image Thresholding
Python OpenCV 影像平滑模糊化 blur
Python OpenCV 影像邊緣偵測 Canny Edge Detection
Python OpenCV 垂直vconcat 和水平hconcat 影像拼接
Python OpenCV resize 圖片縮放
Python 新手入門教學懶人包