11

此错误消息出现在使用罗技 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
4

5 回答 5

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,并且在执行上述操作之前遇到了相同的唠叨错误消息。

于 2013-04-06T15:05:45.413 回答
5

关于问题:

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

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

cmake -D CMAKE_BUILD_TYPE=发布 -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 ..

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

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

于 2016-04-10T16:44:32.137 回答
2

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

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

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

于 2013-03-21T16:53:19.397 回答
1

我会将此作为评论发布(没有足够的声誉),但我还是被困在这里,我发现的解决方案虽然不优雅,但是:

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

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

于 2020-03-26T01:45:46.857 回答
0

如果您只想快速摆脱输出并且grep -v Corrupt无法以某种方式工作 - 就像我一样 - 您也可以将 stderr 重定向到任何内容,例如

./my_app 2> /dev/null

python my_app.py 2> /dev/null

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

于 2017-08-25T09:05:46.393 回答