在使用logitech C270 (OpenCV 2.4.2/C++)在Ubuntu上运行简单的相机捕获时,会出现此erorr消息:
高界面错误: V4L/V4L2: VIDIOC_S_CROP
并进一步:
损坏的JPEG数据:标记0xd1之前的2个外部字节,损坏的JPEG数据:标记0xd6之前的一个外部字节,损坏的JPEG数据:标记0xd0之前的一个外部字节,损坏的JPEG数据:标记0xd0之前的一个外部字节
我得到帧,但是在写入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发布于 2013-03-21 16:53:19
图像的宽度由它的列数决定。你的代码应该是
cout << "Mat width: " << frame.cols << endl;
cout << "Mat height: " << frame.rows << endl;所以在宽度和高度之间没有交换。
发布于 2013-04-06 15:05:45
如果你不想调试这个问题,并且你的摄像头显示的画面没有任何问题,你的选择就是直接射击信使。如果您已经从源代码构建了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,运行Ubuntu12.04,并且经历了同样的唠叨错误信息,直到我做了上面描述的事情。
发布于 2016-04-10 16:44:32
关于问题:
损坏的JPEG数据:标记0xd1之前的2个外部字节,损坏的JPEG数据:标记0xd6之前的一个外部字节,损坏的JPEG数据:标记0xd0之前的一个外部字节,损坏的JPEG数据:标记0xd0之前的一个外部字节
看起来,问题在libjpeg库中。由于一些未知的原因,它在OpenCV库下工作不正确。我试图在不支持JPEG的情况下编译,它解决了这个问题。
-D CMAKE_BUILD_TYPE=Release -D cmake _INSTALL_PREFIX=/usr/ -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/
https://stackoverflow.com/questions/15533338
复制相似问题