im当前正在尝试实施网络摄像头扫描仪。我当前的问题是使用Java时无法捕获高质量的图像。 当我使用Windows“ Camera” -App时,我使用的相机具有8MP并产生出色的图像。可悲的是,我无法用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 App相同的图像?
亲切的问候,
答案 0 :(得分:0)
BufferedImage在Java中非常消耗内存,因为它以类似于图像格式的位图存储图像。使用压缩的其他图像格式消耗更少的内存。但是如何在JavaCV中使用它们?
首先,使用事件探查器应用程序检查哪个代码负责实现中的大量内存消耗。希望框架以压缩形式存储图像数据;并且在执行frameConverter.convert时会消耗大量内存。在这种情况下,请搜索将图像以JPEG(或任何其他压缩数据)的形式存储在byte []中的解决方案-为了显示图像,您可以直接绘制图像,例如到Graphics2D元素,无需先将其转换为BufferedImage。因此,请使用ToolkitImage,它可以从InputStream图像源绘制JPEG图像。如果您能够直接从JavaCV将高分辨率图像存储为JPEG,则可以为ByteArrayInputStream。