1、從視頻文件獲取圖像
使用cap = cv2.VideoCapture(『文件名稱』)構建視頻文件的cap實例。cap.read()方法逐幀提取視頻,每一幀為一幅圖像,cap.read()方法返回的是一個二元組,下標0的元素值為True或False,如果為Flase表示讀取文件完成。下標1的元素為圖像對象,也是一個numpy數組類型的數據。cap.isOpened()用來檢查cap實例是否已打開。cap.release()釋放實例。下面這個例子中讀取視頻文件並顯示,達到播放的效果,同時加入了waitKey()返回值的判斷,輸入按鍵』Q』或者』q』就可以退出循環。在這裡waityKey()返回的數值和0xff相與後再和字符的ord()值比較,是為了規避某些系統中waitKey()返回的數值在高位元組為非0值的情況。
import cv2
cap = cv2.VideoCapture('..\vtest.avi')
while cap.isOpened():
ret, img = cap.read()
if ret is not True:
print("讀取完成,退出")
break
#處理img
cv2.imshow('vedio', img)
#檢查按鍵
key = cv2.waitKey(20) & 0xff
if key == ord('q') or key == ord('Q') :
break
print('cap.isOpened():',cap.isOpened())
cap.release()
print('cap.isOpened():',cap.isOpened())運行結果:
cap.isOpened(): True
cap.isOpened(): False從運行結果看,cap.release()前cap.isOpened()的返回值一直為True。
2、從動態圖片獲取圖像
使用VideoCapture(文件名)方法打開gif格式的圖片,操作過程和上述普通的視頻文件類似。
3、從相機獲取圖像
打開相機需要用相機的設備編號(數值型整數)作為入參傳入VideoCapture(相機編號),比如cap = cv2.VideoCapture(0)構建編號為0的相機訪問實例,第2台相機則傳入1,以此類推,後續步驟的處理方法和讀取視頻文件一樣。
import cv2
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, img = cap.read()
if ret is not True:
print("讀取失敗,退出")
break
#處理img
cv2.imshow('vedio', img)
#檢查按鍵
key = cv2.waitKey(20) & 0xff
if key == ord('q') or key == ord('Q') :
break
print('cap.isOpened():',cap.isOpened())
cap.release()
print('cap.isOpened():',cap.isOpened())4、寫入視頻文件
寫視頻文件需要創建VideoWriter對象,依次傳入4個參數:
- 第1個為文件名稱;
- 第2個為編碼方式,其中編碼方式和文件名稱後綴有對應關係;
- 第3個參數為每秒寫入的幀數,參考數值為25,符合人眼習慣;
- 第4個參數是圖像大小,int類型;
常用的文件名稱後綴和編碼方式的對應關係有:
| 文件後綴 | 編碼方式 |
| avi | XVID |
| avi | MJPG |
| avi | mp4v(小寫) |
| mp4 | mp4v(小寫) |
編碼方式需要創建VideoWriter_fourcc對象,比如可以用下面的2種方式創建MJPG類型的編碼:
fourcc=cv2.VideoWriter_fourcc('M','J','P','G')
fourcc=cv2.VideoWriter_fourcc(*'MJPG')圖像大小可以通過cat.get(propId)方法獲取,但是該方法獲取的是float類型,需要轉換為int類型再傳入VideoWriter。
cap = cv2.VideoCapture(0)
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
width = int(width)
height = int(height)下面是一個創建XVID、MJPG、mp4v等3種編碼方式視頻文件的例子:
import cv2
#獲取圖像寬高
cap = cv2.VideoCapture(0)
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
width = int(width)
height = int(height)
print(width,height)
#創建VideoWriter對象
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 25.0, (width, height))
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out2 = cv2.VideoWriter('output2.avi', fourcc, 25.0, (width, height))
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out3 = cv2.VideoWriter('output3.mp4', fourcc, 25.0, (width, height))
while cap.isOpened():
ret, img = cap.read()
print(img.shape)
if ret is not True:
print("讀取失敗,退出")
break
#處理img
cv2.imshow('vedio', img)
out.write(img)
out2.write(img)
out3.write(img)
#檢查按鍵
key = cv2.waitKey(1) & 0xff
if key == ord('q') or key == ord('Q') :
break
cap.release()
out.release()
out2.release()
out3.release()
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/225839.html
微信掃一掃
支付寶掃一掃