cv2.VideoWriter()

  • 2019 年 10 月 5 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/weixin_36670529/article/details/100977537

用 OpenCV 開發難免會針對 Camera 或者是 Video 做處理,有的時候需要將畫面保留下來,這個時候最佳方案是保存成一個 .avi 的文件。

OpenCV 底層是用 FFMEPG 進行多媒體開發的,所以 OpenCV 它的長項不在於此,它只是提供了這種能力而已,如果要針對多媒體文件做複雜的處理,推薦的還是 FFMEPG 專業庫。

OpenCV 用來創建影片文件的類是 VideoWriter。

但首先,給大家普及一些影片類相關的知識點。

1. 文件後綴名

我們一般都知道影片文件是 .mp4、.3gp、.rmvb 等等格式的,但一個文件取這樣的後綴名是為了告訴用戶或者作業系統,它的內容是什麼格式的。我們也可以將 rmvb 格式的文件取名為 ***.avi。後綴的目的是為了方便用專業的工具或者軟體操作它們。

2. 文件格式

我們可以將一個影片文件看做一個容器。

簡單地說就是可以看做是一個盒子。

這個盒子裡面有影片畫面數據、音頻數據、字幕數據等等。

不同的文件格式如 mp4、avi、mkv 等等,它們存放 打包數據的方式不一樣,文件內部文件編碼方式也可能不一樣。

3. 編碼格式

影片容器中,一般有影片和音頻數據,它們採取的編碼方式不一樣。

影片常見的編碼方式通常有: x264、h264、mpeg-4

音頻常見的編碼方式通常有: mp3、AAC、flac

編碼的目的主要是為了高效存儲和傳輸,如果你不採用編碼壓縮的話,那麼影片可以看做是一系列的圖片序列,體積會非常大。

4. 編碼器和解碼器

把影片或者音頻按照編碼格式,編碼成特定文件格式需要編碼器的參與,不然每次開發重新寫程式碼代價很高。

把特定文件格式解碼成特定的編碼格式數據,這個過程稱為解碼,需要解碼器的存在。

解碼器和編碼器都有開源的或者收費的工具庫,極大方便了開發者。

5. FPS 幀率

我們讀初中物理時,大概了解過電影畫面一秒鐘 24 幀,其實對應的就是 24 fps,frame per second,有些手機有高速攝像的功能,原理就是能夠 1 秒鐘拍攝 960 張圖片,然後用正常的速度放映出來,所以細節比較多。

fps 越高,細節越好,體驗也越好,但是文件容量也越高。

VideoWriter

用 OpenCV 保存影片非常簡單,通過調用它的 VideoWriter 這個類就好了。

VideoWriter(filename, fourcc, fps, frameSize[, isColor]) -> <VideoWriter object>
  1. 第一個參數是要保存的文件的路徑
  2. fourcc 指定編碼器
  3. fps 要保存的影片的幀率
  4. frameSize 要保存的文件的畫面尺寸
  5. isColor 指示是黑白畫面還是彩色的畫面

fourcc

fourcc 本身是一個 32 位的無符號數值,用 4 個字母表示採用的編碼器。 常用的有 「DIVX"、」MJPG"、「XVID」、「X264"。可用的列表在這裡。

推薦使用 」XVID",但一般依據你的電腦環境安裝了哪些編碼器。

如果 fourcc 採用 -1,系統可能會彈出一個對話框讓你進行選擇,但是我沒有試驗成功過。

程式碼示例

import numpy as np  import cv2    cap = cv2.VideoCapture(0)    fourcc = cv2.VideoWriter_fourcc(*'XVID')    out = cv2.VideoWriter('testwrite.avi',fourcc, 20.0, (1920,1080),True)    while(cap.isOpened()):      ret, frame = cap.read()      if ret==True:            cv2.imshow('frame',frame)          out.write(frame)            if cv2.waitKey(10) & 0xFF == ord('q'):              break      else:          break    cap.release()  out.release()  cv2.destroyAllWindows()

這段程式碼的目的就是獲取攝影機的影片流,然後保存到本地,幀率是 20fps,尺寸是 1920×1080.

需要注意的是在 VideoWriter 中指定的尺寸要和 write() 中寫進去的一樣,不然影片會存儲失敗的。

如果需要讀取影片文件,那麼就將 VideoCapture 指定文件路徑。

如果,將圖片序列合成為影片文件,其實原理也一樣,一張一張讀取,然後寫到 VideoWriter 當中去。