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

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

最佳答案

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

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

关于java - 使用 Java 将图像保存到 Mat 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35742171/

相关文章:

c++ - 在 OpenCV 中什么是 VideoCapture 析构函数

java - 在 Java 中没有通过 TCP 接收所有消息?

java - 当用户在编辑文本中输入金额时,用金额替换 0 的最佳方法

java - 带 liquibase 的 hibernate-envers

java - 如何在java中对 "\"进行字符串分割?

python-3.x - TypeError : Layout of the output array img is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)

java - Gurobi Java model.set(GRB.IntParam.LazyConstraints, 1);抛出错误

c - 如何分析/识别紧密处理循环中的缓慢步骤?

c++ - 使用 openCV 检测多个对象

c++ - OpenCV RGB值检测?