一、介紹
cv2.VideoCapture是OpenCV中一個用于捕捉視頻的類。它可以訪問計算機(jī)的攝像頭,或從視頻文件中讀取圖像。通過cv2.VideoCapture,用戶可以輕松地捕捉、保存、編輯和傳輸視頻流數(shù)據(jù)。
使用cv2.VideoCapture可以實現(xiàn)以下功能:
1. 打開計算機(jī)的攝像頭,實時捕捉攝像頭的視頻流數(shù)據(jù)。
2. 讀取視頻文件,逐幀解碼并輸出視頻流數(shù)據(jù)。
3. 控制幀率,調(diào)整視頻的播放速度。
4. 控制視頻的長寬和分辨率。
5. 編輯視頻流數(shù)據(jù),比如添加水印、合并視頻等操作。
6. 傳輸視頻數(shù)據(jù),可以通過網(wǎng)絡(luò)傳輸視頻流數(shù)據(jù)。
cv2.VideoCapture中最常用的方法有:
1. read():讀取視頻流數(shù)據(jù)中的一幀。
2. isOpened():檢查當(dāng)前的cv2.VideoCapture是否已經(jīng)打開。
3. release():釋放cv2.VideoCapture對象占用的資源。
例如以下代碼展示如何使用cv2.VideoCapture對象打開計算機(jī)的攝像頭并捕獲實時視頻:
import cv2
cap = cv2.VideoCapture(0) ?# 打開計算機(jī)的攝像頭
while True:
? ? ret, frame = cap.read() ?# 讀取視頻流數(shù)據(jù)中的一幀
? ? cv2.imshow('frame', frame) ?# 顯示捕獲的視頻流數(shù)據(jù)
? ? if cv2.waitKey(1) & 0xFF == ord('q'):
? ? ? ? break
cap.release() ?# 釋放占用的資源
cv2.destroyAllWindows()
二、cv2.VideoCapture()視頻的獲取操作
1、從文件讀取視頻
參數(shù)是視頻文件路徑,打開方式如下:
videoCapture = cv2.VideoCapture(“../test1.mp4”) #.avi等視頻文件
2、從攝像頭讀取視頻
?VideoCapture(0)中參數(shù)是0,表示打開筆記本的內(nèi)置攝像頭,如果有多個攝像頭,往上加就可。
videoCapture = cv2.VideoCapture(0)
如果要讀取監(jiān)控攝像頭的視頻流,需要知道指定攝像頭的ip等信息。
# 使用rtsp流打開相機(jī)
videoCapture = cv2.VideoCapture(f'rtsp://{username}:{password}@{ip}:{port}/h264/ch1/main/av_stream')
三、videoCapture.read()按幀讀內(nèi)容
# 讀幀
success, frame = videoCapture.read()
print(success)
print(frame)
success,frame是獲.read()方法的兩個返回值。?其中success是布爾值,如果讀取幀是正確的則返回True,如果文件讀取到結(jié)尾,它的返回值就為False。frame就是每一幀的圖像,是個三維矩陣。
下面這個示例中,我們使用了默認(rèn)攝像頭(設(shè)備編號為0)作為輸入,然后使用while循環(huán)逐幀讀取視頻并在窗口中顯示。如果按下 'q' 鍵或無法讀取視頻,則退出循環(huán)并釋放資源。文章來源:http://www.zghlxwxcb.cn/news/detail-723020.html
import cv2
# 創(chuàng)建 VideoCapture 對象
cap = cv2.VideoCapture(0)
# 循環(huán)讀取視頻流
while True:
# 逐幀讀取視頻
ret, frame = cap.read()
# 如果不能讀取視頻,退出循環(huán)
if not ret:
break
# 在窗口中顯示視頻幀
cv2.imshow("frame", frame)
# 檢測鍵盤輸入,按 'q' 鍵退出循環(huán)
key = cv2.waitKey(1)
if key == ord('q'):
break
# 釋放資源并關(guān)閉窗口
cap.release()
cv2.destroyAllWindows()
什么是幀,幀的快慢是什么,影響什么
? ? ? ? 視頻的基本組成部分是幀(frame),即一系列靜態(tài)圖像,這些圖像在一定速率下以連續(xù)的方式播放,形成動態(tài)圖像,例如30幀/秒。視頻每秒的幀數(shù)被稱為幀率(Frame Rate),通常用“fps”(Frames Per Second)表示。例如,30fps表示視頻每秒鐘包含30幀圖像。幀率決定了視頻的流暢度和真實感。較高的幀率可以使視頻看起來更加流暢,因為它們可以更快地刷新圖像。例如,60fps的視頻比30fps的視頻看起來更加流暢。此外,較高的幀率還可以減少視頻中的模糊和顫動,因為它們可以更好地捕捉運動。但較高的幀率會導(dǎo)致文件變大和編解碼更復(fù)雜,因為需要處理更多的幀圖像。
————————————————
https://blog.csdn.net/cvxiayixiao/article/details/130519349文章來源地址http://www.zghlxwxcb.cn/news/detail-723020.html
四、實例
import os
import cv2
# 定義保存圖片函數(shù)
# image:要保存的圖片
# pic_address:圖片保存地址
# num: 圖片后綴名,用于區(qū)分圖片,int 類型
def save_image(image, address, num):
pic_address = address + str(num) + '.jpg'
cv2.imwrite(pic_address, image)
def video_to_pic(video_path, save_path, frame_rate):
# 讀取視頻文件
# video_path為視頻路徑,save_path為保存圖片路徑,frame_rate可以設(shè)置多少幀切一張圖
global videoCap
#這里將videoCapture加global意思是設(shè)置成了全局變量,后面釋放攝像頭要用到這個變量
videoCap = cv2.VideoCapture(video_path)
if videoCap.isOpened():
print("攝像頭or視頻打開成功")
if not videoCap.isOpened():
print("找不到攝像頭or視頻")
exit()
# 讀幀
success, frame = videoCap.read()
"""success,frame是獲.read()方法的兩個返回值。?
其中success是布爾值,如果讀取幀是正確的則返回True,如果文件讀取到結(jié)尾,它的返回值就為False。
frame就是每一幀的圖像,是個三維矩陣。"""
# print(success)
# print(frame)
if videoCap.open(video_path):
print("視頻提取成功")
if not videoCap.open(video_path):
print("can not open the video")
j = 0
i = 0
while success:
i = i + 1
# 每隔固定幀保存一張圖片
if i % frame_rate == 0:
j = j + 1
save_image(frame, save_path, j)
print('圖片保存地址:', save_path + str(j) + '.jpg')
success, frame = videoCap.read()
# if cv2.waitKey(1) & 0xFF == ord('q'):
# break
if __name__ == '__main__':
# 視頻文件和圖片保存地址
SAMPLE_VIDEO = 'F:/Capture/dist/video/sc0914.mp4'
SAVE_PATH = 'F:/Capture/dist/VideotoImages/sc0914/'
#注意保存本地路徑不能有中文,save_image()以及imwrite、cv2.imread()均不支持有中文的路徑
if not os.path.exists(SAVE_PATH):
os.makedirs(SAVE_PATH)
# 設(shè)置固定幀率
FRAME_RATE = 10
video_to_pic(SAMPLE_VIDEO, SAVE_PATH, FRAME_RATE)
# 調(diào)用release()釋放攝像頭
# 調(diào)用destroyAllWindows()關(guān)閉所有圖像窗口。
videoCap.release()
cv2.destroyAllWindows()
到了這里,關(guān)于opencv(python)視頻按幀切片/cv2.VideoCapture()用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!