1

我正在开发一个需要实时访问网络摄像头的项目,并且在 Windows 10 下获取合适的摄像头流以使用 OpenCV 处理帧时遇到问题。

我可以在 Windows 8.1 下正常访问相机。使用任一

这些允许以高帧率 (~30fps) 捕获网络摄像头流,并使用例如设置网络摄像头分辨率

cvCapture.set(CV_CAP_PROP_FRAME_WIDTH, 640);

cvCapture.set(CV_CAP_PROP_FRAME_HEIGHT, 480);

但是,在 Windows 10 下,上述两种解决方案都会导致问题:

  • 使用 OpenCV 2.4.9 的解决方案,并且 VideoInput 库允许将分辨率设置为 640x480,但帧速率约为 1FPS(或更糟?!),并且图片很暗
  • 使用 OpenCV 3.0 的解决方案以良好的帧速率为我提供了一个不错的 1920x1080 图像,但我无法设置流的分辨率

我什至尝试使用以下方法打开相机流:

cv::VideoCapture cvCapture(CV_CAP_DSHOW + camnum);

cv::VideoCapture cvCapture (CV_CAP_MSMF + camnum);

第一个有效(就打开流而言,但存在与上述相同的问题),MSMF(Microsoft Media Foundation)导致 cvCapture.isOpened() 返回 false;

对于图像处理算法来说,实时处理 FullHD 流是不可行的,使用 OpenCV 调整结果帧的大小也不可行。

Windows 8.1 版本在 Surface Pro 3 (Core i7) 上运行,Windows 10 版本在 Surface Pro 4 (Core i7) 上运行。这可能是硬件/相机驱动程序问题吗?我尝试查找 Surface 4 的更新驱动程序,但无济于事。

有没有人遇到过类似的问题?我忽略了一个明显的解决方案吗?

4

1 回答 1

1

我认为您在 Windows 10 上的 videoInput 问题与选择正确的网络摄像头媒体类型有关。事实上,OpenCV 默认使用 DirectShow,Media Foundation 上的 videoInput 只是可选的。我建议您更正检查变量:

float MF_MT_FRAME_RATE_RANGE_MAX;
float MF_MT_FRAME_RATE;
float MF_MT_FRAME_RATE_RANGE_MIN;

// Structure of info MediaType 
struct MediaType

我还可以建议访问现场Capture Manager Topology Editor - 这是一个免费软件,用于通过 Media Foundation 使用网络摄像头。它允许在 Surface Pro 4 (Core i7) 上验证 Media Foundation 的可访问功能。

最好的问候, Evgeny Pereguda

于 2016-03-15T10:54:44.260 回答