了解使用python和OpenCV与VideoCaptu进行多个网络摄像头捕获

2024-07-08 10:15:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试同时(或几乎同时)从多个网络摄像头捕捉图像。我一直在玩OpenCV、VideoCapture和python编程。但有些困惑,希望有人能帮忙解释。。。

首先,我尝试了视频捕捉(Markus Gritsch的工作在这里找到:http://videocapture.sourceforge.net/)。 这是一个非常易于使用的python插件。如果我只是想捕捉一个简单的图像。它工作得很好。。。在很大程度上。

我的设置是两个便宜的摄像头在一个USB接口上的USB集线器和我的笔记本电脑的内置摄像头。

我读过所有关于在同一个USB总线上使用同一型号的摄像头,以及它可能无法工作的内容,等等,但我决定尝试一下。(我也有一些照片亭的程序,我一定已经安装了很久以前称为“Cyberlink YouCam”出于某种原因,这个程序“看起来”像是一个摄像头,对OpenCV和视频捕捉。

视频捕获连接到每个摄像头并从中捕获,如下所示:

Cam0 = Device(devnum=0)
Cam0.saveSnapshot("filename0.jpg")
del Cam0
Cam1 = Device(devnum=1)
Cam1.saveSnapshot("filename1.jpg")
del Cam1

有了视频捕捉和我描述的设置,我可以独立地从我的系统上的所有相机(共4个,包括YouCam。。。0至3)

问题是这个程序似乎不能同时连接到多个摄像机。。。如果我不关闭前一个摄像头实例,它就会冻结,我必须断开并重新连接第一个摄像头与USB的连接,才能重新访问它。

这行不通:

cam0 = Device(devnum=0)
cam1 = Device(devnum=1)
cam0.saveSnapshot("filename0.jpg")
cam1.saveSnapshot("filename1.jpg")
del cam0
del cam1

Cam0将打开,但这是它的结束。冻僵了。

另一件事是,在cheapo摄像头上,有一个很大的延迟(几乎一秒钟)直到图片变得生动。。。为了成功抓捕,我不得不这样做:

Cam1 = Device(devnum=1)
Cam1.saveSnapshot("filename1.jpg") #gets the camera going and saves black image
time.sleep(.75) #delay
Cam1.saveSnapshot("filename1.jpg") #captures the image second time around

有效地保存图像两次。。。

如果每台相机的图像在静默中相隔几毫秒,我是不会介意的

#open connection to cam, take image
#close connection to cam

#connect to next cam, take next image
#close connection to cam

#etc.

但是耽搁太久了。。。我以为是因为网络摄像头太便宜了,但我看到了另一个结果,因为简历是公开的,所以一定是视频捕获的错。

首先,我可以用OpenCV同时打开多个相机。。。但只有不同类型的。(其中一个cheapo摄像头和我的内置摄像头。。。和/或Cyberlink程序)OpenCV似乎看到两个cheapo摄像头和一个摄像头在同一个USB集线器上(它只打开其中一个摄像头)

capture0 = CaptureFromCAM(0) #this was Cyberlink Program
capture1 = CaptureFromCAM(1) #this was cheapo cam
capture2 = CaptureFromCAM(2) #this was built-in cam
#CaptureFromCAM(3) resulted in error... did not find a 4th "camera"

frame0 = QueryFrame(capure0)
frame1 = QueryFrame(capure1)
frame2 = QueryFrame(capure2)
cv.SaveImage("filename0.jpg",frame0)
cv.SaveImage("filename1.jpg",frame1)
cv.SaveImage("filename2.jpg",frame2)

然而,视频捕捉可以看到两个类似的相机独立,OpenCV不能。

有人知道为什么吗?两个软件包与计算机的交互方式有什么不同,一个可以在同一个USB上确定不同的摄像头,另一个不能?

其次,OpenCV立刻打开了我的廉价相机。。。不,在那里耽搁了75秒。

同样,我很好奇这两个软件包(视频捕捉和OpenCV)与摄像头之间的通信方式有什么不同?

我最终感兴趣的是能够同时从2或3个摄像机上拍摄(或者接近它,如果有几毫秒的延迟,那就可以了)。看起来OpenCV是一个不错的选择,但是,我试图更好地理解软件是如何与摄像头交互的。

谢谢大家的洞察力!

J型


Tags: 图像程序视频deviceopencvusbjpg摄像头
3条回答

由于工作和生活的阻碍,我已经有一段时间没有参与这个项目了。。。

我最近建立了一台运行linux的全新计算机,我再次尝试——尝试从多个摄像头捕捉输入。这次我用的是4个不错的微软摄像头,而不是超便宜的摄像头。。。

我又一次能够与所有的摄像头进行通信(我甚至尝试通过集线器将它们放在同一个USB控制器上,并且能够独立地与每个摄像头进行通信),但不能同时进行。

这对我来说无关紧要,因为我不需要同时连接到它们,但是当它们第一次通电时,内部百叶窗必须打开和调整,自动对焦必须调整。。。

我正在尝试Pygame的相机库,而我的脚本打开相机、抓取帧并保存所需的时间不足以让相机做好准备,因此我的捕获图像要么是暗的(或半暗的),要么是失焦的。

我使用的是OpenCV(现在我将继续尝试)能够同时与摄像机通信(所有4个摄像头上的灯都同时亮起),我希望这意味着我可以提前“打开”,然后根据需要捕捉帧。现在我可以看到每台相机的实时视频(不是同时,但我可以通过更改设备号来单独测试它们),但不幸的是,由于我将这个项目搁置了一段时间,我忘记了一些代码,我需要在不出错的情况下对它做更多的工作,所以我必须对它做一些工作。

同时,我在网上发现了这个: http://codeplasma.com/2012/12/03/getting-webcam-images-with-python-and-opencv-2-for-real-this-time/

我还没有试过这个代码,但我喜欢这个人添加“扔掉的帧”的想法,让相机的时间调整自己。我的目标是让相机连续开着,然后当我按下一个键或其他什么的时候,简单地拍下照片(捕捉画面)。

J型

更多更新:

使用OpenCV,我可以同时连接多达5个摄像头(4个微软和1个Logitech),而每个摄像头都连接在不同的USB控制器上(我使用的主板似乎有8个USB端口,而我目前有6个)。但当我在一个USB控制器上连接多个摄像头时(即在同一个控制器上或使用集线器的两个端口),OpenCV似乎只控制每个控制器上两个摄像头中的一个。

然而,使用PyGame的摄像头模块,我可以在一个USB控制器上单独连接多达5个摄像头(连接有电源集线器),但是我不能同时连接多个摄像头(即使它们在不同的USB控制器上也不起作用)。再说一次,我不需要所有摄像机同时直播,但摄像机需要时间进行自我设置,因此如果不能提前“打开摄像机”,我就无法“拍出一张值得的照片”。

它继续。。。

更多的洞察力。。。

我可以连接到两个Logitech网络摄像头,并使用OpenCV2.4.7在MacBook Pro(2011年末)上同时捕获,但不能在旧版MacBook Pro(2009年末)上同时捕获!

具体来说:

MacBook Pro 2011 -- 
WORKS: 2 x SAME MODEL plugged into SEPARATE USB Ports
FAILS: 2 x SAME MDOEL plugged into SAME USB Port (via a hub)
WORKS: 1 x SAME MODEL plugged into HUB and 1 x SAME MODEL plugged into laptop directly

MacBook Pro 2009 --
WORKS: 2 x DIFFERENT MODELS plugged into SEPARATE USB Ports
FAILS: 2 x SAME MANUFACTURER (!) plugged into SEPARATE USB Ports
FAILS: 2 x SAME MODEL

我想这里唯一真正的消息是一台最新的OpenCV电脑可以工作。。。至少对我来说!

在所有情况下,只要一次只打开一个USB摄像头,我就可以成功地枚举所有摄像头。

我可以告诉你一些关于OpenCV的信息,但不是关于视频捕获的。不过,我确实使用视频捕捉来获得好的摄像机名称。

我在python中使用OpenCV成功地同时与两个摄像头通话。在某些情况下,两个摄像头是不同的,其他时候它们是相同的,但科学水平,所以也许司机更好。我不能说有两个相同的摄像头不会给你带来问题。

但是,我可以说您使用的是旧的并且可能是未维护的camera API。使用新的cv2名称空间/API也叫做VideoCapture。请参阅以cv2开头的OpenCV VideoCapture classpython绑定。如果在python发行版中有新版本的OpenCV,则可以通过import cv2访问它。旧的绑定在cv2.cv中(还要注意,从OpenCV 2.4.6开始,许多VideoCapture::get(...)::set(...)的重要常量只在cv2.cv中找到,这应该在下一个版本中修复)

相关问题 更多 >

    热门问题