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. Пока что нет комментариев.
  1. Пока что нет уведомлений.