Подтвердить что ты не робот

Ошибка Opencv на веб-камеру Ubuntu (Logitech C270) Capture → HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP

появляется это сообщение 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
4b9b3361

Ответ 1

Ширина изображения определяется его количеством столбцов. Ваш код должен быть

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

Таким образом, нет никакой замены между шириной и высотой.

Ответ 2

Если вы не хотите отлаживать проблему, и кадры из вашей веб-камеры отображаются без каких-либо проблем, вы можете просто расстрелять посланника. Ниже приведены инструкции, если вы создали 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 и испытал такое же сообщение об ошибке, пока я не сделал то, что я описал выше.

Ответ 3

О проблеме:

Коррумпированные данные 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/

Ответ 4

Если вы просто хотите быстро избавиться от вывода, а grep -v Corrupt не работает так или иначе - как для меня - вы также можете перенаправить stderr на ничего, например

./my_app 2> /dev/null

python my_app.py 2> /dev/null

Это, конечно же, скрыть другие сообщения об ошибках.