1. 程式人生 > >Opencv—讀取視訊/通過手機攝像頭捕捉視訊並儲存成視訊流

Opencv—讀取視訊/通過手機攝像頭捕捉視訊並儲存成視訊流

1.獲取下載好的視訊並播放視訊

import cv2#引入cv2模組
#設定視訊捕獲
capture = cv2.VideoCapture('0.wmv')#0.wmv表示同一資料夾目錄下的視訊名
while True:
    ret, frame = capture.read()#變數ret判斷視訊幀是否成功讀入;變數frame表示讀取到陣列型別的每一幀,實質是圖片
    cv2.imshow('frame', frame)
    if cv2.waitKey(1)==ord('q'):#這裡程式會等1毫秒,只要使用者沒有按下'q'鍵,程式就會執行下一個迴圈,若按下了'q'鍵,則程式會break跳出while迴圈。這裡可以通過改變cv2.waitKey()裡面的時間引數,來改變視訊的播放速度
        break
capture.release()#關閉相機
cv2.destroyWindow()#關閉視窗

imshow('引數1‘,‘引數2’):引數1表示:顯示圖片的視窗名稱;引數2表示:儲存圖片資料的物件

cv2.imshow('frame', frame):將每一幀圖片顯示在一個叫frame的視窗上。這裡解釋一下,為什麼這樣顯示在視窗上會產生視訊的效果。前面操作圖片的時候,我們提到過,顯示多幅影象的時候,若cv2.imshow()指定相同的視窗名,這樣後面顯示的圖片會覆蓋前面的圖片,而產生一個視窗。這裡視訊顯示也是同樣的道理,每次while迴圈,視窗'frame'的名字不變,這樣每一幀會覆蓋上一幀,就產生了視訊的效果。

2.通過手機攝像頭捕捉視訊並儲存成視訊流

(1)下載IP攝像頭app

(2)程式如下:

import cv2
import time
if __name__ == '__main__':
 cv2.namedWindow("camera", 1)#建立視窗
 # 開啟ip攝像頭
 video = "http://admin:[email protected]:8081/"#通過IP攝像頭獲得手機IP
 cap = cv2.VideoCapture(video)  # 設定視訊捕獲
 #建立VideoWriter類物件
 fourcc = cv2.VideoWriter_fourcc(*'DIVX')#在windows下fourcc取值為DIVX
 fps =cap.get(cv2.CAP_PROP_FPS)#獲取幀率
 size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), 
         int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))#獲取幀大小
 out = cv2.VideoWriter('F:\\camera.avi',fourcc, fps, size)#第一項是視訊儲存路徑
 while(cap.isOpened()):#判斷相機是否開啟
    ret, frame = cap.read()#變數ret判斷視訊幀是否成功讀入;變數frame表示讀取到陣列型別的每一幀,實質是圖片
    if cv2.waitKey(1) & 0xFF == ord('q'):#按q鍵退出
        break
    if  ret == True:
        out.write(frame)#儲存幀
        cv2.imshow('frame', frame)#顯示幀
 cap.release()#關閉相機
 out.release()
 cv2.destroyWindow("camera")#關閉視窗

其中建立VideoWriter類物件過程參考連結:https://blog.csdn.net/qq_18995069/article/details/82772944