正如 Roman 所指出的,大多数网络摄像头的默认模式是MJPEG 压缩,以降低需要通过 USB 连接(可能还有 USB 集线器等)的数据速率和/或最大化可用的帧速率/分辨率。
对于计算机视觉,这通常是不可取的,因为我们宁愿拥有较低的帧速率,但没有压缩伪影。实际上,通常可以以与例如改变分辨率的方式大致相同的方式来改变流格式(例如到未压缩的YUV)。这对你来说是否真的可行取决于
- 硬件支持哪些模式,
- 低级驱动程序支持哪些模式(通常是通用 USB 视频类/UVC 驱动程序),
- 后一种模式是通过所涉及的各种框架实现的(例如 Windows 的视频 / DirectX / Video4Linux2 等),以及
- 最后,在 OpenCV 中使用了视频捕获后端支持的这些。
不幸的是,后者的答案是none。OpenCV 有 18 个(!)不同的捕获后端(用于各种平台,例如手机、OS X、Windows 和 Linux,通常有几个用于不同版本的底层框架),尽管似乎有一个用于更改流格式的 API [ 1],它似乎没有被任何后端实现。:-(
如果您或其他任何人想要解决这个问题,您可能需要检查我打开的 OpenCV 问题:http ://code.opencv.org/issues/3007
就我而言,我对一些罗技网络摄像头进行了调查,这些摄像头甚至具有由 Windows 和 Linux 低级驱动程序公开的不同功能。在 Linux 下,我在不知不觉中使用了 OpenCV 的 GStreamer 后端,这意味着另一个层次的间接性——在底层它总是归结为 V4L(Linux 视频)内核 API。使用 libv4l 后端改进了一些事情,因为它具有默认为某些 YUV 流格式的好特性(尽管帧速率可能较低,这在其他情况下可能是不受欢迎的)。(甚至有不同的、不同的后端用于直接访问 v4l 内核 API 或通过 libv4l。)
[1] 请参阅 API 文档中的 CV_CAP_PROP_FORMAT:http: //opencv.willowgarage.com/documentation/cpp/reading_and_writing_images_and_video.html