JavaCV - улучшить качество веб-камеры - PullRequest
0 голосов
/ 22 февраля 2019

Я сейчас пытаюсь реализовать сканер для веб-камеры.Моя текущая проблема заключается в том, что я не могу получить высококачественное изображение при использовании Java.Камера, которую я использую, имеет 8-мегапиксельную камеру и выдает отличные изображения, когда я использую Windows «Camera» - приложение.К сожалению, я не могу воспроизвести это качество с JavaCV.

Это (важный) код, который я использую для захвата изображения:

FrameGrabber grabber;
private Java2DFrameConverter frameConverter;
public JavaCVCamera(String imagePath, double rotation) {
    this.frameConverter = new Java2DFrameConverter();
    this.imagePath = imagePath;
    this.rotation = rotation;
    this.grabber = new OpenCVFrameGrabber(0);
    this.grabber.setImageWidth(3264);
    this.grabber.setImageHeight(2448);
    try {
        this.grabber.start();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
public void saveImageToFile(boolean applyUpscaling, boolean applyRotation) {
    File folder = new File(imagePath);
    if (!folder.exists()) {
        folder.mkdirs();
    }

    try {
        BufferedImage img = frameConverter.convert(grabber.grab());

        if (applyUpscaling) {
            img = Thumbnails.of(img).forceSize(3264, 2448).asBufferedImage();
        }

        if (applyRotation) {
            img = rotateImageByDegrees(img, rotation);
        }

        File path = new File(imagePath + "/img_"
                + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy_MM_dd_HH_mm_ss")) + "." + "png");
        ImageIO.write(img, "png", path);
        LOGGER.info("Captured Image: {}", path.toString());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

(Примечание: я не использую масштабирование доувеличьте изображения)

Для вашего понимания, вот пример:

Есть ли способ захвата изображений с тем же разрешением и качеством, что и у приложения Windows Camera?

С уважением, QUE

1 Ответ

0 голосов
/ 22 февраля 2019

BufferedImage очень потребляет память в Java, поскольку сохраняет изображение в растровом формате.Другие форматы изображений, использующие сжатие, занимают меньше памяти.Но как использовать их с JavaCV?

Прежде всего, проверьте с помощью приложения профилировщика, какой код отвечает за интенсивное использование памяти вашей реализацией.Надеемся, что Frame хранит данные изображения в сжатом виде;и при выполнении frameConverter.convert он потребляет большое количество памяти.В этом случае ищите решение, которое хранит изображение в виде JPEG (или любых других сжатых данных) в байте [] - для отображения изображения вы можете нарисовать изображение непосредственно, например, в элементе Graphics2D без преобразования его вBufferedImage первым.Поэтому используйте ToolkitImage, который способен рисовать изображение JPEG из источника изображения InputStream.Это может быть ByteArrayInputStream, если вы смогли сохранить изображение в высоком разрешении в формате JPEG непосредственно из JavaCV.

...