Opencv?視頻讀取與寫入的實現(xiàn)示例
前言
視頻是由圖片組成的, 視頻的每一幀就是一幅圖片, 一般是30幀, 表示一秒顯示30張圖片.
- cv2.VideoCapture可以捕獲攝像頭, 用數(shù)字來表示不同的設(shè)備, 比如0, 1
- 如果是視頻文件, 可以直接指定路徑即可.
通過路徑獲取視頻內(nèi)容
獲取視頻內(nèi)容
vc = cv2.VideoCapture(path)
檢查是否正確打開
vc.isOpened() # 可以讀到內(nèi)容返回True
循環(huán)播放
播放視頻就是不停的換圖像幀,即循環(huán)調(diào)用 vc.read() 和 cv2.imshow()
完整代碼
import cv2
# 打開視頻文件
def open_video(path):
vc = cv2.VideoCapture(path)
ret = vc.isOpened() # 可以讀到內(nèi)容返回True
# 檢查是否正確打開
if ret:
print("視頻打開成功")
else:
print("視頻打開失敗")
return -1
print(f"開始播放視頻: {path.split('/').pop()},按esc鍵退出")
# 循環(huán)讀幀播放視頻
while ret:
# 可以讀到內(nèi)容ret返回True
ret, frame = vc.read()
# 讀到最后frame就是空
if frame is None:
print("視頻播放完畢")
break
if ret:
cv2.imshow('{}'.format(path).split('/').pop(), frame)
# 0xFF == 27表示按esc退出鍵會退出
if cv2.waitKey(33) & 0xFF == 27:
break
# 釋放視頻對象
vc.release()
# 關(guān)閉窗口
cv2.destroyAllWindows()
open_video("videos/1.mp4")從攝像頭讀取視頻數(shù)據(jù)
獲取視頻設(shè)備
cap = cv2.VideoCapture(0)
其他與直接讀取視頻一致
完整實例
import cv2
# 從攝像頭一直讀取數(shù)據(jù)
def camera():
# 獲取視頻設(shè)備
cap = cv2.VideoCapture(0)
print("獲取視頻設(shè)備成功")
ret = cap.isOpened()
# 創(chuàng)建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)
print("成功創(chuàng)建窗口")
print("開始播放來自攝像頭的視頻,按esc鍵退出)
while ret:
# 從攝像頭讀取視頻
ret, frame = cap.read()
# 將視頻幀放在窗口中顯示
cv2.imshow('video', frame)
# 等待鍵盤事件, 按esc鍵會退出
if cv2.waitKey(33) & 0xFF == 27:
break
# 釋放攝像頭
cap.release()
print("攝像頭已關(guān)閉")
# 關(guān)閉窗口
cv2.destroyAllWindows()
camera()錄制視頻
VideoWriter : 參數(shù)一為輸出文件, 參數(shù)二為多媒體文件格式(VideoWriter_fourcc),參數(shù)三為幀率, 參數(shù)四為分辨率.
- write 編碼并寫入緩存
- release 緩存內(nèi)容寫入磁盤, 并釋放資源
用于創(chuàng)建視頻編解碼器的四字符碼(FourCC)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
cv2.VideoWriter()
vm = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480))
'output.mp4' 是輸出視頻文件的名稱,fourcc 是所選的視頻編碼器,20 是幀率,(640, 480) 是視頻的分辨率。
將視頻幀逐幀寫入視頻文件
vw.write(frame)
完整示例
import cv2
# 錄制視頻
def record_video():
# 獲取視頻設(shè)備
cap = cv2.VideoCapture(1)
print("獲取視頻設(shè)備成功")
# *mp4v就是解包操作 等同于 'm', 'p', '4', 'v'
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 用于創(chuàng)建視頻編解碼器的四字符碼(FourCC)。
# (640, 480)表示攝像頭拍視頻, 這個大小搞錯了也不行,主要是這個分辨率.
vw = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480))
# 'output.mp4' 是輸出視頻文件的名稱,fourcc 是所選的視頻編碼器,20 是幀率,(640, 480) 是視頻的分辨率。
print("開始錄制來自攝像頭的視頻,按esc鍵退出")
# 循環(huán)存幀錄制視頻
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print('沒有接收到圖像')
break
vw.write(frame) # 將視頻幀逐幀寫入視頻文件。
cv2.imshow('frame', frame) # 顯示錄制的幀
if cv2.waitKey(33) & 0xFF == 27:
break
# 釋放攝像頭
cap.release()
print("攝像頭已關(guān)閉")
record_video()到此這篇關(guān)于Opencv 視頻讀取與寫入的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Opencv 視頻讀寫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VS2019配置OpenCV時找不到Microsoft.Cpp.x64.user的解決方法
這篇文章主要介紹了VS2019配置OpenCV時找不到Microsoft.Cpp.x64.user的解決方法,需要的朋友可以參考下2020-02-02
C++函數(shù)指針與指針函數(shù)有哪些關(guān)系和區(qū)別
函數(shù)指針是一個指針變量,它可以存儲函數(shù)的地址,然后使用函數(shù)指針,這篇文章主要介紹了C++中函數(shù)指針與指針函數(shù)有哪些關(guān)系和區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值2022-08-08
C語言 structural body結(jié)構(gòu)體詳解用法
C 數(shù)組允許定義可存儲相同類型數(shù)據(jù)項的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許您存儲不同類型的數(shù)據(jù)項,結(jié)構(gòu)用于表示一條記錄,假設(shè)您想要跟蹤圖書館中書本的動態(tài),您可能需要跟蹤每本書的下列屬性2021-10-10

