Python使用OpenCV同时读取多个USB摄像头的方法与局限
本文介绍了使用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接入顺序保存在某个数据结构中。据此,可以假设通过设备插入的先后顺序来判断使用哪个摄像头。
以上就是本文的全部内容,希望对读者的学习有所帮助,也欢迎大家继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









