1

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

我现在已经搜索了几个小时,但由于我不知道是什么原因造成的,我不确定哪个关键字可能有助于搜索。对我来说,看起来好像在摄像头仍在更新帧时读取了来自网络摄像头的图像(但这只是一个猜测)。我测试了 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;
4

2 回答 2

2

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

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

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

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

编辑:

看看卡尔菲利普的回答

于 2012-11-19T22:42:32.227 回答
1

我在这里找到了另一个线程,它指出openCV如何捕获帧的实现可能是罪魁祸首:

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

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

于 2012-11-23T21:43:26.363 回答