Converting `BufferedImage` to `Mat` in OpenCV

后端 未结 9 1861
北荒
北荒 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:02

    I use following code in my program.

    protected Mat img2Mat(BufferedImage in) {
            Mat out;
            byte[] data;
            int r, g, b;
    
            if (in.getType() == BufferedImage.TYPE_INT_RGB) {
                out = new Mat(in.getHeight(), in.getWidth(), CvType.CV_8UC3);
                data = new byte[in.getWidth() * in.getHeight() * (int) out.elemSize()];
                int[] dataBuff = in.getRGB(0, 0, in.getWidth(), in.getHeight(), null, 0, in.getWidth());
                for (int i = 0; i < dataBuff.length; i++) {
                    data[i * 3] = (byte) ((dataBuff[i] >> 0) & 0xFF);
                    data[i * 3 + 1] = (byte) ((dataBuff[i] >> 8) & 0xFF);
                    data[i * 3 + 2] = (byte) ((dataBuff[i] >> 16) & 0xFF);
                }
            } else {
                out = new Mat(in.getHeight(), in.getWidth(), CvType.CV_8UC1);
                data = new byte[in.getWidth() * in.getHeight() * (int) out.elemSize()];
                int[] dataBuff = in.getRGB(0, 0, in.getWidth(), in.getHeight(), null, 0, in.getWidth());
                for (int i = 0; i < dataBuff.length; i++) {
                    r = (byte) ((dataBuff[i] >> 0) & 0xFF);
                    g = (byte) ((dataBuff[i] >> 8) & 0xFF);
                    b = (byte) ((dataBuff[i] >> 16) & 0xFF);
                    data[i] = (byte) ((0.21 * r) + (0.71 * g) + (0.07 * b));
                }
            }
            out.put(0, 0, data);
            return out;
        }
    

    Reference: here

提交回复
热议问题