Python – OpenCV教學, 影片動畫基本處理 VideoCapture範例代碼(使用相機攝影,讀取影片,儲存影片, cvtColor, waitKey)

這篇文章主要要介紹下面三點。

  • 如何透過OpenCV讀取影像,儲存影像
  • 如何透過電腦相機攝影
  • 學習cv2.VideoCapture()以及cv2.VideoWriter()兩種函數

相機攝影

OpenCV有內建直接使用相機的功能,在這邊我們先看到使用電腦內建相機後將所攝影的影像轉換成黑白的影像後輸出的範例代碼。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(1):
  ret, frame = cap.read()

  gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

  cv2.imshow('video', gray)
  if cv2.waitKey(1) & 0xFF == 27:
    break

cap.release()
cv2.destroyAllWindows()

接著來一個步驟一個步驟的說明代碼的意思。首先看到

cap = cv2.VideoCapture(0)

在使用相機攝影時我們會需要用到VideoCapture型的Object,首先我們要先指定要開啟的相機。在這邊因為電腦大部分都只有一個相機,所以是輸入0,如果是有複數個相機的時候指定-1的話就可以使用電腦內建的相機。

在這邊只要定義了有VideoCapture的Object的話,就可以以1FPS為單位進行攝影。當然,在結束攝影時一定要記得解除相機的使用。

cap.read()

接著我們來看到cap.read()的意思。

cap.read()會回傳兩個值,一個是bool型的值,另一個是影像的像素成分。

在這邊看到的ret就是儲存了cap.read()回傳的bool值。如果影像成功讀取的話就會在ret中代入True,相反的如果讀取失敗的話就回變成False。

而剩下的frame就是讀取影像的像素成分

cv2.cvtColor()

cvtColor()函數是用來轉換影像色彩的函數,使用方式可以看到下面

  • cvtColor(影像成分, 影像轉換方式)

作者在這邊是將影像轉換成了最簡單的灰色,如果有想要嘗試轉換成其他色彩的話可以參考下面OpenCV的網站。

Color Space Conversions

imshow()

再來就是之前文章中有介紹過的imshow()的函數,在使用OpenCV時如果想要將影像輸出的話就會透過imshow(視窗名稱, 影像成分)來輸出

cv2.waitKey()

cv2.waitKey()這個函數是為了從鍵盤輸入文字的函數。索引數的部分可以指定秒數(毫秒),在指定的時間內可以接收鍵盤輸入的文字。也就是說如果沒有從鍵盤輸入任何文字的話程式就會一直執行。

這邊的==27的部分是電腦的esc鍵的ASCII Code。也就是說只要按下esc鍵就會將影像視窗關閉。

讀取影像

從資料夾中讀取影像的方式其實跟利用攝影機的方式很類似,我們可以看到下面的範例代碼。

import numpy as np
import cv2

cap = cv2.VideoCapture('sample.mp4')

while(1):
  ret, frame = cap.read()

  gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

  cv2.imshow('video', gray)
  if cv2.waitKey(1) & 0xFF == 27:
    break

cap.release()
cv2.destroyAllWindows()

其實也就是指定cv2.VideoCapture中的檔案路徑就可以了。其他的意思因為上面已經說明過了這邊就省略。

儲存影像

最後我們來看看如何透過相機攝影並將檔案儲存起來。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
output = cv2.VideoWriter('output.mp4', fourcc, 20, (1280, 720))

if not cap.isOpened():
  print('Fail')
  exit()

while(1):
  ret, frame = cap.read()
  
  if not ret:
    print('did not get frame')
    break
  output.write(frame)
  cv2.imshow('frame', frame)
  if cv2.waitKey(1) & 0xFF == 27:
    break
  
cap.release()
output.release()
cv2.destroyAllWindows()

在儲存影像時,我們要先注意有fourcc這個功能。fourcc主要是來定義影像的codec(編解碼器),儲存的影像檔案要符合自己所用的電腦的OS能開啟的檔案才有辦法儲存。

這邊作者因為是使用macOS,因此儲存檔案名稱會是mp4所以在這邊指定fourcc為’mp4v’。跟fourcc相關的部分可以參考以下內容。

Fourcc

另外要注意,在實戰中有可能會發生儲存的影像打不開或是無法讀取等問題,在這邊要注意自己電腦的相機大小是不是有指定錯誤。作者的電腦的像素大小事(1280, 720)因此才在這邊指定(1280, 720),各位要記得先查詢自己的電腦相機大小。

或是可以透過下面的代碼直接取得相機大小。

width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

就可以直接代入成(width, height)了。

如果影片還是沒影辦法讀取的話可能是因為fourcc指定不符合電腦OS系統,如果是windows系統的話可以試試看cv2.VideoWriter_fourcc(M’, ‘J’, ‘P’, ‘G’)並指定檔案名稱為mov檔

留言