【问题标题】:JavaCV - Improve Webcam QualityJavaCV - 提高网络摄像头质量
【发布时间】:2019-02-22 18:27:20
【问题描述】:

我目前正在尝试实现网络摄像头扫描仪。我目前的问题是使用 Java 时无法捕获高质量的图像。 我使用的相机有 8MP,当我使用 Windows“相机”应用程序时,它会产生很棒的图像。遗憾的是,我无法用 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 相机应用相同的分辨率和质量捕捉图像?

亲切的问候, 问

【问题讨论】:

  • 尝试使用 ImageMagic 代替 AWT 功能。

标签: java webcam javacv


【解决方案1】:

BufferedImage 在 Java 中非常消耗内存,因为它将图像存储为类似位图的图像格式。其他使用压缩的图像格式消耗更少的内存。但是如何在 JavaCV 中使用它们呢?

首先,使用分析器应用检查哪些代码导致了实现的大量内存消耗。希望 Frame 仍以压缩形式存储图像数据;并且在执行 frameConverter.convert 时会消耗大量内存。在这种情况下,搜索将图像作为 JPEG(或任何其他压缩数据)存储在 byte[] 中的解决方案 - 为了显示图像,您可以直接绘制图像,例如到 Graphics2D 元素,无需先将其转换为 BufferedImage。因此使用 ToolkitImage,它能够从 InputStream 图像源中绘制 JPEG 图像。如果您能够直接从 JavaCV 以 JPEG 格式存储高分辨率图像,则可以是 ByteArrayInputStream。

【讨论】:

  • 感谢您的回复,不过我不太明白您的回答。你暗示我捕捉质量差的原因是内存问题?在我发布我的问题后,我又测试了两件事。将高分辨率图像加载为 BufferedImage 并再次保存不会使质量变差。并且显示的图像(我转换 Frame->javafx.Image)质量已经很差了。
  • 我的意思是,由于内存(或者,在添加后处理的情况下,由于 CPU 负载高)问题,您无法使用 8MP 捕获图像。我在您的问题中没有找到明确的说明,为什么您无法使用 8MP 捕获图像,所以这只是假设您使用 OpenCV 的 8MP 图片出现某种错误/性能不佳。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
相关资源
最近更新 更多