使用python和OpenCV与VideoCapture洞察多个网络摄像头捕获

时间:2013-11-05 18:50:30

标签: python opencv camera video-capture image-capture

我正在尝试同时(或几乎同时)从多个网络摄像头捕获图像。我一直在玩 OpenCV VideoCapture 并在python中编程。但是有一些困惑,希望有人可以帮忙解释一下......

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

我的设置是在单个USB端口上的USB集线器中的2个便宜的网络摄像头和我的笔记本电脑的内置网络摄像头。

我已经阅读了有关在同一USB总线上使用相同型号网络摄像头以及它可能无法正常工作的所有内容等等,但我决定试一试。 (我也有一些必须在之前安装过的名为“Cyber​​link YouCam”的photobooth程序。出于某种原因,这个程序“看起来”像OpenCV和VideoCapture的相机。

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

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

使用VideoCapture和我描述的设置,我可以独立捕获我系统上的所有摄像头(总共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会打开,但这就是它的结束。冻结。

VideoCapture的另一件事是,在廉价网络摄像头上,有一个很大的延迟(差不多一秒钟),直到图片还活着......为了成功捕获,我不得不这样做:

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.

但是延迟太多了......我认为延迟是廉价的网络摄像头,但我看到Open CV有不同的结果,所以它一定是VideoCapture的错。

首先,我可以使用OpenCV同时打开多个摄像头......但只能使用不同类型的摄像头。 (其中一个便宜的凸轮和我内置的凸轮......和/或Cyber​​link程序)OpenCV似乎在同一个USB集线器上看到2个廉价凸轮(它只打开其中一个凸轮。)

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)

虽然VideoCapture可以独立看到2个类似的摄像机,但OpenCV却无法看到。

任何人都知道为什么会这样?这两个软件包与计算机的交互方式有何不同,以至于可以在同一个USB上确定不同的凸轮而另一个不能?

其次,OpenCV瞬间打开我的便宜的摄像头......没有.75秒的延迟。

再次,我很好奇两个包(videoCapture与OpenCV)如何以不同方式与相机通信?

我最感兴趣的是能够同时从2个或3个摄像头捕捉(或接近它,如果有几毫秒的延迟,那很好)。看起来OpenCV将是首选软件包,但是,我试图更好地了解软件如何与相机进行交互。

谢谢大家的见解!

Ĵ

5 个答案:

答案 0 :(得分:0)

我可以告诉你一些关于OpenCV的信息,但不是关于VideoCapture的信息。但是,我会使用VideoCapture获取漂亮的相机名称。

我在python中使用OpenCV可以同时成功地与两个摄像头对话。在某些情况下,两个相机是不同的,有时它们是相同的但科学水平,所以也许驱动程序更好。我不能说有两个相同的相机不会给你带来麻烦。

但是,我可以说您正在使用以及可能未维护的相机API。使用名为VideoCapture的新cv2命名空间/ API 。请参阅以cv2开头的OpenCV VideoCapture class python绑定。如果你的python发行版中有新版本的OpenCV,可以通过import cv2访问它。旧约束在cv2.cv中(另请注意,从OpenCV 2.4.6开始,VideoCapture::get(...)::set(...)的许多重要常量只能在cv2.cv中找到,这是应该在下一个版本中修复)

答案 1 :(得分:0)

更多见解......

我可以连接到两台Logitech网络摄像头,并使用OpenCV 2.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摄像头,我就可以成功枚举所有摄像机。

答案 2 :(得分:0)

自从我参与这个项目以来已经有一段时间了,感谢工作和生活像往常一样妨碍...

我最近构建了一台运行linux的全新计算机,我再次参与其中 - 尝试从多台摄像机捕获输入。这次我使用4个不错的微软网络摄像头而不是超便宜的摄像头......

我再次能够与所有相机进行通信(我甚至尝试通过集线器将它们全部放在同一个USB控制器上,并且可以独立地与每个相机进行通信) - 但不能同时进行。

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

我正在尝试Pygame的相机库和我的脚本打开相机的时间,抓住框架并保存它是不是时间让相机准备好自己因此我的捕获图像要么是黑暗的(或者一半)黑暗)并且没有焦点。

我正在使用OpenCV(我现在要回去尝试)能够同时与摄像机通信(所有4个摄像头上的灯同时打开)我正在希望这意味着我可以“提前打开它们”,然后根据需要捕捉帧。现在我能够看到来自每个摄像头的实时视频(不是同时,但我可以通过更改设备编号单独测试它们)但不幸的是,因为我把这个项目放了一段时间,我忘记了一些代码我需要做更多的事情,而不会遇到错误,所以我必须做一些工作。

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

我还没有尝试过这段代码,但我喜欢这个人加入“扔掉帧”以让相机有时间调整自己的想法。我的目标是连续打开相机,然后在我按键或其他东西时简单地拍摄照片(捕捉画面)。

Ĵ

更多更新:

使用OpenCV,我可以同时连接多达5个网络摄像头(4个Microsoft和一个Logitech),当每个连接器连接到不同的USB控制器时(我使用的主板似乎有8个,我有6个) USB端口,目前)。但是当我在一个USB控制器上连接多个凸轮时(即同一控制器上的2个端口或使用集线器),OpenCV似乎只能控制每个控制器上的两个摄像头之一。

然而,使用PyGame的相机模块,我可以在一个USB控制器(与有源集线器连接)上单独连接多达5个摄像头但是我不能同时连接到多个(这不是即使它们在不同的USB控制器上也能正常工作。同样,我不需要同时从所有摄像头进行实时馈送,但摄像机需要时间自行设置,因此无法提前“打开摄像机”,我无法“拍照” “值得。

然后继续......

答案 3 :(得分:0)

我也对此进行了修改。我可以确认你一次只能做一个相机。我尝试过线程和无数其他事情,但都失败了。

这是我提出的代码。也许它会帮助某人。我有一堆"测试代码"在那里。欢迎您继续前往我离开的地方:https://gist.github.com/dovy/4fe2924ea31869def1e8

代码完全正常,您只需安装cv2即可。 ;)

答案 4 :(得分:0)

我认为这是USB带宽问题。没有内置压缩的网络摄像头使用大量带宽。将相机分辨率的宽度*高度乘以颜色深度(例如,256色为8位)按帧速率得到每秒的位数(没有任何USB帧开销),你会看到单个USB2高速(480兆位/秒)通道不能携带超过1个HD流(1280 * 1024 * 8 * 30 fps~ = 314.6兆比特/秒)。使用集线器时,所有端口之间共享该带宽。当驱动程序打开相机时,它将读取带宽要求,如果USB通道上的剩余带宽不足,则拒绝继续。这就是你打开的第一台摄像机工作的原因,但后续的摄像机失灵了。您可以选择使用分辨率较低的相机,将高分辨率相机移动到不同的根集线器,或使用H264或MJPEG压缩相机。