Opencv?視頻讀取與寫入的實(shí)現(xiàn)示例
前言
視頻是由圖片組成的, 視頻的每一幀就是一幅圖片, 一般是30幀, 表示一秒顯示30張圖片.
- cv2.VideoCapture可以捕獲攝像頭, 用數(shù)字來(lái)表示不同的設(shè)備, 比如0, 1
- 如果是視頻文件, 可以直接指定路徑即可.
通過(guò)路徑獲取視頻內(nèi)容
獲取視頻內(nèi)容
vc = cv2.VideoCapture(path)
檢查是否正確打開(kāi)
vc.isOpened() # 可以讀到內(nèi)容返回True
循環(huán)播放
播放視頻就是不停的換圖像幀,即循環(huán)調(diào)用 vc.read() 和 cv2.imshow()
完整代碼
import cv2 # 打開(kāi)視頻文件 def open_video(path): vc = cv2.VideoCapture(path) ret = vc.isOpened() # 可以讀到內(nèi)容返回True # 檢查是否正確打開(kāi) if ret: print("視頻打開(kāi)成功") else: print("視頻打開(kāi)失敗") return -1 print(f"開(kāi)始播放視頻: {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退出鍵會(huì)退出 if cv2.waitKey(33) & 0xFF == 27: break # 釋放視頻對(duì)象 vc.release() # 關(guān)閉窗口 cv2.destroyAllWindows() open_video("videos/1.mp4")
從攝像頭讀取視頻數(shù)據(jù)
獲取視頻設(shè)備
cap = cv2.VideoCapture(0)
其他與直接讀取視頻一致
完整實(shí)例
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("開(kāi)始播放來(lái)自攝像頭的視頻,按esc鍵退出) while ret: # 從攝像頭讀取視頻 ret, frame = cap.read() # 將視頻幀放在窗口中顯示 cv2.imshow('video', frame) # 等待鍵盤事件, 按esc鍵會(huì)退出 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)表示攝像頭拍視頻, 這個(gè)大小搞錯(cuò)了也不行,主要是這個(gè)分辨率. vw = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480)) # 'output.mp4' 是輸出視頻文件的名稱,fourcc 是所選的視頻編碼器,20 是幀率,(640, 480) 是視頻的分辨率。 print("開(kāi)始錄制來(lái)自攝像頭的視頻,按esc鍵退出") # 循環(huán)存幀錄制視頻 while cap.isOpened(): ret, frame = cap.read() if not ret: print('沒(méi)有接收到圖像') 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 視頻讀取與寫入的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Opencv 視頻讀寫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VS2019配置OpenCV時(shí)找不到Microsoft.Cpp.x64.user的解決方法
這篇文章主要介紹了VS2019配置OpenCV時(shí)找不到Microsoft.Cpp.x64.user的解決方法,需要的朋友可以參考下2020-02-02C++函數(shù)指針與指針函數(shù)有哪些關(guān)系和區(qū)別
函數(shù)指針是一個(gè)指針變量,它可以存儲(chǔ)函數(shù)的地址,然后使用函數(shù)指針,這篇文章主要介紹了C++中函數(shù)指針與指針函數(shù)有哪些關(guān)系和區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值2022-08-08C++ LeetCode1812判斷國(guó)際象棋棋盤格子顏色
這篇文章主要為大家介紹了C++ LeetCode1812判斷國(guó)際象棋棋盤格子顏色, 有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12C語(yǔ)言 structural body結(jié)構(gòu)體詳解用法
C 數(shù)組允許定義可存儲(chǔ)相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許您存儲(chǔ)不同類型的數(shù)據(jù)項(xiàng),結(jié)構(gòu)用于表示一條記錄,假設(shè)您想要跟蹤圖書館中書本的動(dòng)態(tài),您可能需要跟蹤每本書的下列屬性2021-10-10平衡二叉樹(shù)的實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了平衡二叉樹(shù)的實(shí)現(xiàn)實(shí)例,需要的朋友可以參考下2014-02-02基于MFC實(shí)現(xiàn)單個(gè)文檔的文件讀寫
這篇文章主要為大家詳細(xì)介紹了如何基于MFC實(shí)現(xiàn)單個(gè)文檔的文件讀寫功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定幫助,感興趣的可以了解一下2022-07-07C++編寫實(shí)現(xiàn)圖書管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++編寫實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03