博客 / 詳情

返回

『OpenCV-Python』視頻的讀取和保存

點贊 + 關注 + 收藏 = 學會了

推薦關注 《OpenCV-Python專欄》

上一講介紹了 OpenCV 的讀取圖片的方法,這一講簡單聊聊 OpenCV 讀取和保存視頻。

視頻的來源主要有2種,一種是本地視頻文件,另一種是實時視頻流,比如手機和電腦的攝像頭。

要讀取這兩種視頻的方法都是一樣的,只是傳的參數不同而已。

讀取攝像頭視頻

讀取攝像頭的內容並顯示出來需要幾步

  1. 獲取攝像頭內容
  2. 逐幀渲染

01.gif

import cv2

cap = cv2.VideoCapture(0)

while cap.isOpened():
    # 獲取一幀
    ret, frame = cap.read()

    if not ret:
        print("找不到攝像頭")
        break  # 如果讀取失敗(如視頻結束),退出循環

    cv2.imshow('frame', frame)
    if cv2.waitKey(1) == ord('q'):
        break

# 釋放攝像頭資源並關閉所有窗口
cap.release()
cv2.destroyAllWindows()

解讀一下上面的代碼。

  • 通過 cv2.VideoCapture(0) 讀取視頻,傳入參數 0 表示打開默認攝像頭。對於有多個攝像頭的設備,可以使用 1、2 等參數指定其他攝像頭。
  • 使用 cap.isOpened() 檢查攝像頭是否成功打開。如果失敗,程序將退出。
  • cap.read() 可以讀取視頻裏的1幀,ret 表示讀取是否成功,frame 包含圖像數據。
  • 1幀只有1個畫面,所以通過 while 循環不斷讀取視頻流的內容。
  • cv2.waitKey(1) 設置為 1 毫秒的延時,這樣可以實現幾乎實時的顯示效果。
  • 最後通過 cv2.waitKey(1) == ord('q') 判斷用户有沒有按下“q”鍵,如果按下了就退出循環,然後關閉所有窗口釋放資源。

讀取本地視頻文件

讀取本地視頻文件的操作流程和讀取攝像頭視頻流差不多,最主要的區別是 cv2.waitKey() 裏需要傳入的數值。

02.gif

import cv2

input_video_path = "./01.mov"  # 輸入視頻路徑
cap = cv2.VideoCapture(input_video_path)

while cap.isOpened():
    # 獲取一幀
    ret, frame = cap.read()

    if not ret:
        print("找不到視頻")
        break  # 如果讀取失敗(如視頻結束),退出循環

    cv2.imshow('frame', frame)
    if cv2.waitKey(30) == ord('q'):
        break

# 釋放攝像頭資源並關閉所有窗口
cap.release()
cv2.destroyAllWindows()
  • input_video_path 存放本地視頻的文件地址,需要包含文件類型的後綴名。
  • 把視頻地址丟進 cv2.VideoCapture() 裏就可以讀取到這個視頻了。
  • while 裏的操作和前面讀取攝像頭視頻流一樣,唯一區別是 cv2.waitKey(30) ,這裏我傳入了30,這表示每一幀的顯示時間是30毫秒,這樣視頻播放速度就比較正常。

保存視頻

不管是將攝像頭的視頻保存到本地,還是在本地視頻增加一點濾鏡再保存到本地,操作都是一樣的。

主要有以下幾步操作:

  1. 獲取視頻源
  2. 設置要輸出的視頻路徑、參數(寬、高、幀率)
  3. 逐幀保存視頻

舉個例子,我要將一個彩色的視頻轉成黑白視頻再保存到本地。

03.gif

import cv2

# 指定本地視頻路徑和輸出路徑
input_video_path = "01.mov"       # 輸入視頻路徑
output_video_path = "01_gray.mp4"  # 輸出灰度視頻路徑

# 打開輸入視頻文件
cap = cv2.VideoCapture(input_video_path)

# 檢查視頻是否成功打開
if not cap.isOpened():
    print("Error: Could not open video.")
    exit()

# 獲取原視頻的寬度、高度和幀率
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))

# 創建 VideoWriter 對象,用於保存灰度視頻
fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 視頻編碼格式
out = cv2.VideoWriter(output_video_path, fourcc, fps, (frame_width, frame_height), isColor=False)

# 逐幀讀取視頻、轉換為灰度並保存
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # 將幀轉換為灰度圖像
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 保存灰度幀到輸出視頻
    out.write(gray_frame)

    # 顯示灰度幀(可選)
    cv2.imshow("Gray Video", gray_frame)
    
    # 設置退出條件:按下 'q' 鍵退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 釋放視頻資源並關閉所有窗口
cap.release()
cv2.destroyAllWindows()

説明一下上面的代碼。

  • 讀取視頻:cv2.VideoCapture(input_video_path) 用於讀取視頻文件。
  • 獲取視頻屬性:如幀寬度、高度和幀率等,用於配置輸出視頻。
  • 創建輸出視頻:cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor) 用於創建保存視頻的對象。

    • cv2.VideoWriteroutput_video_path 參數用來指定保存視頻文件的路徑。
    • fourcc 表示視頻編碼格式的四字符代碼,常用的格式有:

      • cv2.VideoWriter_fourcc(*'XVID'): 常用於 .avi 格式的視頻,跨平台兼容性較好。
      • cv2.VideoWriter_fourcc(*'MJPG'): 使用 Motion JPEG 編碼,也可以用於 .avi 格式。
      • cv2.VideoWriter_fourcc(*'mp4v'): 常用於 .mp4 格式的視頻。
      • cv2.VideoWriter_fourcc(*'DIVX'): 支持 .avi 格式。
    • fps 表示視頻的幀率,即每秒幀數(Frames Per Second)。幀率決定視頻的播放速度和流暢度。常用的幀率數值有24、30、60。在上面的例子中使用的是原視頻的幀率。
    • frameSize 用於設置輸出視頻幀的寬度和高度,單位是像素。
    • isColor 指示視頻是否是彩色。默認是 True 表示才是。
  • 循環讀取和保存幀:每一幀讀取後可以對幀進行處理,然後寫入到輸出視頻中。
  • 釋放資源:處理完成後釋放資源,確保文件保存正確。

以上就是本文的全部內容。加上上一篇介紹如何讀取和保存圖片,學習 OpenCV 需要的“材料”已經準備好了。接下來幾講都是介紹 OpenCV 的基礎用法,也就是學習“如何加工這些材料”。基礎紮實後再講解幾個實戰案例。

點贊 + 關注 + 收藏 = 學會了

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.