教你提取opencv視頻地址:opencv讀取視頻文件

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類型;

常用的文件名稱後綴和編碼方式的對應關係有:

文件後綴編碼方式
aviXVID
aviMJPG
avimp4v(小寫)
mp4mp4v(小寫)

編碼方式需要創建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()
OpenCV-Python教程:從視頻文件、相機獲取圖像、寫視頻文件

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/225839.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 14:46
下一篇 2024-12-09 14:46

相關推薦

發表回復

登錄後才能評論