OpenCV 中的 VideoWriter 類

一、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-hk/n/207210.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-08 14:21
下一篇 2024-12-08 14:21

相關推薦

  • 如何在PyCharm中安裝OpenCV?

    本文將從以下幾個方面詳細介紹如何在PyCharm中安裝OpenCV。 一、安裝Python 在安裝OpenCV之前,請確保已經安裝了Python。 如果您還沒有安裝Python,可…

    編程 2025-04-29
  • Python OpenCV 直線檢測

    本文將介紹在Python OpenCV中進行直線檢測的方法,主要涉及到圖像的邊緣檢測、霍夫變換和繪製直線等操作。 一、邊緣檢測 由於直線檢測是從圖像的邊緣開始的,因此必須先找到圖像…

    編程 2025-04-29
  • Opencv 實現讀取 BMP 圖片

    Opencv 是一個基於 C/C++ 語言的開源計算機視覺庫,可以用於圖像處理、特徵識別、目標跟蹤、機器學習等領域。在圖像處理中,讀取 BMP 圖片是常見操作之一。 一、打開 BM…

    編程 2025-04-27
  • opencv鼠標繪圖

    本文將為您詳細介紹如何使用opencv在原始圖片上進行鼠標繪圖。 一、準備工作 在開始繪製之前,您需要先準備好以下的工作: 1、安裝opencv庫,可以通過pip install …

    編程 2025-04-27
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • OpenCV的全面介紹

    OpenCV是一款強大的開源計算機視覺庫,它包含了各種用於圖像和視頻處理,圖像識別和機器學習的函數,它可以用於開發實時的計算機視覺軟件和系統,特別適用於圖像處理、物體識別、人臉識別…

    編程 2025-04-25
  • Opencv CUDA編譯用法介紹

    本文將從多個方面對Opencv CUDA編譯進行詳細的闡述和解讀。通過以下小標題,我們將詳細介紹如何進行編譯。 一、環境搭建 在使用CUDA進行加速之前,需要進行CUDA的環境搭建…

    編程 2025-04-25
  • 詳解OpenCV高斯濾波

    一、高斯濾波的介紹 OpenCV高斯濾波是一種平滑圖像的處理方法,通常用於去除噪聲、模糊化圖像等。它的原理是利用高斯函數進行加權平均,從而減少噪聲的干擾。 在圖像處理中,噪聲是一種…

    編程 2025-04-25
  • Clion配置OpenCV

    Clion是一個功能強大的跨平台集成開發環境,但要開發圖像處理、計算機視覺等相關領域應用,需要將OpenCV集成到Clion中,才能方便地進行開發。本文將介紹如何在Clion中配置…

    編程 2025-04-24
  • OpenCV之cv2.imshow()

    一、cv2.imshow()介紹 cv2.imshow()是OpenCV中顯示圖像的主要函數之一。它可以顯示傳遞給它的圖像窗口,或者將圖像作為選定窗口的內容。cv2.imshow(…

    編程 2025-04-24

發表回復

登錄後才能評論