更新時(shí)間:2021-05-27 來源:黑馬程序員 瀏覽量:
在OpenCV中我們要獲取一個(gè)視頻,需要?jiǎng)?chuàng)建一個(gè)VideoCapture對象,指定你要讀取的視頻文件:
1. 創(chuàng)建讀取視頻的對象
cap = cv.VideoCapture(filepath)
參數(shù):
filepath: 視頻文件路徑
視頻的屬性信息
2.1 獲取視頻的某些屬性
retval = cap.get(propId)
參數(shù):
propId: 從0到18的數(shù)字,每個(gè)數(shù)字表示視頻的屬性
常用屬性有:
image-20191016164053661
2.2 修改視頻的屬性信息
cap.set(propId,value)
參數(shù):
proid: 屬性的索引,與上面的表格相對應(yīng)
value: 修改后的屬性值
3. 判斷圖像是否讀取成功
isornot = cap.isOpened()
若讀取成功則返回true,否則返回False
4. 獲取視頻的一幀圖像
ret, frame = cap.read()
參數(shù):
ret: 若獲取成功返回True,獲取失敗,返回False
Frame: 獲取到的某一幀的圖像
調(diào)用cv.imshow()顯示圖像,在顯示圖像時(shí)使用cv.waitkey()設(shè)置適當(dāng)?shù)某掷m(xù)時(shí)間,如果太低視頻會(huì)播放的非常快,如果太高就會(huì)播放的非常慢,通常情況下我們設(shè)置25ms就可以了。
最后,調(diào)用cap.realease()將視頻釋放掉
示例:
import numpy as np import cv2 as cv # 1.獲取視頻對象 cap = cv.VideoCapture('DOG.wmv') # 2.判斷是否讀取成功 while(cap.isOpened()): # 3.獲取每一幀圖像 ret, frame = cap.read() # 4. 獲取成功顯示圖像 if ret == True: cv.imshow('frame',frame) # 5.每一幀間隔為25ms if cv.waitKey(25) & 0xFF == ord('q'): break # 6.釋放視頻對象 cap.release() cv.destoryAllwindows()
在OpenCV中我們保存視頻使用的是VedioWriter對象,在其中指定輸出文件的名稱,如下所示:
1. 創(chuàng)建視頻寫入的對象
out = cv2.VideoWriter(filename,fourcc, fps, frameSize)
參數(shù):
filename:視頻保存的位置
fourcc:指定視頻編解碼器的4字節(jié)代碼
fps:幀率
frameSize:幀大小
2. 設(shè)置視頻的編解碼器,如下所示,
retval = cv2.VideoWriter_fourcc( c1, c2, c3, c4 )
參數(shù):
c1,c2,c3,c4: 是視頻編解碼器的4字節(jié)代碼,在fourcc.org中找到可用代碼列表,與平臺(tái)緊密相關(guān),常用的有:
在Windows中:DIVX(.avi)
在OS中:MJPG(.mp4),DIVX(.avi),X264(.mkv)。
利用cap.read()獲取視頻中的每一幀圖像,并使用out.write()將某一幀圖像寫入視頻中。
使用cap.release()和out.release()釋放資源。
示例:
import cv2 as cv import numpy as np # 1. 讀取視頻 cap = cv.VideoCapture("DOG.wmv") # 2. 獲取圖像的屬性(寬和高,),并將其轉(zhuǎn)換為整數(shù) frame_width = int(cap.get(3)) frame_height = int(cap.get(4)) # 3. 創(chuàng)建保存視頻的對象,設(shè)置編碼格式,幀率,圖像的寬高等 out = cv.VideoWriter('outpy.avi',cv.VideoWriter_fourcc('M','J','P','G'), 10, (frame_width,frame_height)) while(True): # 4.獲取視頻中的每一幀圖像 ret, frame = cap.read() if ret == True: # 5.將每一幀圖像寫入到輸出文件中 out.write(frame) else: break # 6.釋放資源 cap.release() out.release() cv.destroyAllWindows()
總結(jié)
讀取視頻
讀取視頻:cap = cv.VideoCapture()
判斷讀取成功:cap.isOpened()
讀取每一幀圖像:ret,frame = cap.read()
獲取屬性:cap.get(proid)
設(shè)置屬性:cap.set(proid,value)
資源釋放:cap.release()
保存視頻
保存視頻: out = cv.VideoWrite()
視頻寫入:out.write()
資源釋放:out.release()
猜你喜歡: