Converting `BufferedImage` to `Mat` in OpenCV

后端 未结 9 1860
北荒
北荒 2020-11-29 04:49

How can I convert a BufferedImage to a Mat in OpenCV?

I\'m using the JAVA wrapper for OpenCV(not JavaCV

9条回答
  •  挽巷
    挽巷 (楼主)
    2020-11-29 05:06

    Don't want to deal with big pixel array? Simply use this

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

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

    Note, Though it's very negligible. However, in this way, you can get a reliable solution but it uses encoding + decoding. So you lose some performance. It's generally 10 to 20 milliseconds. JPG encoding loses some image quality also it's slow (may take 10 to 20ms). BMP is lossless and fast (1 or 2 ms) but requires little more memory (negligible). PNG is lossless but a little more time to encode than BMP. Using BMP should fit the most cases I think.

提交回复
热议问题