Jom*_*234 28 java opencv bufferedimage mat
如何在OpenCV中将BufferedImage转换为Mat?我使用java包装器的OpenCV(而不是JavaCV).由于我是OpenCV的新手,我在理解Mat的工作方式时遇到了一些问题.
我想做这样的事情.(根据Ted W.回复):
BufferedImage image = ImageIO.read(b.getClass().getResource("Lena.png"));
int rows = image.getWidth();
int cols = image.getHeight();
int type = CvType.CV_16UC1;
Mat newMat = new Mat(rows,cols,type);
for(int r=0; r<rows; r++){
for(int c=0; c<cols; c++){
newMat.put(r, c, image.getRGB(r, c));
}
}
Highgui.imwrite("Lena_copy.png",newMat);
Run Code Online (Sandbox Code Playgroud)
这不起作用."Lena_copy.png"只是一张尺寸正确的黑色照片.
and*_*riy 25
我也试图做同样的事情,因为需要将图像处理与两个库相结合.而我试图做的是byte[]输入Mat而不是RGB值.它奏效了!所以我做的是:
1.转换BufferedImage为字节数组:
byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
Run Code Online (Sandbox Code Playgroud)
2.如果将类型设置为CV_8UC3,则可以将其简单地放到Mat上
image_final.put(0, 0, pixels);
Run Code Online (Sandbox Code Playgroud)
编辑: 您也可以尝试按照此答案进行反向操作
小智 18
这个对我来说很好,并且需要执行0到1毫秒.
public static Mat bufferedImageToMat(BufferedImage bi) {
Mat mat = new Mat(bi.getHeight(), bi.getWidth(), CvType.CV_8UC3);
byte[] data = ((DataBufferByte) bi.getRaster().getDataBuffer()).getData();
mat.put(0, 0, data);
return mat;
}
Run Code Online (Sandbox Code Playgroud)
Ult*_*let 15
不想处理大像素阵列?只需使用它
BufferedImage to Mat
public static Mat BufferedImage2Mat(BufferedImage image) throws IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", byteArrayOutputStream);
byteArrayOutputStream.flush();
return Imgcodecs.imdecode(new MatOfByte(byteArrayOutputStream.toByteArray()), Imgcodecs.CV_LOAD_IMAGE_UNCHANGED);
}
Run Code Online (Sandbox Code Playgroud)
Mat to BufferedImage
public static BufferedImage Mat2BufferedImage(Mat matrix)throws IOException {
MatOfByte mob=new MatOfByte();
Imgcodecs.imencode(".jpg", matrix, mob);
return ImageIO.read(new ByteArrayInputStream(mob.toArray()));
}
Run Code Online (Sandbox Code Playgroud)
注意,虽然它可以忽略不计.但是,通过这种方式,您可以获得可靠的解决方案,但它使用编码+解码.所以你失去了一些表现.通常为10到20毫秒.JPG编码失去了一些图像质量也很慢(可能需要10到20毫秒).BMP是无损且快速的(1或2 ms),但需要更多的内存(可忽略不计).PNG是无损的,但比BMP编码的时间多一点.使用BMP应该适合我认为的大多数情况.