Ответ 1
Ширина изображения определяется его количеством столбцов. Ваш код должен быть
cout << "Mat width: " << frame.cols << endl;
cout << "Mat height: " << frame.rows << endl;
Таким образом, нет никакой замены между шириной и высотой.
появляется это сообщение erorr при запуске простого захвата камеры на Ubuntu с помощью logitech C270 (OpenCV 2.4.2/С++):
HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP
и далее:
Коррумпированные данные JPEG: 2 посторонних байта перед маркером 0xd1 Коррумпированные данные JPEG: 1 посторонний байт перед маркером 0xd6 Коррумпированные данные JPEG: 1 посторонний байт перед маркером 0xd0 Коррумпированные данные JPEG: 1 посторонние байты перед маркером 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
Ширина изображения определяется его количеством столбцов. Ваш код должен быть
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: 2 посторонних байта перед маркером 0xd1 Коррумпированный JPEG данные: 1 посторонние байты перед маркером 0xd6 Коррумпированные данные JPEG: 1 посторонние байты перед маркером 0xd0 Коррумпированные данные JPEG: 1 посторонний байты перед маркером 0xd0
Похоже, проблема в библиотеке 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/
Если вы просто хотите быстро избавиться от вывода, а grep -v Corrupt
не работает так или иначе - как для меня - вы также можете перенаправить stderr на ничего, например
./my_app 2> /dev/null
python my_app.py 2> /dev/null
Это, конечно же, скрыть другие сообщения об ошибках.