首頁 > 軟體

基於Python實現捕獲,播放和儲存攝像頭視訊

2022-04-14 10:00:03

前幾天有個讀者在粉絲群裡面提了一個問題:

Python 怎樣提高視訊清晰度和對比度?

我之前沒有涉及到使用 Python 操作視訊這一方面,所以當時很抱歉地跟讀者朋友說暫未涉及。

這兩天想了下,感覺應該補一下這一塊的內容,一方面是增加自己涉獵的廣度,另一方面也可以給粉絲答疑解惑。

今天先分享一下 Python 操作視訊最基本的操作,包括讀取和播放視訊和儲存視訊。

讀取視訊

要捕獲視訊,你需要建立一個 VideoCapture 物件。它的引數可以是裝置索引或視訊檔的名稱。所以,我們讀取視訊有兩種方式,分別是從相機中讀取視訊和從檔案中讀取視訊。

從相機中讀取視訊

對於有攝像頭的裝置,例如帶攝像頭的筆記型電腦,我們可以直接調起電腦的攝像頭,讀取攝像頭的視訊流。

import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():
    print("Cannot open camera")
    exit()
while True:
    # 逐幀捕獲
    ret, frame = cap.read()
    # 如果正確讀取幀,ret為True
    if not ret:
        break
    # 顯示結果幀
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
# 完成所有操作後,釋放捕獲器
cap.release()
cv.destroyAllWindows()

這裡我向 VideoCapture 物件傳入了引數 0,表示裝置索引,裝置索引就是指定哪個攝像頭的數位。正常情況下,一個攝像頭會被連線(就像我的情況一樣)。所以我簡單地傳0。你可以通過傳遞1來選擇第二個相機,以此類推。

cap.isOpened() 用來判斷是否捕獲到視訊。

cap.read() 返回布林值(True/ False)。如果正確讀取了幀,它將為True。因此,你可以通過檢查此返回值來檢查視訊的結尾。

cv.imshow 方法用來顯示視訊的幀。我們播放視訊的原理就是逐幀播放。

在最後,不要忘記通過 cap.release() 釋放俘虜。

執行這段程式碼,你就可以看到一個彈窗實時地播放你電腦攝像頭中的影象了。

從檔案中播放視訊

與從相機捕獲相同,只是用視訊檔名更改攝像機索引。

另外,在顯示視訊時,可以通過 cv.waitKey() 來控制視訊播放的速度。如果設定太小,則視訊將非常快,相當於倍速播放;而如果太大,則視訊將變得很慢,相當於延遲播放。正常情況下25毫秒就可以了。

import cv2 as cv
cap = cv.VideoCapture('video.mp4')
while cap.isOpened():
    ret, frame = cap.read()
    # 如果正確讀取幀,ret為True
    if not ret:
        break
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
cap.release()
cv.destroyAllWindows()

執行這段程式碼,你就可以看到一個彈窗播放你選擇的視訊檔了。

儲存視訊

從相機讀取視訊,我們可以將視訊儲存到本地。我們捕捉一個視訊,一幀一幀地處理,如果我們想要儲存這個視訊,非常簡單,只需使用 cv.VideoWriter()

cv.VideoWriter() 有5個引數:

  • 引數1:輸出檔名,例如: output.mp4。
  • 引數2:FourCC 程式碼,FourCC 是用於指定視訊編解碼器的4位元組程式碼。
  • 引數3:影格率的數量。
  • 引數4:幀大小。
  • 引數5:顏色標誌。如果為 True,正常顏色輸出,否則就是灰色影象輸出。

關於 FourCC 與視訊格式的對照關係,我列舉了一些常見的格式:

cv2.VideoWriter_fourcc(‘P’,‘I’,‘M’,‘1’) = MPEG-1 codec

cv2.VideoWriter_fourcc(‘M’,‘J’,‘P’,‘G’) = motion-jpeg codec --> mp4v

cv2.VideoWriter_fourcc(‘M’, ‘P’, ‘4’, ‘2’) = MPEG-4.2 codec

cv2.VideoWriter_fourcc(‘D’, ‘I’, ‘V’, ‘3’) = MPEG-4.3 codec

cv2.VideoWriter_fourcc(‘D’, ‘I’, ‘V’, ‘X’) = MPEG-4 codec --> avi

cv2.VideoWriter_fourcc(‘U’, ‘2’, ‘6’, ‘3’) = H263 codec

cv2.VideoWriter_fourcc(‘I’, ‘2’, ‘6’, ‘3’) = H263I codec

cv2.VideoWriter_fourcc(‘F’, ‘L’, ‘V’, ‘1’) = FLV1 codec

儲存視訊的程式碼:

import cv2 as cv
cap = cv.VideoCapture(0)
# 定義編解碼器並建立VideoWriter物件
fourcc = cv.VideoWriter_fourcc(*'MJPG')
out = cv.VideoWriter('output.mp4', fourcc, 20.0, (640,  480))
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    frame = cv.flip(frame, 1)
    # 寫翻轉的框架
    out.write(frame)
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
# 完成工作後釋放所有內容
cap.release()
out.release()
cv.destroyAllWindows()

執行這段程式碼,你就可以在程式碼目錄下找到一個 output.mp4 的視訊檔了。

上面幾段程式碼中,如果想要退出視訊操作,敲擊鍵盤的 q 就可以。

到此這篇關於基於Python實現捕獲,播放和儲存攝像頭視訊的文章就介紹到這了,更多相關Python攝像頭視訊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com