如何在Java中将字节数组转换为Mat对象

Bah*_*dil 5 java opencv

我想将字节数组转换为Mat对象,但它会抛出

java.lang.UnsupportedOperationException: Provided data element number (60181) should be multiple of the Mat channels count (3)
    at org.opencv.core.Mat.put(Mat.java:992)
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

byte[] bytes = FileUtils.readFileToByteArray(new File("aaa.jpg"));

Mat mat = new Mat(576, 720, CvType.CV_8UC3);
//Imgcodecs.imencode(".jpg", mat, new MatOfByte(bytes));
mat.put(0, 0, bytes);
Run Code Online (Sandbox Code Playgroud)

我尝试了很多方法,也搜索了很多,但没有找到任何解决方案.

注意:我知道Imgcodecs.imread("aaa.jpg");并且

BufferedImage img = ImageIO.read(new ByteArrayInputStream(byteArray));
Mat mat = new Mat(img.getHeight(), img.getWidth(), CvType.CV_8UC3);
mat.put(0, 0, ((DataBufferByte) img.getRaster().getDataBuffer()).getData());
Run Code Online (Sandbox Code Playgroud)

但我希望直接将字节数组转换为Mat,而无需任何额外的过程来加快处理时间.

提前致谢!

Bah*_*dil 19

我解决了这个问题:

byte[] bytes = FileUtils.readFileToByteArray(new File("aaa.jpg"));
Mat mat = Imgcodecs.imdecode(new MatOfByte(bytes), Imgcodecs.CV_LOAD_IMAGE_UNCHANGED);
Run Code Online (Sandbox Code Playgroud)

现在它运行良好,速度也快得多 *bytes->BufferedImage->Mat*

  • Imgcodecs.CV_LOAD_IMAGE_UNCHANGED 宏已替换为 IMREAD_UNCHANGED (2认同)