OpenCV-加載和保存視頻

  • 2019 年 11 月 13 日
  • 筆記

OpenCV不僅能夠很方便的加載和保存圖片,而且對於視頻的加載與保存也可以很簡單的通過OpenCV中的函數輕鬆實現。本篇主要介紹如何加載保存視頻。

01

加載並顯示視頻

前面介紹了加載圖像,我們可以直接通過imread()函數加載圖像,返回一個使用ndarray數組表示的像素矩陣。視頻和圖片是不同的東西,但是我們可以將視頻看成是一幀一幀的圖像,因此在OpenCV中將讀取視頻分成兩個部分:

  1. 打開視頻設備或者視頻文件,此時的視頻設備主要指的是攝像頭;
  2. 將視頻按幀進行讀取,想要顯示視頻的時候,通過imshow()函數顯示每一幀的圖像,然後通過waitKey(delay)函數刷新圖像,通俗來講就是每一幀之間的間隔時間;

OpenCV中提供VideoCapture()函數打開視頻設備或者視頻文件,此時根據參數不同,選擇是打開視頻設備還是視頻文件。

1.打開攝像頭,此時cv.VideoCapture函數中的參數是攝像頭設備的索引,索引從0開始,一般筆記本中都會有內置攝像頭,因此要打開筆記本中的內置攝像頭,只需使用cv.VideoCapture(0),即index為0的設備。當然你可以選擇1或者其他的來選擇別的攝像頭;

2.打開本地視頻文件,此時cv.VideoCapture函數中的參數是本地視頻文件的路徑;

此時僅僅是將視頻設備或者視頻文件打開,想要讀取顯示還需要read()函數和imshow()函數,下面通過代碼演示打開視頻設備以及視頻文件並顯示。

打開我筆記本電腦中的攝像頭(此時需要注意要在設置中開啟攝像頭權限)並顯示出來

執行效果,會打開一個窗口,刷新率為15ms,還是挺靈活的,當然你可以設置延遲大一點。

接下來看看如何使用OpenCV打開視頻文件並顯示,其實和上面的類似。首先準備一個視頻文件,此時我的視頻文件叫做"love.avi",我將文件放在當前目錄下。

執行效果:

這裡需要說明cv.waitKey函數,在圖像的加載與保存中,我們介紹過此函數,但是通過前面的效果,也可以看出waitKey函數在視頻中和在圖像中是不一樣的,當然參數值也是三種,正整數,負整數以及0。下面直接給出結論,測試也很簡單。

  1. ≤0的時候,讀取視頻只顯示當前幀,並且如果我們不進行操作的話,無限制的等下;
  2. >0的時候,也就是上面代碼測試的,兩個幀時間的間隔,時間為ms。

02

保存視頻

保存視頻有一些麻煩,需要指定保存視頻的編碼、每一幀時間間隔以及每一幀的大小,保存視頻編碼後面會介紹,目前按照代碼中的執行即可。

看見"my_love.avi"文件。