在OpenCV中将“BufferedImage”转换为“Mat”

2022-09-01 07:13:31

如何将 a 转换为 in ?BufferedImageMatOpenCV

我正在使用JAVA包装器(不是JavaCV)。由于我是新手,我在理解工作原理方面遇到了一些问题。OpenCVOpenCVMat

我想做这样的事情。(根据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);

这不起作用。 只是一张具有正确尺寸的黑色图片。Lena_copy.png


答案 1

我也试图做同样的事情,因为需要将处理的图像与两个库相结合。我试图做的是输入而不是RGB值。它奏效了!所以我做的是:byte[]Mat

1.转换为字节数组:BufferedImage

byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();

2.然后,如果您将类型设置为CV_8UC3

image_final.put(0, 0, pixels);

编辑:您也可以尝试与此答案相反


答案 2

不想处理大像素阵列?只需使用这个

缓冲图像到垫子

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);
}

垫到缓冲图像

public static BufferedImage Mat2BufferedImage(Mat matrix)throws IOException {
    MatOfByte mob=new MatOfByte();
    Imgcodecs.imencode(".jpg", matrix, mob);
    return ImageIO.read(new ByteArrayInputStream(mob.toArray()));
}

注意,虽然可以忽略不计。但是,通过这种方式,您可以获得可靠的解决方案,但它使用编码+解码。所以你失去了一些性能。通常为 10 到 20 毫秒。JPG编码会丢失一些图像质量,速度也很慢(可能需要10到20ms)。BMP是无损和快速的(1或2毫秒),但只需要很少的内存(可以忽略不计)。PNG是无损的,但编码时间比BMP多一点。使用BMP应该适合我认为的大多数情况。


推荐