Python使用OpenCV捕獲攝像頭視頻流并在窗口中顯示
一、實例代碼
連接 USB 相機(jī)之后,通過指令ls /dev/video*查看設(shè)備號,通過一個簡單的腳本使用 OpenCV 庫來捕獲攝像頭視頻流并在窗口中顯示,ESC鍵退出。
import cv2
# 攝像頭設(shè)備號
cap = cv2.VideoCapture(0)
window_name = "usb camera"
# 啟用 MJPEG 壓縮
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
# 嘗試設(shè)置為 60 FPS(是否成功取決于攝像頭)
cap.set(cv2.CAP_PROP_FPS, 60)
# 嘗試設(shè)置攝像頭分辨率
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
# 獲取實際設(shè)置的分辨率
actual_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
actual_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(f"實際分辨率: {actual_width}x{actual_height}")
# 打印實際幀率(FPS)
fps = cap.get(cv2.CAP_PROP_FPS)
print(f"攝像頭幀率: {fps} FPS")
cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)
cv2.resizeWindow(window_name, actual_width, actual_height) # 窗口匹配分辨率
while True:
ret, frame = cap.read()
if not ret:
print("讀取失敗")
break
cv2.imshow(window_name, frame)
if cv2.waitKey(1) == 27: # ESC鍵退出
break
cap.release()
cv2.destroyAllWindows()
二、相關(guān)設(shè)置
cap.set(參數(shù)屬性, 期望值),用于向攝像頭硬件發(fā)送配置請求,嘗試將某個參數(shù)(如編碼格式、幀率、分辨率)設(shè)置為指定值。
編碼格式: cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M','J','P','G')) 是一個 常見且推薦的操作,尤其在需要高分辨率、高幀率 或 USB帶寬受限的場景。MJPEG(Motion-JPEG)壓縮能顯著減少數(shù)據(jù)量,使攝像頭在有限帶寬下支持更高的分辨率(如1080p/4K)和幀率(如60FPS/120FPS),同時降低CPU解碼負(fù)擔(dān)。相比原始格式(如YUYV),MJPEG 在實時視頻捕獲中更高效,兼容性廣,是OpenCV、工業(yè)相機(jī)及嵌入式設(shè)備的常用選擇。若攝像頭支持,建議優(yōu)先啟用 MJPEG 以優(yōu)化性能,若不支持,可回退到默認(rèn)格式。
幀率:cap.set(cv2.CAP_PROP_FPS, 60) 是 OpenCV 中控制幀率的屬性參數(shù),用于設(shè)置攝像頭的目標(biāo)采集幀率(如60FPS),60是一個請求值,實際幀率取決于攝像頭的硬件能力和當(dāng)前配置的分辨率/編碼格式等,可能最高僅支持30FPS,即使設(shè)置為60FPS也會自動降級。
分辨率:cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) 用于設(shè)置攝像頭采集畫面的目標(biāo)寬度(水平分辨率),1920同樣是一個請求值,實際分辨率可能被攝像頭自動調(diào)整為最接近的支持值。
其他參數(shù)設(shè)置可供參考并以設(shè)備實際響應(yīng)為準(zhǔn)。
| 參數(shù)類別 | OpenCV 屬性名 | 典型值/選項 | 作用說明 | 適用場景 |
|---|---|---|---|---|
| 自動曝光 | CAP_PROP_AUTO_EXPOSURE | 1(自動), 0(手動) | 控制攝像頭是否自動調(diào)整曝光量 | 光照變化頻繁的環(huán)境(如戶外) |
| 手動曝光 | CAP_PROP_EXPOSURE | 范圍依賴硬件,典型范圍為 -13 到 0 | 手動設(shè)置曝光值(正值增亮,負(fù)值減暗) | 需要固定曝光(如工業(yè)檢測) |
| 自動白平衡 | CAP_PROP_AUTO_WB | 1(自動), 0(手動) | 啟用/禁用自動白平衡 | 色彩準(zhǔn)確性要求高的場景 |
| 手動白平衡 | CAP_PROP_WB_TEMPERATURE | 色溫值(如 5000K) | 手動設(shè)置白平衡色溫 | 特殊光照條件(如霓虹燈環(huán)境) |
| 緩沖區(qū)大小 | CAP_PROP_BUFFERSIZE | 1(最小延遲) | 減少攝像頭內(nèi)部緩沖幀數(shù),降低延遲 | 實時控制(如無人機(jī)、機(jī)器人視覺) |
| 自動對焦 | CAP_PROP_AUTOFOCUS | 1(啟用), 0(禁用) | 控制攝像頭是否自動對焦 | 動態(tài)距離變化的場景(如人臉跟蹤) |
| 手動對焦 | CAP_PROP_FOCUS | 0(最近)-100(最遠(yuǎn)) | 手動調(diào)整對焦距離 | 固定焦距需求(如顯微鏡拍攝) |
| API后端選擇 | cv2.VideoCapture() 的第二個參數(shù) | cv2.CAP_V4L2(Linux常用) | 指定視頻采集后端,解決兼容性問題 | 跨平臺或特定系統(tǒng)(如Linux用V4L2) |
| 亮度調(diào)整 | CAP_PROP_BRIGHTNESS | 0-100 | 調(diào)整畫面整體亮度 | 低光環(huán)境補(bǔ)償 |
| 對比度調(diào)整 | CAP_PROP_CONTRAST | 0-100 | 調(diào)整畫面對比度 | 增強(qiáng)細(xì)節(jié)可見性 |
| 飽和度調(diào)整 | CAP_PROP_SATURATION | 0-100 | 調(diào)整色彩飽和度 | 色彩增強(qiáng)或黑白模式 |
| 增益控制 | CAP_PROP_GAIN | 0-100 | 調(diào)整信號放大倍數(shù)(可能增加噪點) | 極低光照環(huán)境 |
三、知識延展
使用Python和OpenCV連接并處理IP攝像頭視頻流
安裝必要的庫
要完成本教程,您需要確保已安裝了Python環(huán)境以及OpenCV庫。如果您還沒有安裝OpenCV,可以通過pip工具輕松安裝:
pip install opencv-python
獲取IP攝像頭的URL
每個IP攝像頭都有一個特定的URL用來訪問其視頻流。這個URL通常遵循以下格式:
- RTSP (Real Time Streaming Protocol): rtsp://<ip_address>/path
- HTTP: http://<ip_address>/path
其中 <ip_address> 是您的IP攝像頭的IP地址,而 /path 則是訪問視頻流的具體路徑。對于一些攝像頭來說,這個路徑可能是固定的,如 /video.mjpg 或 /live.sdp。對于其他攝像頭,您可能需要查閱產(chǎn)品手冊來找到正確的路徑。
如果您的攝像頭需要身份驗證,那么URL格式可能會有所不同,例如:
- 帶認(rèn)證的RTSP: rtsp://username:password@ip_address/path
- 帶認(rèn)證的HTTP: http://username:password@ip_address/path
請?zhí)鎿Q上述模板中的 username, password, ip_address, 和 path 為實際值。
編寫代碼
接下來,我們將編寫一個簡單的Python腳本來捕獲并顯示來自IP攝像頭的視頻流。
import cv2
# 指定IP攝像頭的URL
url = 'rtsp://admin:123456@192.168.1.216/H264?ch=1&subtype=0'
# 創(chuàng)建一個VideoCapture對象,參數(shù)是視頻源,這里是我們指定的IP攝像頭URL
cap = cv2.VideoCapture(url)
# 檢查是否成功打開視頻流
if not cap.isOpened():
print("Error: Could not open video stream.")
else:
print("Video stream opened successfully.")
# 開始循環(huán)讀取視頻幀
while True:
# 讀取一幀視頻
ret, frame = cap.read()
# 如果讀取成功(ret為True),則顯示這一幀
if ret:
# 顯示視頻幀
cv2.imshow('Capturing', frame)
# 檢測按鍵,如果按下'q'鍵則退出循環(huán)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
# 如果讀取失敗,打印錯誤信息并嘗試重新連接
print("Error: Failed to read frame from video stream.")
# 可選:嘗試重新連接
cap.release()
cap = cv2.VideoCapture(url)
# 清理資源
cap.release()
cv2.destroyAllWindows()
代碼解析
導(dǎo)入OpenCV庫:我們首先導(dǎo)入了OpenCV庫,這是一個強(qiáng)大的計算機(jī)視覺庫,支持多種編程語言,包括Python。
指定IP攝像頭的URL:這里指定了一個包含用戶名和密碼的RTSP協(xié)議URL,用于訪問IP攝像頭。
創(chuàng)建VideoCapture對象:通過傳遞URL給cv2.VideoCapture()函數(shù)來創(chuàng)建一個視頻捕獲對象。
檢查視頻流是否打開:使用isOpened()方法檢查視頻流是否成功打開。如果沒有成功,打印錯誤信息。
讀取視頻幀:在一個無限循環(huán)中,調(diào)用read()方法從視頻流中讀取下一幀。如果讀取成功,ret變量將為True,并且frame變量將包含當(dāng)前幀的數(shù)據(jù)。
顯示視頻幀:使用imshow()函數(shù)顯示當(dāng)前讀取到的視頻幀。
檢測按鍵:使用waitKey(1)等待1毫秒,如果在這期間用戶按下’q’鍵,則跳出循環(huán)。
清理資源:在結(jié)束程序之前,釋放視頻捕獲對象并關(guān)閉所有OpenCV創(chuàng)建的窗口。
到此這篇關(guān)于Python使用OpenCV捕獲攝像頭視頻流并在窗口中顯示的文章就介紹到這了,更多相關(guān)Python OpenCV捕獲攝像頭視頻流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python數(shù)據(jù)分析之使用matplotlib繪制折線圖、柱狀圖和柱線混合圖
matplotlib是python的一個模塊,用于繪制各種圖形,今天介紹一下折線圖的繪制,下面這篇文章主要給大家介紹了關(guān)于Python數(shù)據(jù)分析之使用matplotlib繪制折線圖、柱狀圖和柱線混合圖的相關(guān)資料,需要的朋友可以參考下2022-05-05
Python實現(xiàn)處理apiDoc轉(zhuǎn)swagger的方法詳解
這篇文章主要為大家詳細(xì)介紹了Python實現(xiàn)處理apiDoc轉(zhuǎn)swagger的方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下2023-02-02
python+webdriver自動化環(huán)境搭建步驟詳解
在本篇文章里小編給大家分享了關(guān)于python+webdriver自動化環(huán)境搭建的詳細(xì)步驟以及注意點,需要的朋友們參考下。2019-06-06

