Python使用OpenCV同时读取多个USB摄像头的方法与局限

Miles
Miles
发布时间:2026-10-13 | 4人浏览过
原创

本文介绍了使用Python和OpenCV库同时读取多个USB摄像头的实现方法。通过为不同摄像头分配不同的索引号(如0、1),可以并行获取视频流。然而,文章指出仅靠索引无法区分具体硬件设备,建议通过源码分析理解设备接入顺序与索引的对应关系,以解决多设备连接时的识别问题。

Python OpenCV多USB摄像头读取教程及设备识别问题

本文分享了一个使用Python结合cv2库读取多个USB摄像头的具体代码示例,供读者参考学习。

单摄像头基本操作示例

利用cv2库可以方便地获取摄像头数据。例如,只需几步操作即可打开摄像头进行显示,并通过按下q键保存当前画面为图片。


import cv2

capture = cv2.VideoCapture(0)
# 打开自带的摄像头
if capture.isOpened():
 # 以下两步设置显示屏的宽高
 capture .set(cv2.CAP_PROP_FRAME_WIDTH, 640)
 capture .set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
 
 # 持续读取摄像头数据
 while True:
  read_code, frame = capture.read()
  if not read_code:
   break
  cv2.imshow("screen_title", frame)
  # 输入 q 键,保存当前画面为图片
  if cv2.waitKey(1) == ord('q'):
   # 设置图片分辨率
   frame = cv2.resize(frame, (1920, 1080))
   cv2.imwrite('pic.jpg', frame)
   break
 # 释放资源  
 capture.release()
 cv2.destroyWindow("screen_title")  

多摄像头并行读取实现思路

当接入一个USB摄像头时,若希望代码能同时操作多个摄像头,该如何实现?观察capture的open函数可知,它传入了摄像头的编号,而新增的摄像头编号通常是递增分配的。

基于上述观察,对代码进行如下修改:


import cv2

capture = cv2.VideoCapture(0)
capture_usb = cv2.VideoCapture(1)
# 打开自带的摄像头
if capture.isOpened():
 if capture_usb.isOpened():
 # 以下设置显示屏的宽高
 capture.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
 capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
 capture_usb.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
 capture_usb.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
 
 # 持续读取摄像头数据
 while True:
  read_code, frame = capture.read()
  read_code2, frame2 = capture_usb.read()
  if not read_code or not read_code2:
   break
  cv2.imshow("screen_title", frame)
  cv2.imshow("screen_title_usb", frame2)
  # 输入 q 键,保存当前画面为图片
  if cv2.waitKey(1) == ord('q'):
   # 设置图片分辨率
   frame = cv2.resize(frame, (1920, 1080))
   cv2.imwrite('pic.jpg', frame)
   capture_usb.release()
   break
 # 释放资源  
 capture.release()
 cv2.destroyWindow("screen_title")

多设备连接的识别局限与源码分析

尽管上述修改已能实现多摄像头的同时操作,但如果继续接入更多的USB摄像头,我们将无法准确区分哪个索引值对应哪个具体的USB设备。

通过检查相关实现源码(参考链接:cap_8cpp_source.html),

发现open函数确实仅接收索引参数,没有其他同名实现。若希望通过类似硬件ID的方式唯一确定参数,则需要单独开发此类方法。

然而,通过分析源码发现,getAvailableBackends_CaptureByIndex()方法中调用了相关逻辑,因此可以推测摄像头信息可能按照USB接入顺序保存在某个数据结构中。据此,可以假设通过设备插入的先后顺序来判断使用哪个摄像头。

以上就是本文的全部内容,希望对读者的学习有所帮助,也欢迎大家继续支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表