2

我正在开发一个需要与许多不同 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,但我不清楚这些是否有我正在寻找的东西。

谢谢!

4

2 回答 2

0

由于我最近一直在研究这个问题,因此我可以为任何感兴趣的人提供我自己的问题的部分答案:

videoInput库包含在OpenCV的 Direct Show 实现中。videoInput库可用于打开视频属性页面(增益、曝光等),但不能用于打开视频设置页面(具有捕获格式、图像大小、帧速率等),因为它没有代码。 Cython可用于在 Python 中与此库进行交互,而不会出现太多问题。

OpenCV 的 Python 绑定可用于访问 Direct Show 视频属性页面。这需要:

  1. 打开相机设备时使用 Direct Show 驱动程序,通过将值添加CV_CAP_DSHOW到索引(没有 python 常量,使用值 700)。
  2. 调用窗口以CV_CAP_PROP_SETTINGS使用VideoCapture::set(int propID, ...). 同样,这个常量不在 Python 绑定中,所以使用值 37(来自 highgui_c.h)

(这些指令从 OpenCV 2.4.6 开始工作,希望 Python 绑定会出现更多常量)

于 2013-11-13T03:01:43.357 回答
0

我有一个类似的声音问题。基本上,我想看看我捕捉到的东西,不小心把它修好了。

cap = cv2.VideoCapture(0)
print cap.read()      #once to inialize
print cap.read()      #twice to check that it actually initialized

第一个.read()返回(False, None),而第二个实际上有提要。在我添加这个之前,我会传递Nonecv2.imshow('title',frame)我的程序会崩溃。

我不知道这是否能解决你的问题。我的是 DinoLite USB 显微镜,我想我只是通过 DirectX 访问它。OpenCV 2.4.8。

于 2014-03-12T11:53:56.277 回答