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

6

使用以下方法无法读取某些bmp和tif图像文件,除了jpeg文件。我希望将它保存在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);
1个回答

7
因为不同图像的数据类型不同。有些是DataBufferByte,而有些可能是DataBufferInt。
您可以创建一个大小相同且类型为3BYTE_BGR的新BufferedImage,然后将原始图像绘制到其中,然后可以从此新图像构建Mat。
您也可以使用与CvType.CV_8UC3不同的支持的Mat图像类型,但这取决于是否有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);

在上述方法中,您将所有的“转换工作”都委托给了Java BufferedImage和Graphics实现。这是一种最简单的方法,可以为任何图像提供一些标准化的图像格式。还有另一种方法可以告诉Java直接将图像加载为具体类型,但我现在不记得代码了,而且它比这个更加复杂。

1
谢谢!我感激你的帮助。 - Tleung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接