OPENCV摄像头读取视频的实现示例
作者:月疯
本文主要介绍了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摄像头读取视频内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!