OPENCV攝像頭讀取視頻的實現(xiàn)示例
OpenCV 讀取攝像頭的代碼示例
以下是幾種使用 OpenCV 讀取攝像頭的常見方法:
1. 基礎(chǔ)攝像頭讀取
import cv2
# 打開默認(rèn)攝像頭(通常是0)
cap = cv2.VideoCapture(0)
# 檢查攝像頭是否成功打開
if not cap.isOpened():
print("無法打開攝像頭")
exit()
print("攝像頭已打開,按 'q' 鍵退出")
while True:
# 讀取一幀
ret, frame = cap.read()
# 檢查幀是否讀取成功
if not ret:
print("無法讀取幀")
break
# 顯示幀
cv2.imshow('攝像頭', frame)
# 按'q'鍵退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 釋放資源
cap.release()
cv2.destroyAllWindows()2. 設(shè)置攝像頭參數(shù)
import cv2
cap = cv2.VideoCapture(0)
# 設(shè)置攝像頭參數(shù)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) # 寬度
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) # 高度
cap.set(cv2.CAP_PROP_FPS, 30) # 幀率
# 獲取實際參數(shù)值
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = cap.get(cv2.CAP_PROP_FPS)
print(f"攝像頭分辨率: {width}x{height}, 幀率: {fps}")
while True:
ret, frame = cap.read()
if not ret:
break
# 在畫面上顯示信息
cv2.putText(frame, f"分辨率: {int(width)}x{int(height)}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
cv2.putText(frame, f"幀率: {fps}", (10, 60),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
cv2.imshow('攝像頭', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()3. 多攝像頭讀取
import cv2
# 嘗試打開多個攝像頭
caps = []
for i in range(3): # 嘗試打開0,1,2號攝像頭
cap = cv2.VideoCapture(i)
if cap.isOpened():
caps.append(cap)
print(f"攝像頭 {i} 已連接")
else:
print(f"攝像頭 {i} 未連接")
if not caps:
print("沒有可用的攝像頭")
exit()
print(f"共找到 {len(caps)} 個攝像頭")
while True:
frames = []
for i, cap in enumerate(caps):
ret, frame = cap.read()
if ret:
# 在每幀上標(biāo)記攝像頭編號
cv2.putText(frame, f"Camera {i}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
frames.append(frame)
if not frames:
break
# 合并顯示多個攝像頭畫面
if len(frames) == 1:
combined = frames[0]
elif len(frames) == 2:
combined = cv2.hconcat(frames)
else:
# 對于3個或更多攝像頭,可以調(diào)整布局
top = cv2.hconcat(frames[:2])
bottom = cv2.hconcat(frames[2:]) if len(frames) > 2 else frames[2]
combined = cv2.vconcat([top, bottom]) if len(frames) > 2 else top
cv2.imshow('多攝像頭', combined)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 釋放所有攝像頭
for cap in caps:
cap.release()
cv2.destroyAllWindows()4. 保存視頻流
import cv2
cap = cv2.VideoCapture(0)
# 設(shè)置視頻編碼器和輸出文件
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
recording = False
print("按 'r' 開始/停止錄制,按 'q' 退出")
while True:
ret, frame = cap.read()
if not ret:
break
# 如果正在錄制,保存幀
if recording:
out.write(frame)
cv2.putText(frame, "錄制中...", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv2.imshow('攝像頭', frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
elif key == ord('r'):
recording = not recording
print("錄制" if recording else "停止錄制")
cap.release()
out.release() # 釋放視頻寫入器
cv2.destroyAllWindows()5. 帶簡單圖像處理的攝像頭讀取
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
mode = 0 # 0: 原圖, 1: 灰度, 2: 邊緣檢測, 3: 模糊
modes = ['原圖', '灰度', '邊緣檢測', '模糊']
print("按 'm' 切換模式,按 'q' 退出")
while True:
ret, frame = cap.read()
if not ret:
break
# 根據(jù)模式處理圖像
if mode == 1:
processed = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
processed = cv2.cvtColor(processed, cv2.COLOR_GRAY2BGR) # 轉(zhuǎn)回BGR用于顯示
elif mode == 2:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
processed = cv2.Canny(gray, 100, 200)
processed = cv2.cvtColor(processed, cv2.COLOR_GRAY2BGR)
elif mode == 3:
processed = cv2.GaussianBlur(frame, (15, 15), 0)
else:
processed = frame.copy()
# 顯示當(dāng)前模式
cv2.putText(processed, f"模式: {modes[mode]}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
cv2.imshow('攝像頭', processed)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
elif key == ord('m'):
mode = (mode + 1) % len(modes)
print(f"切換到模式: {modes[mode]}")
cap.release()
cv2.destroyAllWindows()部分api解釋:
ret, frame = cap.read()
- 第一個返回值 (
ret):布爾值(True/False),表示幀是否成功讀取 - 第二個返回值 (
frame):如果讀取成功,這是一個包含圖像數(shù)據(jù)的 NumPy 數(shù)組
# 顯示一幀圖像
cv2.imshow('frame', frame)
# 如果按下'q'鍵,退出循環(huán)
if cv2.waitKey(1) & 0xFF == ord('q'):
break到此這篇關(guān)于OPENCV攝像頭讀取視頻的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)OPENCV攝像頭讀取視頻內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python paramiko模塊利用多線程實現(xiàn)ssh并發(fā)執(zhí)行操作
ssh是一個協(xié)議,OpenSSH是其中一個開源實現(xiàn),paramiko是Python的一個庫,實現(xiàn)了SSHv2協(xié)議(底層使用cryptography)。這篇文章主要介紹了使用Python paramiko模塊利用多線程實現(xiàn)ssh并發(fā)執(zhí)行操作,需要的朋友可以參考下2019-12-12
Python使用smtplib庫開發(fā)一個郵件自動發(fā)送工具
在現(xiàn)代軟件開發(fā)中,自動化郵件發(fā)送是一個非常實用的功能,無論是系統(tǒng)通知、營銷郵件、還是日常工作報告,Python的smtplib庫都能幫助我們輕松實現(xiàn)這些功能,本教程將詳細(xì)介紹如何使用Python的smtplib庫開發(fā)一個功能完整的郵件自動發(fā)送工具,需要的朋友可以參考下2025-06-06
Python3實現(xiàn)簡單可學(xué)習(xí)的手寫體識別(實例講解)
下面小編就為大家?guī)硪黄狿ython3實現(xiàn)簡單可學(xué)習(xí)的手寫體識別(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)找到最大或最小的N個元素實現(xiàn)方法示例
這篇文章主要介紹了Python找到最大或最小的N個元素實現(xiàn)方法,涉及Python基于heapq模塊進(jìn)行集合運算的相關(guān)操作技巧,需要的朋友可以參考下2018-02-02
python解析mdf或mf4文件利器之a(chǎn)sammdf用法
這篇文章主要介紹了python解析mdf或mf4文件利器之a(chǎn)sammdf用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
探索Python函數(shù)調(diào)用為何加速代碼執(zhí)行原理
Python 作為一種解釋型語言,其執(zhí)行速度相對于編譯型語言可能會較慢,然而,在Python中,通常觀察到代碼在函數(shù)中運行得更快的現(xiàn)象,這個現(xiàn)象主要是由于函數(shù)調(diào)用的內(nèi)部優(yōu)化和解釋器的工作方式導(dǎo)致的,本文將深入探討這個現(xiàn)象,并通過詳細(xì)的示例代碼進(jìn)行解釋2024-01-01
Python中的filter()函數(shù)的3種使用方式詳解
這篇文章主要介紹了Python中的filter()函數(shù)的3種使用方式,Python中filter()函數(shù)用于過濾序列,返回迭代器,支持函數(shù)式編程,可配合lambda或自定義函數(shù),與列表推導(dǎo)式類似但更高效,需要的朋友可以參考下2025-05-05

