如何在同一OpenCV代码文件中实现两个USB摄像头实时捕获?
实现双USB摄像头实时捕获在同一代码文件中
当然可以在同一个代码文件里搞定双摄像头的实时捕获!不需要复制两份代码改索引,只需要创建两个cv2.VideoCapture实例分别对应你的两个摄像头,然后在同一个循环里读取并展示它们的画面就行。
这里给你调整后的代码,我还加了摄像头初始化的检查,避免出现设备无法打开的情况:
import numpy as np import cv2 # 初始化两个摄像头实例,分别对应索引0和1 cap0 = cv2.VideoCapture(0) cap1 = cv2.VideoCapture(1) # 检查摄像头是否成功打开 if not cap0.isOpened(): print("❌ 无法打开USB-Camera_0") exit() if not cap1.isOpened(): print("❌ 无法打开USB-Camera_1") exit() while True: # 分别读取两个摄像头的帧 ret0, frame0 = cap0.read() ret1, frame1 = cap1.read() # 检查帧是否读取成功 if not ret0: print("⚠️ 无法获取USB-Camera_0的帧") break if not ret1: print("⚠️ 无法获取USB-Camera_1的帧") break # 分别显示两个摄像头的画面,窗口名称要唯一 cv2.imshow('USB-Camera_0', frame0) cv2.imshow('USB-Camera_1', frame1) # 按下'q'键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放两个摄像头资源 cap0.release() cap1.release() # 销毁所有显示窗口 cv2.destroyAllWindows()
一些关键注意事项:
- 窗口名称唯一:
cv2.imshow()的第一个参数是窗口名,必须不一样,不然第二个窗口会直接覆盖第一个的内容。 - 设备索引确认:你已经明确两个摄像头对应索引0和1,这个没问题,如果后续出现识别问题,可以通过
ls /dev/video*(Linux)或者设备管理器(Windows)确认设备的实际索引。 - 性能优化:如果运行时出现卡顿或者帧率过低,可以尝试通过
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)和cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)降低摄像头的分辨率,减少数据处理量。如果还是不行,再考虑用多线程分别处理两个摄像头的捕获逻辑。
内容的提问来源于stack exchange,提问作者Houssem Khatrchi
相关产品推荐
相关产品推荐

