1、從相機中讀取視頻
要捕獲視頻,你需要創建一個 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)
.
2、從文件播放視頻
它與從相機捕獲相同,只是用視頻文件名更改攝像機索引。另外,在顯示框架時,請使用適當的時間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()
3、保存視頻
我們捕捉一個視頻,一幀一幀地處理,我們想要保存這個視頻。對於圖像,它非常簡單,只需使用 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()
參考:http://woshicver.com/ThirdSection/2_2_%E8%A7%86%E9%A2%91%E5%85%A5%E9%97%A8/