package com.isaac.utils; /* * Author: ATUL * Thanks to Daniel Baggio , Jan Monterrubio and sutr90 for improvements * This code can be used as an alternative to imshow of OpenCV for JAVA-OpenCv * Make sure OpenCV Java is in your Build Path * Usage : * ------- * Imshow ims = new Imshow("Title"); * ims.showImage(Mat image); * Check Example for usage with Webcam Live Video Feed */ import java.awt.Dimension; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; //import java.io.ByteArrayInputStream; //import java.io.InputStream; //import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; //import javax.swing.plaf.ButtonUI; import javax.swing.WindowConstants; import org.opencv.core.Mat; import org.opencv.core.Size; import org.opencv.imgproc.Imgproc; public class ImShow { public JFrame Window; private ImageIcon image; private JLabel label; // private MatOfByte matOfByte; private Boolean SizeCustom; private int Height, Width; public ImShow(String title) { Window = new JFrame(); image = new ImageIcon(); label = new JLabel(); // matOfByte = new MatOfByte(); label.setIcon(image); Window.getContentPane().add(label); Window.setResizable(false); Window.setTitle(title); SizeCustom = false; setCloseOption(0); } public ImShow(String title, int height, int width) { SizeCustom = true; Height = height; Width = width; Window = new JFrame(); image = new ImageIcon(); label = new JLabel(); // matOfByte = new MatOfByte(); label.setIcon(image); Window.getContentPane().add(label); Window.setResizable(false); Window.setTitle(title); setCloseOption(0); } public void showImage(Mat img) { if (SizeCustom) { Imgproc.resize(img, img, new Size(Height, Width)); } // Highgui.imencode(".jpg", img, matOfByte); // byte[] byteArray = matOfByte.toArray(); BufferedImage bufImage = null; try { // InputStream in = new ByteArrayInputStream(byteArray); // bufImage = ImageIO.read(in); bufImage = toBufferedImage(img); image.setImage(bufImage); Window.pack(); label.updateUI(); Window.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } // CREDITS TO DANIEL: http://danielbaggio.blogspot.com.br/ for the improved // version ! public BufferedImage toBufferedImage(Mat m) { int type = BufferedImage.TYPE_BYTE_GRAY; if (m.channels() > 1) { type = BufferedImage.TYPE_3BYTE_BGR; } int bufferSize = m.channels() * m.cols() * m.rows(); byte[] b = new byte[bufferSize]; m.get(0, 0, b); // get all the pixels BufferedImage image = new BufferedImage(m.cols(), m.rows(), type); final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); System.arraycopy(b, 0, targetPixels, 0, b.length); return image; } // Thanks to sutr90 for reporting the issue : https://github.com/sutr90 public void setCloseOption(int option) { switch (option) { case 0: Window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); break; case 1: Window.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE); break; default: Window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } } /** * Sets whether this window should be resizable or not, by default it is not * resizable * * @param resizable * <code>true</code> if the window should be resizable, * <code>false</code> otherwise */ public void setResizable(boolean resizable) { Window.setResizable(resizable); } // Thanks to Jan Monterrubio for additional static methods for viewing images. /** * Displays the given {@link Mat} in a new instance of {@link ImShow} * * @param mat * the {@link Mat} to display */ public static void show(Mat mat) { show(mat, new Dimension(mat.rows(), mat.cols()), "", false, WindowConstants.EXIT_ON_CLOSE); } /** * Displays the given {@link Mat} in a new instance of {@link ImShow} with * the given title as the title for the window * * @param mat * the {@link Mat} to display * @param frameTitle * the title for the frame */ public static void show(Mat mat, String frameTitle) { show(mat, new Dimension(mat.rows(), mat.cols()), frameTitle, false, WindowConstants.EXIT_ON_CLOSE); } /** * Displays the given {@link Mat} in a new instance of {@link ImShow} with * the given title as the title for the window and determines whether the * frame is resizable or not * * @param mat * the {@link Mat} to display * @param frameTitle * the title for the frame * @param resizable * whether the frame should be resizable or not */ public static void show(Mat mat, String frameTitle, boolean resizable) { show(mat, new Dimension(mat.rows(), mat.cols()), frameTitle, resizable, WindowConstants.EXIT_ON_CLOSE); } /** * Displays the given {@link Mat} in a new instance of {@link ImShow} with a * set size * * @param mat * the {@link Mat} to display * @param frameSize * the size for the frame */ public static void show(Mat mat, Dimension frameSize) { show(mat, frameSize, "", false, WindowConstants.EXIT_ON_CLOSE); } /** * Displays the given {@link Mat} in a new instance of {@link ImShow} with a * set size and given title * * @param mat * the {@link Mat} to display * @param frameSize * the size for the frame * @param frameTitle * the title for the frame */ public static void show(Mat mat, Dimension frameSize, String frameTitle) { show(mat, frameSize, frameTitle, false, WindowConstants.EXIT_ON_CLOSE); } /** * Displays the given {@link Mat} in a new instance of {@link ImShow} with a * set size and given title and whether it is resizable or not * * @param mat * the {@link Mat} to display * @param frameSize * the size for the frame * @param frameTitle * the title for the frame */ public static void show(Mat mat, Dimension frameSize, String frameTitle, boolean resizable) { show(mat, frameSize, frameTitle, resizable, WindowConstants.EXIT_ON_CLOSE); } /** * Displays the given {@link Mat} in a new instance of {@link ImShow} with a * set size and given title and whether it is resizable or not, and with the * close operation set * * @param mat * the {@link Mat} to display * @param frameSize * the size for the frame * @param frameTitle * the title for the frame * @param resizable * wether the frame is resizable or not * @param closeOperation * the constant for the default close operation of the frame */ public static void show(Mat mat, Dimension frameSize, String frameTitle, boolean resizable, int closeOperation) { ImShow frame = new ImShow(frameTitle, frameSize.height, frameSize.width); frame.setResizable(resizable); /* * This is a bad way to access the window, but due to legacy stuff I * won't change the access patterns */ frame.Window.setDefaultCloseOperation(closeOperation); frame.showImage(mat); } }