我正在开发一个需要与许多不同USB网络摄像头通信的Windows Python 2.7应用程序。我一直在使用OpenCV,但对于一些科学的网络摄像头,没有检测到默认帧速率,捕获格式等,我只得到一张空白图像。可以打开DirectShow属性页面的外部程序可以在我的程序中解决这个问题,但我想在我的应用程序中使用此功能。
我已经尝试了一个可用的Python库来执行此操作:VideoCapture(http://videocapture.sourceforge.net/)。虽然这会打开属性页,但它不允许更改任何设备设置(“错误连接...此格式当前不可用”,但AMCAP可以正常工作)。我想知道底层代码是否过时了。
在VideoCapture或videoInput(http://www.muonics.net/school/spring05/videoInput/)中使用C ++代码并不是很有用,因为它们都依赖于遍布众多旧的特定DirectX /的旧库WindowsSDK包。不幸的是,我没有足够的知识或时间从头开始或弄清楚VideoCapture有什么问题。
是否有另外一个已经组装好的Python包可以做到这一点?我一直在寻找一段时间,运气不佳。我看了一下libvlc python绑定(因为VLC可以访问属性页面)和DirectPython,但我不清楚这些是否有我正在寻找的东西。
谢谢!
答案 0 :(得分:0)
由于我最近对此进行了研究,我可以为任何感兴趣的人提供部分回答我自己的问题:
videoInput库包含在OpenCV中的Direct Show实现中。 videoInput库可用于打开视频属性页面(增益,曝光等),但不能用于视频设置页面(具有捕获格式,图像大小,帧速率等),因为没有它的代码。 Cython可用于在Python中与此库进行交互,而不会出现太多问题。
OpenCV的Python绑定可用于访问Direct Show视频属性页面。这需要:
CV_CAP_DSHOW
添加到索引(无python常量,使用值700)。CV_CAP_PROP_SETTINGS
中的(未记录的)propID VideoCapture::set(int propID, ...)
调用窗口进行显示。同样,这个常量不在Python绑定中,所以使用值37(来自highgui_c.h)(这些说明适用于OpenCV 2.4.6,希望更多的常量会出现在Python绑定中)
答案 1 :(得分:0)
我有一个类似的声音问题。基本上,我偶然通过想要看到我捕获的内容来修复它。
cap = cv2.VideoCapture(0)
print cap.read() #once to inialize
print cap.read() #twice to check that it actually initialized
第一个.read()
返回(False, None)
,而第二个实际拥有Feed。在我添加之前,我会将None
传递给cv2.imshow('title',frame)
,我的程序会崩溃。
我不知道这是否能解决你的问题。我是DinoLite USB显微镜,我想我只是通过DirectX访问它。 OpenCV 2.4.8。