使用Java将图像保存到Mat?

时间:2016-03-02 08:41:57

标签: 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);

1 个答案:

答案 0 :(得分:4)

这是因为不同图像的数据类型不同。 对于一个你有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);

在上面介绍的方法中,您将委派所有"转换内容"到java BufferedImage和Graphics实现。这是为任何图像提供一些标准化图像格式的最简单方法。还有另一种方法可以告诉java直接将图像作为具体类型加载,但我现在还不记得代码,而且复杂得多。