OpenCV и Corrupt JPEG data на Linux

При попытке перенести простой пример для OpenCV и веб-камеры Logitech С270 на Linux возникла проблема Corrupt JPEG data: 2 extraneous bytes before marker 0xd1 Поиск в internet показал, что проблема достаточно распространена и какого-то решения, которое сразу решает всё — нет. После нескольких сборок и экспериментов удалось локализовать проблему в библиотеке libjpeg. Простое удаление библиотеки не помогает (после этого падает java), но помогает сборка в параметром WITH_JPEG=OFF. Конечно, формат после этого не поддерживается, но можно читать и сохранять картинку в png. Вероятно, если указать другую версию при сборке, это и поможет, но такой эксперимент не делался.

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  ..

Можно доработать решение, сделав небольшую обработку картинки. В нашем случае картинка будет только пересохраняться с другим расширением:

String tempFile = "./shots/temp.png";
                        	
Imgcodecs.imwrite(tempFile, frame);  
                        	
Image image = ImageIO.read(new File(tempFile)); 
BufferedImage bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_BGR); 
                        	
Graphics2D bGr = bimage.createGraphics();  
bGr.drawImage(image, 0, 0, null);  
bGr.dispose();  
                        	
ImageIO.write(bimage, "jpg", new File("./shots/camera" + (index++) + ".jpg"));
  1. Владимир
    14 Июль 2017 в 17:18 | #1

    OpenCV 3.2 а воз и ныне там, и как-то без libjpeg грустно :(




    0



    0
  2. stakasha
    2 Август 2017 в 16:08 | #2

    В файле 3rdparty/libjpeg/jdmarker.c находим строку с JWRN_EXTRANEOUS_DATA и комментируем её, должно стать вот так:

    if (cinfo->marker->discarded_bytes != 0) {
    //WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c);
    cinfo->marker->discarded_bytes = 0;
    }

    Пересобираем с ключами cmake -D BUILD_JPEG=ON -D WITH_JPEG=ON, радуемся тишине.




    0



    0
  1. Пока что нет уведомлений.