【问题标题】:Opencv Error on Ubuntu Webcam (Logitech C270) Capture -> HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROPUbuntu 网络摄像头 (Logitech C270) 捕获上的 Opencv 错误 -> HIGHGUI 错误:V4L/V4L2:VIDIOC_S_CROP
【发布时间】:2013-03-10 03:00:32
【问题描述】:

在使用 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

【问题讨论】:

    标签: opencv webcam capture


    【解决方案1】:

    关于问题:

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

    看起来,问题出在 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/

    【讨论】:

    • Linux 上的 JDK 包含自己的 libjpeg。现在我认为在编译期间使用这个库而不是从 linux 正确。它会导致问题。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      ./my_app 2> /dev/null
      
      python my_app.py 2> /dev/null
      

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

      【讨论】:

        【解决方案4】:

        如果您不想调试问题,并且您的网络摄像头的帧显示没有任何问题,您的选择是直接拍摄信使。如果您从源代码构建 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,并且在执行上述操作之前遇到了同样的烦人的错误消息。

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

          • 但我不知道如何摆脱您收到的错误消息。我也把它们放在我的机器上。
          猜你喜欢
          • 1970-01-01
          • 2013-04-23
          • 2014-04-07
          • 1970-01-01
          • 1970-01-01
          • 2015-08-18
          • 2012-03-16
          • 1970-01-01
          • 2013-08-17
          相关资源
          最近更新 更多