OpenCV Python - 從攝像頭捕獲影片



透過使用 OpenCV 庫中的 **VideoCapture()** 函式,可以非常輕鬆地在 OpenCV 視窗中從攝像頭捕獲即時流。

此函式需要一個裝置索引作為引數。您的計算機可能連線了多個攝像頭。它們由從 0 開始的索引列舉,內建網路攝像頭為 0。該函式返回一個 VideoCapture 物件。

cam = cv.VideoCapture(0)

開啟攝像頭後,我們可以藉助 **read()** 函式讀取其連續幀。

ret,frame = cam.read()

read() 函式讀取下一個可用的幀並返回一個值(True/False)。此幀現在使用 **cvtColor()** 函式渲染為所需的色彩空間,並在 OpenCV 視窗中顯示。

img = cv.cvtColor(frame, cv.COLOR_BGR2RGB)
# Display the resulting frame
cv.imshow('frame', img)

要將當前幀捕獲到影像檔案,可以使用 **imwrite()** 函式。

cv2.imwrite(“capture.png”, img)

要將來自攝像頭的即時流儲存到影片檔案,OpenCV 提供了 VideoWriter() 函式。

cv.VideoWriter( filename, fourcc, fps, frameSize)

fourcc 引數是影片編解碼器的標準化程式碼。OpenCV 支援各種編解碼器,例如 DIVX、XVID、MJPG、X264 等。fps 和 framesize 引數取決於影片捕獲裝置。

VideoWriter() 函式返回一個 VideoWrite 流物件,捕獲的幀將依次寫入迴圈中。最後,釋放幀和 VideoWriter 物件以完成影片的建立。

示例

以下示例從內建網路攝像頭讀取即時影片流並將其儲存到 output.avi 檔案。

import cv2 as cv
cam = cv.VideoCapture(0)
cc = cv.VideoWriter_fourcc(*'XVID')
file = cv.VideoWriter('output.avi', cc, 15.0, (640, 480))
if not cam.isOpened():
   print("error opening camera")
   exit()
while True:
   # Capture frame-by-frame
   ret, frame = cam.read()
   # if frame is read correctly ret is True
   if not ret:
      print("error in retrieving frame")
      break
   img = cv.cvtColor(frame, cv.COLOR_BGR2RGB)
   cv.imshow('frame', img)
   file.write(img)

   
   if cv.waitKey(1) == ord('q'):
      break

cam.release()
file.release()
cv.destroyAllWindows()
廣告