CvType.CV_8UC3 corresponding to BufferedImage.TYPE_3BYTE_BGR.
CvType.CV_8UC1 corresponding to BufferedImage.TYPE_GRAY
You can easily create an OpenCV Mat from a BufferedImage with the following code:
BufferedImage inputImage = ... Mat mat = null; if (inputImage.getType() == BufferedImage.TYPE_BYTE_GRAY) { mat = new Mat(inputImage.getHeight(), inputImage.getWidth(), CvType.CV_8UC1); mat.put(0, 0, ((DataBufferByte) inputImage.getRaster(). getDataBuffer()).getData()); } else if (inputImage.getType() == BufferedImage.TYPE_3BYTE_BGR) { mat = new Mat(inputImage.getHeight(), inputImage.getWidth(), CvType.CV_8UC3); mat.put(0, 0, ((DataBufferByte) inputImage.getRaster(). getDataBuffer()).getData()); }
This code only supports GRAYSCALE and 3BYTE_BGR BufferedImage.
To get a BufferedImage from an OpenCV Mat instance the code is quite simliar:
// Create BufferedImage with dimensions and type (corresponding to Mat) BufferedImage img = new BufferedImage(mat.width(), mat.height(), BufferedImage.TYPE_BYTE_GRAY); // BufferedImage internat byte[] storage byte[] data = ((DataBufferByte) codeImage.getRaster().getDataBuffer()).getData(); // Write image data mat.get(0, 0, data);
Dealing with BufferedImage.TYPE_BYTE_BINARY
So I created a CvType.CV_8UC1 (Grayscale) Mat with dimensions of the BufferedImage. After that the code iterates cols and rows of the Image and writes 0 (black) or 255 (white) to the OpenCV Mat.
BufferedImage img = ... Mat mat = new Mat(img.getHeight(), img.getWidth(), CvType.CV_8UC1); byte[] white = new byte[] { (byte) 255 }; byte[] black = new byte[] { (byte) 0 }; for (int x=0; x<img.getWidth(); x++) { for (int y=0; y<img.getHeight(); y++) { if (img.getRGB(x, y) == Color.BLACK.getRGB()) { mat.put(y, x, black); } else { mat.put(y, x, white); } } }
Please note: img.getRGB(x,y) but mat.put(y,x). Otherwise the resulting Mat is rotated by 90 degrees and cut.
Keine Kommentare:
Kommentar veröffentlichen