【问题标题】:50% faulty pictures from webcam using VideoCapture使用 VideoCapture 来自网络摄像头的 50% 错误图片
【发布时间】:2012-11-07 21:38:15
【问题描述】:

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

我现在已经搜索了几个小时,但由于我不知道是什么原因造成的,我不确定哪个关键字可能有助于搜索。对我来说,看起来好像在摄像头仍在更新帧时读取了来自网络摄像头的图像(但这只是一个猜测)。我测试了 uvccapture,它使用标准选项会产生相同的问题(但不太常见),但在使用 -m 选项时可以正常工作。根据手册页,它是“将捕获模式切换为 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;

【问题讨论】:

    标签: linux opencv webcam capture v4l


    【解决方案1】:

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

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

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

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

    编辑:

    看看Karl Philipp's answer

    【讨论】:

    • 确实如此。当我评论这些行时,它起作用了。图像现在只有 640x480。根据罗技的说法,相机应该有 1.3 MP,所以如果你是对的,1MP 会丢失,这实际上是最大分辨率。 o.O
    • 您对 waitKey 的第二个建议 - 对原始问题没有任何改变。我想我现在会坚持使用 640x480,看看是否能找到更好的网络摄像头。非常感谢。
    • 这可能很烦人。 Np,这可能是 opencv 驱动程序支持问题。有一个网页可以检查支持的网络摄像头和最大值。决议(我以前在谷歌上看到过)。也可能值得尝试使用较低的分辨率。
    • 我编辑了答案,希望为您指明正确的方向。如果我的回答也有帮助,你也可以+1吗? :) 干杯
    • 当然。抱歉,我还不太熟悉 stackoverflow ;-)
    【解决方案2】:

    我发现另一个线程here 指出openCV 如何捕获帧的实现可能是罪魁祸首:

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

    我正在使用 BeagleBoard,在使用(方便的)openCV 功能时,我遇到了上述问题。我尝试了线程中链接的程序 Martin Fox,它直接使用 v4l2 从网络摄像头获取 YUV 帧。现在可以毫无问题地获取高达 1280x1024 像素的图片。网络摄像头传感器的分辨率是多少。

    【讨论】:

    • 哇,恭喜! :) 毕竟,我真的很高兴你找到了它,它一直在我的脑海中浮现,为什么 OpenCV 可以保持如此低的分辨率。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2020-02-06
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多