目錄
一、涉及OpenCv函數(shù)
二、什么是幀、幀的大小代表什么
三、攝像頭獲取視頻數(shù)據(jù)
四、錄制視頻并保存
一、涉及OpenCv函數(shù)
從設(shè)備,可以是攝像頭可以是本地視頻,獲取視頻的函數(shù) cv.VideoCapture()。本函數(shù)作用在于創(chuàng)建一個(gè)VideoCapture或者VideoWriter對象,真正的讀取和寫入是通過創(chuàng)建的對象進(jìn)行read和write的調(diào)用的。視頻可以采用不同的格式,如AVI,MP4,MOV等,這些格式定義了視頻文件的編碼方式、分辨率、幀率等參數(shù)。
- 視頻寫入函數(shù)?cv.VideoWriter()
- 讀取視頻/打開攝像頭?cv.VideoCapture()
- 寫入視頻 cv.VideoWriter()
- 打開,判斷是否打開isOpened () open()
- 獲取參數(shù),更改參數(shù) cv.VideoCapture.get(propId) cv.VideoCapture.set(propId, value)
- 釋放視頻 cv.VideoCapture.release()
?
二、什么是幀、幀的大小代表什么
?視頻的基本組成部分是幀(frame),即一系列靜態(tài)圖像,這些圖像在一定速率下以連續(xù)的方式播放,形成動(dòng)態(tài)圖像,例如30幀/秒。視頻每秒的幀數(shù)被稱為幀率(Frame Rate),通常用“fps”(Frames Per Second)表示。例如,30fps表示視頻每秒鐘包含30幀圖像。幀率決定了視頻的流暢度和真實(shí)感。較高的幀率可以使視頻看起來更加流暢,因?yàn)樗鼈兛梢愿斓厮⑿聢D像。例如,60fps的視頻比30fps的視頻看起來更加流暢。此外,較高的幀率還可以減少視頻中的模糊和顫動(dòng),因?yàn)樗鼈兛梢愿玫夭蹲竭\(yùn)動(dòng)。但較高的幀率會(huì)導(dǎo)致文件變大和編解碼更復(fù)雜,因?yàn)樾枰幚砀嗟膸瑘D像。30幀即代表一秒展現(xiàn)30張圖片
三、攝像頭獲取視頻數(shù)據(jù)
代碼:文章來源:http://www.zghlxwxcb.cn/news/detail-564660.html
import cv2 as cv
# 創(chuàng)建VideoCapture對象,用創(chuàng)建的對象去做之后的操作
cap = cv.VideoCapture(0)
# 檢測有無攝像頭正常使用
# 這是一個(gè)必要的驗(yàn)證,當(dāng)cap為空的時(shí)候,后續(xù)調(diào)用會(huì)報(bào)錯(cuò)。
if not cap.isOpened():
print("Cannot open camera")
exit()
# 獲取視頻流是一個(gè)連續(xù)的循環(huán)過程,一直在獲取,不是說獲取到一幀就可以了
while True:
# 通過創(chuàng)建的VideoCapture對象逐幀獲取視頻,會(huì)返回兩個(gè)參數(shù),ret返回true和false代表是否正常獲取到幀,以及視頻是否結(jié)束
# frame代表獲取到的幀
ret, frame = cap.read()
# if frame is read correctly ret is True
if not ret:
print("不能正常讀取視頻幀")
break
# 將獲取到的視頻幀,也就是一幅幅圖像,轉(zhuǎn)為灰度圖
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 展示
cv.imshow('frame', gray)
# q退出獲取視頻流
if cv.waitKey(1) == ord('q'):
break
# 釋放資源
cap.release()
cv.destroyAllWindows()
四、錄制視頻并保存
代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-564660.html
import cv2
# 視頻的本質(zhì)上就是由一幅一幅的圖片組成
# 24幀 60幀(表示一秒顯示60張圖片)
# 創(chuàng)建一個(gè)窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640,480)
# 打開攝像頭
cap = cv2.VideoCapture(0)
# 打開視頻
# cap = cv2.VideoCapture('1.mp4')
# 保存視頻
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
vw = cv2.VideoWriter('123.mp4',fourcc,30,(640,480))
# 循環(huán)讀取攝像頭的每一幀
while True:
# 讀一幀數(shù)據(jù),返回標(biāo)記,True表示讀到了數(shù)據(jù),F(xiàn)alse表示沒讀到數(shù)據(jù)
ret,frame = cap.read()
#可以根據(jù)ret做個(gè)判斷
if not ret:
#沒讀到數(shù)據(jù),直接退出
break
vw.write(frame)
# 顯示數(shù)據(jù)
cv2.imshow('video',frame)
key = cv2.waitKey(1000 // 30)
if key & 0xFF == ord('q'):
break
# 釋放資源
cap.release()
vw.release()
cv2.destroyAllWindows()
到了這里,關(guān)于OpenCv:采集攝像頭視頻、讀取視頻幀與視頻錄制的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!