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摄像头读取视频内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论