標籤:方法 旋轉 pre else 資訊 ini 查看 依賴 否則
5 視頻
目標
? 學會讀取視頻檔案,顯示視頻,儲存視頻檔案
? 學會從網路攝影機擷取並顯示視頻
? 你將會學習到這些函數:cv2.VideoCapture(),cv2.VideoWrite()
5.1 用網路攝影機捕獲視頻
我們經常需要使用網路攝影機捕獲即時映像。OpenCV 為這中應用提供了一個
非常簡單的介面。讓我們使用網路攝影機來捕獲一段視頻,並把它轉換成灰階視頻
顯示出來。從這個簡單的任務開始吧。
為了擷取視頻,你應該建立一個 VideoCapture 對象。他的參數可以是
裝置的索引號,或者是一個視頻檔案。裝置索引號就是在指定要使用的網路攝影機。
一般的膝上型電腦都有內建網路攝影機。所以參數就是 0。你可以通過設定成 1 或
者其他的來選擇別的網路攝影機。之後,你就可以一幀一幀的捕獲視頻了。但是最
後,別忘了停止捕獲視頻。
import numpy as npimport cv2cap = cv2.VideoCapture(0)while(True): # Capture frame-by-frame ret, frame = cap.read() # Our operations on the frame come here gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Display the resulting frame cv2.imshow(‘frame‘,gray) if cv2.waitKey(1) & 0xFF == ord(‘q‘): break# When everything done, release the capturecap.release()cv2.destroyAllWindows()
cap.read() 返回一個布爾值(True/False)。如果幀讀取的是正確的,
就是 True。所以最後你可以通過檢查他的傳回值來查看視頻檔案是否已經到
了結尾。
有時 cap 可能不能成功的初始化網路攝影機裝置。這種情況下上面的代碼會報
錯。你可以使用 cap.isOpened(),來檢查是否成功初始化了。如果傳回值是
True,那就沒有問題。否則就要使用函數 cap.open()。
你可以使用函數 cap.get(propId) 來獲得視頻的一些參數資訊。這裡
propId 可以是 0 到 18 之間的任何整數。每一個數代表視頻的一個屬性,見
下表
其中的一些值可以使用 cap.set(propId,value) 來修改,value 就是
你想要設定成的新值。
例如,我可以使用 cap.get(3) 和 cap.get(4) 來查看每一幀的寬和高。
預設情況下得到的值是 640X480。但是我可以使用 ret=cap.set(3,320)
和 ret=cap.set(4,240) 來把寬和高改成 320X240。
注意:當你的程式報錯時,你首先應該檢查的是你的網路攝影機是否能夠在其他程
序中正常工作(比如 linux 下的 Cheese)。
5.2 從檔案中播放視頻
與從網路攝影機中捕獲一樣,你只需要把裝置索引號改成視頻檔案的名字。在
播放每一幀時,使用 cv2.waiKey() 設定適當的期間。如果設定的太低視
頻就會播放的非常快,如果設定的太高就會播放的很慢(你可以使用這種方法
控制視頻的播放速度)。通常情況下 25 毫秒就可以了。
import numpy as npimport cv2cap = cv2.VideoCapture(‘vtest.avi‘)while(cap.isOpened()): ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow(‘frame‘,gray) if cv2.waitKey(1) & 0xFF == ord(‘q‘): breakcap.release()cv2.destroyAllWindows()
注意:你應該確保你已經裝了合適版本的 ffmpeg 或者 gstreamer。如果你裝
錯了那就比較頭疼了。
5.3 儲存視頻
在我們捕獲視頻,並對每一幀都進行加工之後我們想要儲存這個視頻。對
於圖片來時很簡單只需要使用 cv2.imwrite()。但對於視頻來說就要多做點工
作。
這次我們要建立一個 VideoWriter 的對象。我們應該確定一個輸出檔案
的名字。接下來指定 FourCC 編碼(下面會介紹)。播放頻率和幀的大小也都
需要確定。最後一個是 isColor 標籤。如果是 True,每一幀就是彩色圖,否
則就是灰階圖。
FourCC 就是一個 4 位元組碼,用來確定視頻的編碼格式。可用的編碼列表
可以從fourcc.org查到。這是平台依賴的。下面這些編碼器對我來說是有用個。
? In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID is
more preferable. MJPG results in high size video. X264 gives
very small size video)
? In Windows: DIVX (More to be tested and added)
? In OSX : (I don’t have access to OSX. Can some one fill this?)
FourCC 碼以下面的格式傳給程式,以 MJPG 為例:
cv2.cv.FOURCC(‘M‘,‘J‘,‘P‘,‘G‘) 或者 cv2.cv.FOURCC(*‘MJPG‘)。
下面的代碼是從網路攝影機中捕獲視頻,沿水平方向旋轉每一幀並儲存它。
import numpy as npimport cv2cap = cv2.VideoCapture(0)# Define the codec and create VideoWriter objectfourcc = cv2.VideoWriter_fourcc(*‘XVID‘)out = cv2.VideoWriter(‘output.avi‘,fourcc, 20.0, (640,480))while(cap.isOpened()): ret, frame = cap.read() if ret==True: frame = cv2.flip(frame,0) # write the flipped frame out.write(frame) cv2.imshow(‘frame‘,frame) if cv2.waitKey(1) & 0xFF == ord(‘q‘): break else: break# Release everything if job is finishedcap.release()out.release()cv2.destroyAllWindows()
更多資源
練習
[OpenCV-Python] OpenCV 中的 Gui (五) 視頻