內容來自OpenCV-Python Tutorials 自己翻譯整理
目標:
讀取視頻、顯示視頻、保存視頻使用攝像頭拍攝并顯示學習cv2.VideoCapture(), cv2.VideoWriter()函數使用攝像頭拍攝視頻: (我的用的是筆記本電腦上面的攝像頭) OpenCV 提供了一個非常簡單的接口。我們把視頻轉換成黑白格式,然后顯示出來。
首先要創建一個VideoCapture對象。參數可以是設備標示(device index)或是一個視頻文件的名稱。設備標示是指定使用哪個攝像頭的編號。通常一個攝像頭會連接上。所以只需要傳遞參數0或者-1??梢赃x擇第二個攝像頭通過傳遞參數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,所以可以通過返回值檢查。
有時,cap可能沒有初始化攝像頭,可以檢查是否初始化或者使用cap.isOpened() 函數,如果返回True則繼續,否則使用cap.open()
可以使用cap.get(PRoid)函數來設置視頻的屬性,proid是0到18的數字每個數組表示一個視頻的屬性,具體見Property Identifier 其中一些屬性可以是用cap.set(proid,value)方法修改
例如,使用cap.get(3)和cap.get(4)獲得每一幀的寬度和高度,獲得的結果是640和480,可以把它修改成320×240 ret = cap.set(3,320) ret = cap.set(4,240)
#!/usr/bin/env python# coding=utf-8import cv2import numpy as npfrom matplotlib import pyplot as pltcap = cv2.VideoCapture(0)ret = cap.set(3,320)ret = cap.set(4,240)while(True): 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()(不要把set寫到循環里,否則會很卡頓)
播放視頻文件: 只需要把VideoCapture里面的攝像頭標示改成文件名即可,如果視頻很小,播放的太快,可以使用參數cv2.waitKey()函數,設置成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()存儲視頻: 要把攝像機拍攝到的視頻按幀存起來可以是用cv2.imwrite()函數
首先建立一個VideoWriter對象,然后指定要保存的文件名,例如output.avi。接下來使用FourCC,接下來傳遞每秒的幀數和幀的大小參數,最后是isColor標記,如果該標記為真,將得到彩色的圖片。
FourCC 是用于指定視頻編解碼器 4 字節代碼。代碼可以在fourcc.org上找到,該代碼是平臺相關的。(本人機器為Ubuntu 14.04)
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()得到的視頻是掉轉過來的
新聞熱點
疑難解答