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

Jay*_*Jay 5 python camera opencv image-capture video-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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

如果每个摄像机的图像相隔几毫秒,我就不会想到了

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

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

#etc.
Run Code Online (Sandbox Code Playgroud)

但延迟太多了......我认为延迟是廉价的网络摄像头,但我看到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)
Run Code Online (Sandbox Code Playgroud)

虽然VideoCapture可以独立看到2个相似的摄像头,但OpenCV却无法看到.

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

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

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

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

谢谢大家的见解!

Ĵ

小智 0

我可以告诉你一些有关OpenCV的信息,但不能告诉你有关 VideoCapture 的信息。不过,我确实使用 VideoCapture 来获得漂亮的相机名称。

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

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


归档时间:

查看次数:

8478 次

最近记录:

6 年,1 月 前