使用Java将图像保存到Mat中?

Tle*_*ung 4 java opencv

除jpeg文件外,某些bmp和tif图像文件无法使用以下方法读取。我想将其保存在opencv的Mat结构中。我该怎么办?我想将其转换为BufferedImage进行进一步处理。

File input = new File("C:\\File\\1.tif");
BufferedImage image = ImageIO.read(input);         
byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();            
Mat img = new Mat(image.getHeight(),image.getWidth(), CvType.CV_8UC3);
img.put(0, 0, data);            
Imgcodecs.imwrite("C:\\File\\input.jpg", img);
Run Code Online (Sandbox Code Playgroud)

Krz*_*cki 5

这是因为不同图像的数据类型不同。对于一个,您具有DataBufferByte,对于另一个,您可能具有DataBufferInt。

您可以使用3BYTE_BGR类型创建一个大小相同的新BufferedImage,然后将原始图像绘制到其中,然后可以从该新图像中构建Mat。

您还可以使用其他受支持的Mat图像类型来代替CvType.CV_8UC3,但这取决于Java是否具有等效的类型。

这是用于转换的方法:

File input = new File("C:\\File\\1.tif");

BufferedImage image = ImageIO.read(input);
// Here we convert into *supported* format
BufferedImage imageCopy =
    new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
imageCopy.getGraphics().drawImage(image, 0, 0, null);

byte[] data = ((DataBufferByte) imageCopy.getRaster().getDataBuffer()).getData();  
Mat img = new Mat(image.getHeight(),image.getWidth(), CvType.CV_8UC3);
img.put(0, 0, data);           
Imgcodecs.imwrite("C:\\File\\input.jpg", img);
Run Code Online (Sandbox Code Playgroud)

在上面介绍的方法中,您将所有“转换内容”委托给Java BufferedImage和Graphics实现。对任何图像都具有某种标准化的图像格式是最简单的方法。还有另一种方法告诉Java直接将图像加载为具体类型,但是我现在不记得代码了,它比这复杂得多。