开发者

Python使用OpenCV捕获摄像头视频流并在窗口中显示

开发者 https://www.devze.com 2025-08-02 09:20 出处:网络 作者: 饭来_
目录一、实例代码二、相关设置三、知识延展一、实例代码 连接 USB 相机之后,通过指令ls /dev/video*查看设备号,通过一个简单的脚本使用 OpenCV 库来捕获摄像头视频流并在窗口中显示,ESC键退出。
目录
  • 一、实例代码
  • 二、相关设置
  • 三、知识延展

一、实例代码

连接 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同样是一个请求值,实际分辨率可能被php摄像头自动调整为最接近的支持值。

其他参数设置可供参考并以设备实际响应为准。

参数类别OpenCV 属性名典型值/选项作用说明适用场景
自动曝光CAP_PROP_AUTO_EXPOSURE1(自动), 0(手动)控制摄像头是否自动调整曝光量光照变化频繁的环境(如户外)
手动曝光CAP_PROP_EXPOSURE范围依赖硬件,典型范围为 -13 到 0手动设置曝光值(正值增亮,负值减暗)需要固定曝光(如工业检测)
自动白平衡CAP_PROP_AUTO_WB1(自动), 0(手动)启用/禁用自动白平衡色彩准确性要求高的场景
手动白平衡CAP_PROP_WB_TEMPERATURE色温值(如 5000K)手动设置白平衡色温特殊光照条件(如霓虹灯环境)
缓冲区大小CAP_PROP_BUFFERSIZE1(最小延迟)减少摄像头内部缓冲帧数,降低延迟实时控制(如无人机、机器人视觉)
自动对焦CAP_PROP_AUTOFOCUS1(启用), 0(禁用)控制摄像头是否自动对焦动态距离变化的场景(如人编程客栈脸跟踪)
手动对焦CAP_PROP_FOCUS0(最近)-100(最远)手动调整对焦距离固定焦距需求(如显微镜拍摄)
API后端选择cv2.VideoCapture() 的第二个参数cv2.CAP_V4L2(linux常用)指定视频采集后端,解决兼容性问题跨平台或特定系统(如Linux用V4L2)
亮度调整CAP_PROP_BRIGHTNESS0-100调整画面整体亮度低光环境补偿
对比度调整CAP_PROP_CONTRAST0-100调整画面对比度增强细节可见性
饱和度调整CAP_PROP_SATURATION0-100调整色彩饱和度色彩增强或黑白模式
增益控制CAP_PROP_GAIN0-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为Tr编程客栈ue),则显示这一帧
    if ret:
        # 显示视频帧
        cv2.imshow('Capturing', frame)
        
        # 检测按键,如果按下'q'键则退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
  js  else:
        # 如果读取失败,打印错误信息并尝试重新连接
        print("Error: Failed to read frame from video stream.")
        # 可选:尝试重新连接
        cap.release()
        cap = cv2.VideoCapture(url)

# 清理资源
cap.release()
cv2.destroyAllWindowsandroid()

代码解析

导入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捕获摄像头视频流内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号