use*_*424 11 webcam opencv 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;
Run Code Online (Sandbox Code Playgroud)
输出:
Frame width: 640
Frame height: 480
Mat width: 480
Mat height: 640
Run Code Online (Sandbox Code Playgroud)
如果您不想调试问题,并且显示网络摄像头中的帧没有任何问题,您可以选择拍摄信使.如果您从源代码构建了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;
}
Run Code Online (Sandbox Code Playgroud)
该WARNMS2宏是什么导致要打印有关无关的数据的错误消息.只需评论它,重建OpenCV并继续你的工作.我也有一个C270,运行Ubuntu 12.04,并经历了相同的唠叨错误信息,直到我做了我上面描述的.
关于问题:
损坏的JPEG数据:标记0xd1之前的2个外部字节损坏的JPEG数据:标记0xd6之前的1个外部字节损坏的JPEG数据:标记0xd0之前的1个外部字节损坏的JPEG数据:标记0xd0之前的1个外部字节
看起来,问题出在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 ..
您可以在我的博客中找到所有详细信息:
http://privateblog.info/linux/opencv-i-corrupt-jpeg-data-na-linux/
图像的宽度由其列数给出。你的代码应该是
cout << "Mat width: " << frame.cols << endl;
cout << "Mat height: " << frame.rows << endl;
Run Code Online (Sandbox Code Playgroud)
所以宽度和高度之间没有交换。
| 归档时间: |
|
| 查看次数: |
16972 次 |
| 最近记录: |