一、VideoWriter 類的介紹
VideoWriter 是 OpenCV 中用於將視頻寫入磁盤的類。它默認使用 XVID 編解碼器和 AVI 格式保存視頻,同時也支持其他格式的視頻文件的保存。
VideoWriter 主要有以下幾個參數:
- filename:要保存的視頻文件的路徑及文件名。
- fourcc:用於指定視頻編解碼器的 FourCC 代碼。
- fps:要保存的視頻的幀率。
- frameSize:要保存的視頻的分辨率。
- isColor:指定視頻幀是否為彩色圖像。
import cv2
# 創建 VideoWriter 對象
writer = cv2.VideoWriter("output.avi", cv2.VideoWriter_fourcc(*"XVID"), 30, (640, 480))
# 讀取視頻並將幀寫入文件
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 寫入幀
writer.write(frame)
# 顯示幀
cv2.imshow("frame", frame)
if cv2.waitKey(1) == ord("q"):
break
# 釋放對象
cap.release()
writer.release()
cv2.destroyAllWindows()
二、使用不同的編解碼器
VideoWriter 默認使用 XVID 編解碼器,但是如果系統沒有安裝該編解碼器,則無法正確保存視頻文件。因此,我們需要使用其他編解碼器來保存視頻。
下面是一個可以通過 FFMPEG 來保存視頻的例子:
import subprocess as sp
import cv2
# 設置 FFMPEG 命令
FFMPEG_BIN = "ffmpeg"
command = [FFMPEG_BIN,
'-y', # 覆蓋輸出文件
'-f', 'rawvideo',
'-pix_fmt', 'bgr24',
'-s', '640x480',
'-r', '25',
'-i', '-',
'-an',
'-vcodec', 'mpeg4',
'output.avi']
# 打開 FFMPEG 進程
pipe = sp.Popen(command, stdin=sp.PIPE)
# 讀取視頻並將幀寫入文件
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 寫入幀
pipe.stdin.write(frame.tostring())
# 顯示幀
cv2.imshow("frame", frame)
if cv2.waitKey(1) == ord("q"):
break
# 關閉 FFMPEG 進程
pipe.stdin.close()
pipe.wait()
# 釋放對象
cap.release()
cv2.destroyAllWindows()
三、調整視頻幀的大小和幀率
在某些情況下,保存視頻時需要將視頻幀的大小和幀率進行調整,這需要使用 resize() 和 cv2.CAP_PROP_FPS 屬性。下面的代碼按照每秒 10 幀,將輸入的圖像的大小調整為 320×240,輸出的視頻的幀率為 30 幀每秒。
import cv2
# 創建 VideoWriter 對象
writer = cv2.VideoWriter("output.avi", cv2.VideoWriter_fourcc(*"XVID"), 30, (320, 240))
# 讀取視頻並將幀寫入文件
cap = cv2.VideoCapture(0)
frame_count = 0
while True:
ret, frame = cap.read()
if not ret:
break
# 調整幀大小
frame = cv2.resize(frame, (320, 240))
# 寫入幀
writer.write(frame)
# 顯示幀
cv2.imshow("frame", frame)
if cv2.waitKey(1) == ord("q"):
break
# 調整幀率
frame_count += 1
if frame_count % 3 == 0:
cap.set(cv2.CAP_PROP_POS_FRAMES, frame_count + 1)
# 釋放對象
cap.release()
writer.release()
cv2.destroyAllWindows()
四、保存為其他視頻格式
VideoWriter 默認使用 AVI 格式保存視頻,但是可以通過更改 fourcc 來保存為其他格式的視頻文件。
import cv2
# 創建 VideoWriter 對象
writer = cv2.VideoWriter("output.mkv", cv2.VideoWriter_fourcc(*"X264"), 30, (640, 480))
# 讀取視頻並將幀寫入文件
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 寫入幀
writer.write(frame)
# 顯示幀
cv2.imshow("frame", frame)
if cv2.waitKey(1) == ord("q"):
break
# 釋放對象
cap.release()
writer.release()
cv2.destroyAllWindows()
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/207210.html