使用VideoCapture从网络摄像头拍摄的图片有50%

时间:2012-11-19 21:39:13

标签: linux opencv webcam capture v4l

我想使用openCV从Logitech C300网络摄像头拍摄单帧。当我使用下面的代码。图像已保存,但在大约50%的情况下,它们包含错误(see image)。

我现在已经搜索了几个小时,但由于我不知道是什么导致它,我不确定哪个关键字可能有助于搜索。对我来说,看起来好像是在摄像头仍在更新帧时读取网络摄像头的图像(但这只是猜测)。我测试了uvccapture,它使用标准选项产生相同的问题(但不常见),但在使用-m选项时没有问题。根据man-page,它是“将捕获模式切换到YUYV捕获”。

所以我的问题是,有没有办法在openCV中使用这种模式?我想避免直接使用v4l2。

VideoCapture cap(0);
if(!cap.isOpened())
cout << "Opening video device failed" << endl;
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1024);
Mat frame;
for(int i = 0; i<50; i++)

{
    stringstream str;
    str << "/home/ubuntu/image" << i<< ".jpg";
    cap >> frame;
    imwrite(str.str(), frame);
    cout << i << endl;
}

return 0;

2 个答案:

答案 0 :(得分:2)

您是否尝试过不设置框架宽度和高度?

如果有必要,您也可以稍后重新缩放图像,默认情况下,您将从VideoCapture获得最大分辨率。

是的,也尝试在每一帧之前等待:

cv::waitKey(30); // it waits only for 30ms, that could be your fps on the webcam.

编辑:

查看Karl Philipp's answer

答案 1 :(得分:1)

我发现了另一个线程here,它声明openCV如何捕获帧的实现可能是罪魁祸首:

  

OpenCV调用video-4-linux(v4l2)从摄像头请求RGB帧。我的相机正在提供JPEG压缩图像,v4l2使用非常慢的软件解码器进行解压缩。

我正在使用BeagleBoard,当使用(方便的)openCV函数时,我遇到了上述问题。我尝试了程序Martin Fox在线程中链接,该程序直接使用v4l2从网络摄像头获取YUV帧。现在可以拍摄高达1280x1024像素的照片而不会出现网络摄像头传感器的分辨率问题。