与罗技C270(OpenCV的2.4.2 / C ++)在Ubuntu运行简单的照相机捕获出现此erorr消息:
HIGHGUI ERROR:V4L / V4L2:VIDIOC_S_CROP
并进一步:
损坏的JPEG数据:前标记0xd1腐败JPEG数据2个字节无关:前标记0xd6腐败JPEG数据1个字节无关:前标记0xd0腐败JPEG数据1个字节无关:标记0xd0前1个外来字节
我得到帧,但帧的宽度和高度写入垫对象见下文时交换的值:
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
的图像的宽度由它的列数给出。 你的代码应该是
cout << "Mat width: " << frame.cols << endl;
cout << "Mat height: " << frame.rows << endl;
因此,有宽度和高度之间没有交换。
如果你不喜欢调试问题,并没有任何问题正在显示从您的网络框架,你的选择是只拍的使者。 下面工作的说明,如果你已经建立了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,并经历了同样的唠叨错误消息,直到我做了上述我。
关于问题:
损坏的JPEG数据:前标记0xd1腐败JPEG数据2个字节无关:前标记0xd6腐败JPEG数据1个字节无关:前标记0xd0腐败JPEG数据1个字节无关:标记0xd0前1个外来字节
看起来,这个问题是在库的libjpeg。 对于一些未知的原因,它在OpenCV库工作不正确。 我试着不支持JPEG的编译和它解决了这个问题。
cmake的-D CMAKE_BUILD_TYPE =释放-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.info/linux/opencv-i-corrupt-jpeg-data-na-linux/
如果你只是希望尽快摆脱输出和grep -v Corrupt
不会为不知何故工作-像我-你也可以重定向错误输出到什么,例如,
./my_app 2> /dev/null
python my_app.py 2> /dev/null
当然,这将隐藏其他错误消息,太。
文章来源: Opencv Error on Ubuntu Webcam (Logitech C270) Capture -> HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP