使用Python,OpenCV读取视频的每一帧,修改后写入视频
生活随笔
收集整理的這篇文章主要介紹了
使用Python,OpenCV读取视频的每一帧,修改后写入视频
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用OpenCV 3將視頻寫入文件,并保存在自己的磁盤上
嘗試支持avi、MP4文件格式的寫入,倆種文件的編碼格式不一致
codec: MJPG output: example.avi
codec: MP4V output: baby.avi
但是,如果您嘗試在自己的應用程序中將視頻編寫為使用OpenCV歸檔,請做好以下準備:
- 對系統上安裝的視頻編解碼器進行研究。
- 播放各種編解碼器和文件擴展名,直到視頻成功寫入磁盤。
用 OpenCV操作視頻 的方法有:
- cv2.VideoWriter
- cv2.VideoWriter_fourcc
- cv2.cv.FOURCC
創建視頻的文檔很詳細,但成功寫入視頻文件所需的編解碼器和文件擴展名的組合的文檔卻沒有。
我們將使用高效且線程化的VideoStream 使我們可以同時訪問內置/ USB網絡攝像頭和Raspberry Pi攝像頭模塊。
VideoStream 類在imutils Python包內部實現。您可以閱讀 有關VideoStream的更多信息 ,它如何訪問多個攝像機輸入,并以線程方式高效的讀取幀。
視頻寫入方法需要5個參數:
- cv2.VideoWriter(outputVideoPath, fourcc, fps, (w * 2, h * 2), True)
- –output 輸出視頻文件的路徑
- –fourcc 編解碼器
- –fps 輸出視頻文件的所需FPS
- –tuple(w,h) 輸出視頻的寬度和高度
- –True 控制是否將彩色框架寫入文件。True:表示我們正在編寫彩色框,False:表示我們沒有寫彩色框。
# USAGE
# python write_to_video.py --output example.avi# 導入必要的包
from __future__ import print_function
# 我們將使用高效且線程化的VideoStream 使我們可以同時訪問內置/ USB網絡攝像頭和Raspberry Pi攝像頭模塊。
# VideoStream 類在imutils Python包內部實現。您可以閱讀有關VideoStream的更多信息【https://www.pyimagesearch.com/2016/01/04/unifying-picamera-and-cv2-videocapture-into-a-single-class-with-opencv/】 類,它如何訪問多個攝像機輸入,并在本教程中以線程方式有效讀取幀。
from imutils.video import VideoStream
import numpy as np
import argparse
import imutils
import time
import cv2# 構建命令行參數
# --output 輸出視頻存儲的磁盤路徑
# --picamera 指定是否要使用Raspberry Pi攝像頭模塊而不是內置/ USB攝像頭。提供> 0的值以訪問Pi攝像機模塊
# --fps 控制輸出視頻所需的FPS
# --codec 我們提供FourCC或四個字符的代碼,視頻編解碼器的標識符,壓縮格式以及視頻文件中的顏色/像素格式。 不同的組合很可能奏效,也可能不奏效;
# MJPG的組合 和.avi 開箱即用,既可以在OSX機器上運行,也可以在Raspberry Pi上工作,因此,如果在將視頻寫入文件時遇到問題,請務必先嘗試這些組合!
# 注意 codec: MJPG output: example.avi; codec: MP4V output: baby.avi
ap = argparse.ArgumentParser()
ap.add_argument("-o", "--output", required=True,help="path to output video file")
ap.add_argument("-p", "--picamera", type=int, default=-1,help="whether or not the Raspberry Pi camera should be used")
ap.add_argument("-f", "--fps", type=int, default=20,help="FPS of output video")
ap.add_argument("-c", "--codec", type=str, default="MJPG",help="codec of output video")
args = vars(ap.parse_args())# 初始化視頻流,讓相機📷傳感器 預熱2s
print("[INFO] warming up camera...")
vs = VideoStream(usePiCamera=args["picamera"] > 0).start()
time.sleep(2.0)# 初始化 FourCC, 視頻writer,幀窗口的寬度,高度,0的數組
fourcc = cv2.VideoWriter_fourcc(*args["codec"])
writer = None
(h, w) = (None, None)
zeros = None# 遍歷視頻流
while True:# 獲取視頻流的一幀 并且resize窗口寬為300frame = vs.read()frame = imutils.resize(frame, width=300)# 檢查writer是否為Noneif writer is None:# 獲取幀的空間尺寸(寬度和高度),實例化視頻流videoWriter(h, w) = frame.shape[:2]writer = cv2.VideoWriter(args["output"], fourcc, args["fps"],(w * 2, h * 2), True)zeros = np.zeros((h, w), dtype="uint8")# 我們將frame 分離為紅色,綠色和藍色通道, 然后我們使用Numpy 零數組分別構造每個通道的表示形式(B, G, R) = cv2.split(frame)R = cv2.merge([zeros, zeros, R])G = cv2.merge([zeros, G, zeros])B = cv2.merge([B, zeros, zeros])# 構建輸出幀 原圖在左上角 紅色通道右上角 綠色通道右下角 藍色通道左下角output = np.zeros((h * 2, w * 2, 3), dtype="uint8")output[0:h, 0:w] = frameoutput[0:h, w:w * 2] = Routput[h:h * 2, w:w * 2] = Goutput[h:h * 2, 0:w] = B# 將幀寫入視頻writer.write(output)# 展示幀cv2.imshow("Frame", frame)cv2.imshow("Output", output)key = cv2.waitKey(1) & 0xFF# 按下q鍵 將結束播放if key == ord("q"):break# 清理,釋放資源
print("[INFO] cleaning up...")
cv2.destroyAllWindows()
vs.stop()
writer.release()
參考:
- https://www.pyimagesearch.com/2016/02/22/writing-to-video-with-opencv/
總結
以上是生活随笔為你收集整理的使用Python,OpenCV读取视频的每一帧,修改后写入视频的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bt21VAN是谁画的呢?
- 下一篇: 王者荣耀里王昭君皮肤可以,怎么获得?