1. 程式人生 > 程式設計 >Python OpenCV讀取顯示視訊的方法示例

Python OpenCV讀取顯示視訊的方法示例

目標

  • 學習讀取視訊,顯示視訊和儲存視訊。
  • 學習從相機捕捉並顯示它。
  • 你將學習以下功能:cv.VideoCapture(),cv.VideoWriter()

從相機中讀取視訊

通常情況下,我們必須用攝像機捕捉實時畫面。提供了一個非常簡單的介面。讓我們從攝像頭捕捉一段視訊(我使用的是我膝上型電腦內建的網路攝像頭) ,將其轉換成灰度視訊並顯示出來。只是一個簡單的任務開始。

要捕獲視訊,你需要建立一個 VideoCapture 物件。它的引數可以是裝置索引或視訊檔案的名稱。裝置索引就是指定哪個攝像頭的數字。正常情況下,一個攝像頭會被連線(就像我的情況一樣)。所以我簡單地傳0(或-1)。你可以通過傳遞1來選擇第二個相機,以此類推。在此之後,你可以逐幀捕獲。但是在最後,不要忘記釋放俘虜。

import numpy as np
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:
    print("Can't receive frame (stream end?). Exiting ...")
    break
  # 我們在框架上的操作到這裡
  gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
  # 顯示結果幀e
  cv.imshow('frame',gray)
  if cv.waitKey(1) == ord('q'):
    break
# 完成所有操作後,釋放捕獲器
cap.release()
cv.destroyAllWindows()

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

有時,cap可能尚未初始化捕獲。在這種情況下,此程式碼顯示錯誤。你可以通過cap.isOpened()方法檢查它是否已初始化。如果是True,那麼確定。否則,使用cap.open()開啟它。

你還可以使用cap.get(propId)方法訪問該視訊的某些功能,其中propId是0到18之間的一個數字。每個數字表示視訊的屬性(如果適用於該視訊),並且可以顯示完整的詳細資訊在這裡看到:cv::VideoCapture::get()。其中一些值可以使用cap.set(propId,value)進行修改。value是你想要的新值。

例如,我可以通過cap.get(cv.CAP_PROP_FRAME_WIDTH)和cap.get(cv.CAP_PROP_FRAME_HEIGHT)檢查框架的寬度和高度。預設情況下,它的解析度為640x480。但我想將其修改為320x240。只需使用和即可。ret = cap.set(cv.CAP_PROP_FRAME_WIDTH,320) and ret = cap.set(cv.CAP_PROP_FRAME_HEIGHT,240).

注意
如果出現錯誤,請確保使用任何其他相機應用程式(例如Linux中的Cheese)都可以正常使用相機。

從檔案播放視訊

它與從相機捕獲相同,只是用視訊檔名更改攝像機索引。另外,在顯示框架時,請使用適當的時間cv.waitKey()。如果太小,則視訊將非常快,而如果太大,則視訊將變得很慢(嗯,這就是顯示慢動作的方式)。正常情況下25毫秒就可以了。

import numpy as np
import cv2 as cv
cap = cv.VideoCapture('vtest.avi')
while cap.isOpened():
  ret,frame = cap.read()
  # 如果正確讀取幀,ret為True
  if not ret:
    print("Can't receive frame (stream end?). Exiting ...")
    break
  gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
  cv.imshow('frame',gray)
  if cv.waitKey(1) == ord('q'):
    break
cap.release()
cv.destroyAllWindows()

注意
確保安裝了正確的 ffmpeg 或 gstreamer 版本。有時,使用視訊捕獲(Video Capture)是一件令人頭疼的事情,主要原因是錯誤地安裝了 ffmpeg / gstreamer。

儲存視訊

所以我們捕捉一個視訊,一幀一幀地處理,我們想要儲存這個視訊。對於影象,它非常簡單,只需使用 cv.imwrite()。這裡還需要做一些工作。

這次我們建立一個 VideoWriter 物件。我們應該指定輸出檔名(例如: output.avi)。然後我們應該指定 FourCC 程式碼(詳見下一段)。然後傳遞幀率的數量和幀大小。最後一個是顏色標誌。如果為 True,編碼器期望顏色幀,否則它與灰度幀一起工作。

FourCC:http://en.wikipedia.org/wiki/FourCC 是用於指定視訊編解碼器的4位元組程式碼。可用程式碼列表可在fourcc.org中:http://www.fourcc.org/codecs.php 找到。它取決於平臺。遵循編解碼器對我來說效果很好。

在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2。(最好使用XVID。MJPG會生成大尺寸的視訊。X264會生成非常小的尺寸的視訊)
在Windows中:DIVX(尚待測試和新增)
在OSX中:MJPG(.mp4),DIVX(.avi),X264(.mkv)。
FourCC程式碼作為MJPG的cv.VideoWriter_fourcc('M','J','P','G')or cv.VideoWriter_fourcc(*'MJPG')傳遞。

在從攝像機捕獲的程式碼下面,沿垂直方向翻轉每一幀並儲存。

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# 定義編解碼器並建立VideoWriter物件
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.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 = cv.flip(frame,0)
  # 寫翻轉的框架
  out.write(frame)
  cv.imshow('frame',frame)
  if cv.waitKey(1) == ord('q'):
    break
# 完成工作後釋放所有內容
cap.release()
out.release()
cv.destroyAllWindows()

到此這篇關於 Python OpenCV讀取顯示視訊的方法示例的文章就介紹到這了,更多相關 Python OpenCV讀取顯示視訊內容請搜素我們以前的文章或下面相關文章,希望大家以後多多支援我們!