Zxing не декодирует код с изображения ⇐ JAVA
Zxing не декодирует код с изображения
Я использую zxing в Java, и код не декодируется. Какую обработку можно выполнить с изображением с помощью opencv.
Я превращаю код в серое изображение, затем увеличиваю резкость с помощью opencv, но zxing не хочет декодировать это изображение. Я также попробовал порог. opencv — 4.7, zxing — 3.5.2
мой пример кода
пакет org.example; импортировать java.awt.image.BufferedImage; импортировать java.io.ByteArrayInputStream; импортировать java.io.IOException; импортировать java.io.InputStream; импортировать java.util.Arrays; импортировать java.util.HashMap; импортировать java.util.Map; импортировать javax.imageio.ImageIO; импортировать com.google.zxing.BarcodeFormat; импортировать com.google.zxing.BinaryBitmap; импортировать com.google.zxing.DecodeHintType; импортировать com.google.zxing.FormatException; импортировать com.google.zxing.MultiFormatReader; импортировать com.google.zxing.NotFoundException; импортировать com.google.zxing.Result; импортировать com.google.zxing.client.j2se.BufferedImageLuminanceSource; импортировать com.google.zxing.common.GlobalHistogramBinarizer; импортировать nu.pattern.OpenCV; импортировать org.opencv.core.Core; импортировать org.opencv.core.Mat; импортировать org.opencv.core.MatOfByte; импортировать org.opencv.core.Size; импортировать org.opencv.imgcodecs.Imgcodecs; импортировать org.opencv.imgproc.Imgproc; общественный класс QRCode { public static BufferedImage Mat2BufferedImage(Mat mat) выдает IOException { //Кодируем изображение MatOfByte matOfByte = новый MatOfByte(); Imgcodecs.imencode(".png", mat, matOfByte); //Сохранение закодированного Mat в массиве байтов byte[] byteArray = matOfByte.toArray(); //Подготовка буферизованного изображения InputStream in = новый ByteArrayInputStream (byteArray); BufferedImage bufImage = ImageIO.read(in); вернуть bufImage; } // Функция для чтения QR-файла общедоступный статический результат readQR (путь к строке) выдает IOException, NotFoundException, FormatException { Mat src = Imgcodecs.imread(путь); Матовый серый = новый Мат(); Imgproc.cvtColor(src, серый, Imgproc.COLOR_BGR2GRAY); Матовое размытие = новый Мат(); Imgproc.GaussianBlur(серый, размытие, новый размер(9, 9), 0); Резкость мата = новый Mat(); Core.addWeighted(серый, 1,7, размытие, -0,5, 0, резкость); Imgproc.erode(sharpness, резкость, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2, 2))); Мат thresh = новый Mat(); Imgproc.threshold(резкость, порог, 125, 255, Imgproc.THRESH_BINARY + Imgproc.THRESH_OTSU); BinaryBitmapbinaryBitmap = новый BinaryBitmap(новый GlobalHistogramBinarizer( новый BufferedImageLuminanceSource( Mat2BufferedImage (обмолот) ) )); Подсказки Map = new HashMap(); подсказки.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); подсказки.put(DecodeHintType.POSSIBLE_FORMATS, Arrays.asList(BarcodeFormat.AZTEC)); подсказки.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE); // Создаём ацтекскую читалку Читатель MultiFormatReader = новый MultiFormatReader(); // Декодируем код ацтеков Результат результата = ноль; пытаться { результат = reader.decode(binaryBitmap, подсказки); Строка decodedData = result.getText(); // Распечатываем декодированные данные System.out.println("Декодированные данные: " + decodedData); } catch (NotFoundException e) { System.out.println("Ацтекский код не найден"); } вернуть результат; } // Код драйвера public static void main(String[] args) выдает IOException, NotFoundException, FormatException { OpenCV.loadShared(); Строковый путь = "code.png"; System.out.println( "Вывод QRCode: " + readQR(путь)); } }
Я использую zxing в Java, и код не декодируется. Какую обработку можно выполнить с изображением с помощью opencv.
Я превращаю код в серое изображение, затем увеличиваю резкость с помощью opencv, но zxing не хочет декодировать это изображение. Я также попробовал порог. opencv — 4.7, zxing — 3.5.2
мой пример кода
пакет org.example; импортировать java.awt.image.BufferedImage; импортировать java.io.ByteArrayInputStream; импортировать java.io.IOException; импортировать java.io.InputStream; импортировать java.util.Arrays; импортировать java.util.HashMap; импортировать java.util.Map; импортировать javax.imageio.ImageIO; импортировать com.google.zxing.BarcodeFormat; импортировать com.google.zxing.BinaryBitmap; импортировать com.google.zxing.DecodeHintType; импортировать com.google.zxing.FormatException; импортировать com.google.zxing.MultiFormatReader; импортировать com.google.zxing.NotFoundException; импортировать com.google.zxing.Result; импортировать com.google.zxing.client.j2se.BufferedImageLuminanceSource; импортировать com.google.zxing.common.GlobalHistogramBinarizer; импортировать nu.pattern.OpenCV; импортировать org.opencv.core.Core; импортировать org.opencv.core.Mat; импортировать org.opencv.core.MatOfByte; импортировать org.opencv.core.Size; импортировать org.opencv.imgcodecs.Imgcodecs; импортировать org.opencv.imgproc.Imgproc; общественный класс QRCode { public static BufferedImage Mat2BufferedImage(Mat mat) выдает IOException { //Кодируем изображение MatOfByte matOfByte = новый MatOfByte(); Imgcodecs.imencode(".png", mat, matOfByte); //Сохранение закодированного Mat в массиве байтов byte[] byteArray = matOfByte.toArray(); //Подготовка буферизованного изображения InputStream in = новый ByteArrayInputStream (byteArray); BufferedImage bufImage = ImageIO.read(in); вернуть bufImage; } // Функция для чтения QR-файла общедоступный статический результат readQR (путь к строке) выдает IOException, NotFoundException, FormatException { Mat src = Imgcodecs.imread(путь); Матовый серый = новый Мат(); Imgproc.cvtColor(src, серый, Imgproc.COLOR_BGR2GRAY); Матовое размытие = новый Мат(); Imgproc.GaussianBlur(серый, размытие, новый размер(9, 9), 0); Резкость мата = новый Mat(); Core.addWeighted(серый, 1,7, размытие, -0,5, 0, резкость); Imgproc.erode(sharpness, резкость, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2, 2))); Мат thresh = новый Mat(); Imgproc.threshold(резкость, порог, 125, 255, Imgproc.THRESH_BINARY + Imgproc.THRESH_OTSU); BinaryBitmapbinaryBitmap = новый BinaryBitmap(новый GlobalHistogramBinarizer( новый BufferedImageLuminanceSource( Mat2BufferedImage (обмолот) ) )); Подсказки Map = new HashMap(); подсказки.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); подсказки.put(DecodeHintType.POSSIBLE_FORMATS, Arrays.asList(BarcodeFormat.AZTEC)); подсказки.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE); // Создаём ацтекскую читалку Читатель MultiFormatReader = новый MultiFormatReader(); // Декодируем код ацтеков Результат результата = ноль; пытаться { результат = reader.decode(binaryBitmap, подсказки); Строка decodedData = result.getText(); // Распечатываем декодированные данные System.out.println("Декодированные данные: " + decodedData); } catch (NotFoundException e) { System.out.println("Ацтекский код не найден"); } вернуть результат; } // Код драйвера public static void main(String[] args) выдает IOException, NotFoundException, FormatException { OpenCV.loadShared(); Строковый путь = "code.png"; System.out.println( "Вывод QRCode: " + readQR(путь)); } }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение