Ubuntu网络摄像头上的Opencv错误(Logitech C270)捕获 - > HIGHGUI错误:V4L / V4L2:VIDIOC_S_CROP

时间:2013-03-20 19:51:13

标签: opencv webcam capture

使用logitech C270(OpenCV 2.4.2 / C ++)在Ubuntu上运行简单的相机捕获时会出现此错误消息:

  

HIGHGUI错误:V4L / V4L2:VIDIOC_S_CROP

并进一步:

  

损坏的JPEG数据:标记0xd1之前的2个无关字节   损坏的JPEG数据:标记0xd6之前的1个外部字节   损坏的JPEG数据:标记0xd0之前的1个无关字节   损坏的JPEG数据:标记0xd0之前的1个无关字节

我得到帧但是在写入Mat对象时交换了帧宽和高度的值,见下文:

Mat frame;
videoCapture = new VideoCapture(camId);
if(!videoCapture->isOpened()) throw Exception();

cout << "Frame width: " << videoCapture->get(CV_CAP_PROP_FRAME_WIDTH) << endl;
cout << "Frame height: " << videoCapture->get(CV_CAP_PROP_FRAME_HEIGHT) << endl;

(*videoCapture) >> frame;

cout << "Mat width: " << frame.rows << endl;
cout << "Mat height: " << frame.cols << endl;

输出:

Frame width: 640
Frame height: 480
Mat width: 480
Mat height: 640

5 个答案:

答案 0 :(得分:7)

如果您不想调试问题,并且网络摄像头中的帧显示没有任何问题,您可以选择拍摄信使。如果您从源代码构建了OpenCV,而不是安装预构建的二进制文件,则下面的说明会有效。

grep -R "Corrupt JPEG data" ~/src/opencv-2.4.4/开始,深入兔洞直到找到你想要的东西。就我而言,罪魁祸首是opencv-2.4.4/thirdparty/libjpeg/jdmarker.c:908

  if (cinfo->marker->discarded_bytes != 0) {
    WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c);
    cinfo->marker->discarded_bytes = 0;
  }

WARNMS2宏是导致打印有关无关数据的错误消息的原因。只需评论它,重建OpenCV并继续你的工作。我也有一个C270,运行Ubuntu 12.04,并经历了同样的唠叨错误信息,直到我做了上面描述的内容。

答案 1 :(得分:5)

关于问题:

  

损坏的JPEG数据:标记0xd1之前的2个无关字节损坏JPEG   data:标记0xd6之前的1个无关字节损坏的JPEG数据:1   标记0xd0之前的无关字节损坏的JPEG数据:1个无关的   标记0xd0之前的字节

看起来,问题出在libjpeg库中。由于某些未知原因,它在OpenCV库下工作不正确。我试图编译而不支持JPEG,它解决了这个问题。

cmake -D CMAKE_BUILD_TYPE = Release -D CMAKE_INSTALL_PREFIX = / usr / local -D BUILD_SHARED_LIBS = OFF -D BUILD_EXAMPLES = OFF -D BUILD_TESTS = OFF -D BUILD_PERF_TESTS = OFF -D WITH_JPEG = OFF -D WITH_IPP = OFF .. < / p>

您可以在我的博客中找到所有详细信息:

http://privateblog.info/linux/opencv-i-corrupt-jpeg-data-na-linux/

答案 2 :(得分:2)

图像的宽度由列数给出。你的代码应该是

cout << "Mat width: " << frame.cols << endl;
cout << "Mat height: " << frame.rows << endl;

所以宽度和高度之间没有交换。

答案 3 :(得分:1)

我会将其发布为评论(信誉不足),但是,我仍然停留在这里,我发现的解决方案虽然不够优雅,但仍然是:

python my_app.py 2<&1 | grep -v "Corrupt JPEG data"

注意:要复制正常的python打印语句行为,我正在使用os.system(f'echo {my_string}')

答案 4 :(得分:0)

如果你只是想快速摆脱输出而且grep -v Corrupt不能以某种方式起作用 - 比如对我来说 - 你也可以将stderr重定向为空,例如。

./my_app 2> /dev/null

python my_app.py 2> /dev/null

这当然会隐藏其他错误消息。