一、实例代码
连接 usb 相机之后,通过指令ls /dev/video*查看设备号,通过一个简单的脚本使用 opencv 库来捕获摄像头视频流并在窗口中显示,esc键退出。
import cv2
# 摄像头设备号
cap = cv2.videocapture(0)
window_name = "usb camera"
# 启用 mjpeg 压缩
cap.set(cv2.cap_prop_fourcc, cv2.videowriter_fourcc('m', 'j', 'p', 'g'))
# 尝试设置为 60 fps(是否成功取决于摄像头)
cap.set(cv2.cap_prop_fps, 60)
# 尝试设置摄像头分辨率
cap.set(cv2.cap_prop_frame_width, 1920)
cap.set(cv2.cap_prop_frame_height, 1080)
# 获取实际设置的分辨率
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()
二、相关设置
cap.set(参数属性, 期望值),用于向摄像头硬件发送配置请求,尝试将某个参数(如编码格式、帧率、分辨率)设置为指定值。
编码格式: cap.set(cv2.cap_prop_fourcc, cv2.videowriter_fourcc('m','j','p','g')) 是一个 常见且推荐的操作,尤其在需要高分辨率、高帧率 或 usb带宽受限的场景。mjpeg(motion-jpeg)压缩能显著减少数据量,使摄像头在有限带宽下支持更高的分辨率(如1080p/4k)和帧率(如60fps/120fps),同时降低cpu解码负担。相比原始格式(如yuyv),mjpeg 在实时视频捕获中更高效,兼容性广,是opencv、工业相机及嵌入式设备的常用选择。若摄像头支持,建议优先启用 mjpeg 以优化性能,若不支持,可回退到默认格式。
帧率:cap.set(cv2.cap_prop_fps, 60) 是 opencv 中控制帧率的属性参数,用于设置摄像头的目标采集帧率(如60fps),60是一个请求值,实际帧率取决于摄像头的硬件能力和当前配置的分辨率/编码格式等,可能最高仅支持30fps,即使设置为60fps也会自动降级。
分辨率:cap.set(cv2.cap_prop_frame_width, 1920) 用于设置摄像头采集画面的目标宽度(水平分辨率),1920同样是一个请求值,实际分辨率可能被摄像头自动调整为最接近的支持值。
其他参数设置可供参考并以设备实际响应为准。
| 参数类别 | opencv 属性名 | 典型值/选项 | 作用说明 | 适用场景 |
|---|---|---|---|---|
| 自动曝光 | cap_prop_auto_exposure | 1(自动), 0(手动) | 控制摄像头是否自动调整曝光量 | 光照变化频繁的环境(如户外) |
| 手动曝光 | cap_prop_exposure | 范围依赖硬件,典型范围为 -13 到 0 | 手动设置曝光值(正值增亮,负值减暗) | 需要固定曝光(如工业检测) |
| 自动白平衡 | cap_prop_auto_wb | 1(自动), 0(手动) | 启用/禁用自动白平衡 | 色彩准确性要求高的场景 |
| 手动白平衡 | cap_prop_wb_temperature | 色温值(如 5000k) | 手动设置白平衡色温 | 特殊光照条件(如霓虹灯环境) |
| 缓冲区大小 | cap_prop_buffersize | 1(最小延迟) | 减少摄像头内部缓冲帧数,降低延迟 | 实时控制(如无人机、机器人视觉) |
| 自动对焦 | cap_prop_autofocus | 1(启用), 0(禁用) | 控制摄像头是否自动对焦 | 动态距离变化的场景(如人脸跟踪) |
| 手动对焦 | cap_prop_focus | 0(最近)-100(最远) | 手动调整对焦距离 | 固定焦距需求(如显微镜拍摄) |
| api后端选择 | cv2.videocapture() 的第二个参数 | cv2.cap_v4l2(linux常用) | 指定视频采集后端,解决兼容性问题 | 跨平台或特定系统(如linux用v4l2) |
| 亮度调整 | cap_prop_brightness | 0-100 | 调整画面整体亮度 | 低光环境补偿 |
| 对比度调整 | cap_prop_contrast | 0-100 | 调整画面对比度 | 增强细节可见性 |
| 饱和度调整 | cap_prop_saturation | 0-100 | 调整色彩饱和度 | 色彩增强或黑白模式 |
| 增益控制 | cap_prop_gain | 0-100 | 调整信号放大倍数(可能增加噪点) | 极低光照环境 |
三、知识延展
使用python和opencv连接并处理ip摄像头视频流
安装必要的库
要完成本教程,您需要确保已安装了python环境以及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。对于其他摄像头,您可能需要查阅产品手册来找到正确的路径。
如果您的摄像头需要身份验证,那么url格式可能会有所不同,例如:
- 带认证的rtsp: rtsp://username:password@ip_address/path
- 带认证的http: http://username:password@ip_address/path
请替换上述模板中的 username, password, ip_address, 和 path 为实际值。
编写代码
接下来,我们将编写一个简单的python脚本来捕获并显示来自ip摄像头的视频流。
import cv2
# 指定ip摄像头的url
url = 'rtsp://admin:123456@192.168.1.216/h264?ch=1&subtype=0'
# 创建一个videocapture对象,参数是视频源,这里是我们指定的ip摄像头url
cap = cv2.videocapture(url)
# 检查是否成功打开视频流
if not cap.isopened():
print("error: could not open video stream.")
else:
print("video stream opened successfully.")
# 开始循环读取视频帧
while true:
# 读取一帧视频
ret, frame = cap.read()
# 如果读取成功(ret为true),则显示这一帧
if ret:
# 显示视频帧
cv2.imshow('capturing', frame)
# 检测按键,如果按下'q'键则退出循环
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()
代码解析
导入opencv库:我们首先导入了opencv库,这是一个强大的计算机视觉库,支持多种编程语言,包括python。
指定ip摄像头的url:这里指定了一个包含用户名和密码的rtsp协议url,用于访问ip摄像头。
创建videocapture对象:通过传递url给cv2.videocapture()函数来创建一个视频捕获对象。
检查视频流是否打开:使用isopened()方法检查视频流是否成功打开。如果没有成功,打印错误信息。
读取视频帧:在一个无限循环中,调用read()方法从视频流中读取下一帧。如果读取成功,ret变量将为true,并且frame变量将包含当前帧的数据。
显示视频帧:使用imshow()函数显示当前读取到的视频帧。
检测按键:使用waitkey(1)等待1毫秒,如果在这期间用户按下’q’键,则跳出循环。
清理资源:在结束程序之前,释放视频捕获对象并关闭所有opencv创建的窗口。
到此这篇关于python使用opencv捕获摄像头视频流并在窗口中显示的文章就介绍到这了,更多相关python opencv捕获摄像头视频流内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论