OPENCV摄像头读取视频的实现示例

 更新时间:2025年09月28日 08:33:26   作者:月疯  
本文主要介绍了OPENCV摄像头读取视频,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

OpenCV 读取摄像头的代码示例

以下是几种使用 OpenCV 读取摄像头的常见方法:

1. 基础摄像头读取

import cv2

# 打开默认摄像头(通常是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. 设置摄像头参数

import cv2

cap = cv2.VideoCapture(0)

# 设置摄像头参数
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)   # 宽度
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)  # 高度
cap.set(cv2.CAP_PROP_FPS, 30)            # 帧率

# 获取实际参数值
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:
            # 在每帧上标记摄像头编号
            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个或更多摄像头,可以调整布局
        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)

# 设置视频编码器和输出文件
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
    
    # 根据模式处理图像
    if mode == 1:
        processed = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        processed = cv2.cvtColor(processed, cv2.COLOR_GRAY2BGR)  # 转回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()
    
    # 显示当前模式
    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):如果读取成功,这是一个包含图像数据的 NumPy 数组
# 显示一帧图像
    cv2.imshow('frame', frame)

    # 如果按下'q'键,退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

到此这篇关于OPENCV摄像头读取视频的实现示例的文章就介绍到这了,更多相关OPENCV摄像头读取视频内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Python paramiko模块利用多线程实现ssh并发执行操作

    使用Python paramiko模块利用多线程实现ssh并发执行操作

    ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography)。这篇文章主要介绍了使用Python paramiko模块利用多线程实现ssh并发执行操作,需要的朋友可以参考下
    2019-12-12
  • Python使用smtplib库开发一个邮件自动发送工具

    Python使用smtplib库开发一个邮件自动发送工具

    在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们轻松实现这些功能,本教程将详细介绍如何使用Python的smtplib库开发一个功能完整的邮件自动发送工具,需要的朋友可以参考下
    2025-06-06
  • Python实现求两个csv文件交集的方法

    Python实现求两个csv文件交集的方法

    这篇文章主要介绍了Python实现求两个csv文件交集的方法,涉及Python针对csv文件的读取、遍历、判断等相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • Python3实现简单可学习的手写体识别(实例讲解)

    Python3实现简单可学习的手写体识别(实例讲解)

    下面小编就为大家带来一篇Python3实现简单可学习的手写体识别(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例

    Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例

    这篇文章主要介绍了Python找到最大或最小的N个元素实现方法,涉及Python基于heapq模块进行集合运算的相关操作技巧,需要的朋友可以参考下
    2018-02-02
  • python解析mdf或mf4文件利器之asammdf用法

    python解析mdf或mf4文件利器之asammdf用法

    这篇文章主要介绍了python解析mdf或mf4文件利器之asammdf用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • 详解Python同时写入多个文件的5种方法

    详解Python同时写入多个文件的5种方法

    在实际开发中,有同学经常问田辛老师需要将数据同时写入多个文件的场景,Python提供了多种高效且安全的方法来实现这一需求,下面小编就来和大家简单讲讲吧
    2025-05-05
  • 探索Python函数调用为何加速代码执行原理

    探索Python函数调用为何加速代码执行原理

    Python 作为一种解释型语言,其执行速度相对于编译型语言可能会较慢,然而,在Python中,通常观察到代码在函数中运行得更快的现象,这个现象主要是由于函数调用的内部优化和解释器的工作方式导致的,本文将深入探讨这个现象,并通过详细的示例代码进行解释
    2024-01-01
  • Python中的filter()函数的3种使用方式详解

    Python中的filter()函数的3种使用方式详解

    这篇文章主要介绍了Python中的filter()函数的3种使用方式,Python中filter()函数用于过滤序列,返回迭代器,支持函数式编程,可配合lambda或自定义函数,与列表推导式类似但更高效,需要的朋友可以参考下
    2025-05-05
  • 查看python安装路径及pip安装的包列表及路径

    查看python安装路径及pip安装的包列表及路径

    这篇文章主要介绍了查看python安装路径及pip安装的包列表及路径,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04

最新评论