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>
- 第一個參數是要保存的文件的路徑
- fourcc 指定編碼器
- fps 要保存的影片的幀率
- frameSize 要保存的文件的畫面尺寸
- 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 當中去。