在opencv中将BufferedImage转换为Mat

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)

编辑: 您也可以尝试按照此答案进行反向操作

  • 嗯,viktorich在他的回答中没有说.的BufferedImage对象必须被声明这样的:`IMG =新的BufferedImage(320,240,BufferedImage.TYPE_3BYTE_BGR);``搜索img.setRGB(0,0,320,240,intArray,0,320);`在换句话说,上面的代码将无法正常工作. (6认同)

小智 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)

  • 你将如何处理 RGBA 图像? (2认同)

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应该适合我认为的大多数情况.

  • 好的谢谢.此解决方案独立于BufferedImage的图像输入格式.它适用于24位JPG,同时也适用于32位PNG. (4认同)
  • 你应该得到所有的赞成! (2认同)