La biblioteca OpenCV en Java contiene una clase llamada Imgproc que proporciona varios métodos como resize( ) , wrapAffine() , filter2D para procesar una imagen de entrada. Usaremos el paquete javax.swing aquí. El paquete javax.swing proporciona clases para la API java swing, como JButton, JTextField, JTextArea, JRadioButton, JCheckbox, JMenu , JColorChooser , etc. Los conceptos de Java involucrados aquí son la clase Swing y el conjunto de herramientas de ventanas abstractas como se menciona a continuación:
Swing Class : Aquí explicaré todas las clases del paquete javax.swing que se usarán en el programa más adelante:
- javax.swing.ImageIcon : la clase ImageIcon es una implementación de la interfaz Icon que dibuja iconos a partir de imágenes.
- javax.swing.Jframe : La clase JFrame es un tipo de contenedor que hereda el java. JFrame funciona como la ventana principal donde se agregan componentes como etiquetas, botones, campos de texto para crear una GUI
- javax.swing.JLabel : la clase JLabel se usa para mostrar una string corta o un icono de imagen.
- javax.swing.JMenu : la clase JMenu se usa para desplegar el componente del menú que se muestra desde la barra de menú.
- javax.swing.JMenuBa r: La clase JMenuBar se usa para mostrar la barra de menú en la ventana o el marco. Puede tener varios menús.
- javax.swing.JMenuItem : la clase JMenuItem representa el elemento real en un menú. Todos los elementos de un menú deben derivar de la clase JMenuItem o de una de sus subclases.
También necesitamos usar el Abstract Window Toolkit (AWT) en el programa. Es parte de Java Foundation Classes (JFC). Describiré brevemente AWT aquí.
Abstract Window Toolkit ( AWT) es un paquete de Java que se utiliza para crear interfaces gráficas de usuario. Las características de AWT incluyen:
- Un conjunto de componentes de interfaz nativos
- Un modelo robusto de manejo de eventos
- Herramientas gráficas y de imágenes, incluidas clases de formas, colores y fuentes
- Administradores de diseño, para diseños de ventana flexibles que no dependen de un tamaño de ventana o resolución de pantalla en particular
- Clases de transferencia de datos, para cortar y pegar a través del portapapeles de la plataforma nativa
Procedimiento: Pasos para dibujar formas geométricas en imágenes en OpenCV
- Cree un proyecto y agregue la biblioteca OpenCV
- Crear paquete
- Crear una clase
- Cree una carpeta llamada «imágenes» y coloque un archivo .jpg o .png en ella.
- Escriba el siguiente código en el archivo java.
Imagen de entrada de muestra:
Paso 1: cree un proyecto y agregue la biblioteca OpenCV
- Haga clic en Archivo> Nuevo> Proyecto Java.
- Asigne un nombre a su proyecto y marque las opciones necesarias en las opciones JRE y Diseño del proyecto , como se muestra a continuación en la figura. Aquí, he llamado al proyecto OpenCVShape.
- Después de marcar las opciones, haga clic en Siguiente.
- Después de eso, vaya a la opción Bibliotecas en el mismo cuadro de diálogo. Haga clic en classpath -> Agregar jars externos.
- Agregue el archivo opencv.jar desde su máquina local o puede descargar el archivo opencv.jar .
- Después de agregar el archivo jar, expanda la opción Classpath y haga clic en Ubicación de la biblioteca nativa: (Ninguno) y haga clic en Editar .
- Seleccione Carpeta externa… y navegue para seleccionar la carpeta que contiene las bibliotecas de OpenCV (p. ej., C:\opencv\build\java\x64 en Windows). Haga clic en Finalizar.
Paso 2 : Crear paquete
- Haga clic derecho en src . Vaya a Nuevo → Paquete.
- Un cuadro de diálogo aparecerá. Escriba el nombre del paquete como com.pkg y haga clic en Finalizar .
Paso 3 : crea una clase
- Haga clic derecho en com.pkg. Ir a nuevo → Clase.
- Un cuadro de diálogo aparecerá. Escriba el nombre de la clase. Lo he llamado OpenCVShape.
- Marque las opciones necesarias y haga clic en Finalizar .
Paso 4 : cree una carpeta llamada «imágenes» y coloque un archivo .jpg o .png en ella.
- Derecho : haga clic en el nombre de su proyecto (en este caso, OpenCVShape). Vaya a Nuevo -> Carpeta. Escriba el nombre de la carpeta (imágenes) y haga clic en Aceptar .
- Pon una imagen con extensión .jpg o .png en esta carpeta.
Paso 5 : escriba el siguiente código en el archivo java
Implementación: Los pasos anteriores se calculan para obtener diferentes formas geométricas como se muestra en los ejemplos a continuación:
- Línea
- Rectángulos
- círculos
- elipses
Ejemplo 1: dibujar líneas
Java
// Java Program using openCV to draw lines package com.pkg; // Importing abstract windows toolkit classes import java.awt.EventQueue; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; // Importing Swing classes import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; // Importing OpenCV modules import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfByte; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; public class OpenCVShapes extends JFrame { Mat image; Mat tempImage; JLabel imageView; // Menu for save image private JMenuBar mb; private JMenu menu; private JMenuItem saveMenuItem; private Point originPoint; public OpenCVShapes() { // Loading image from local directory image = Imgcodecs.imread("images/sample_image.png"); // Method to view setup setUpView(); // Loading image to jlabel loadImage(image); // Setting iframe property setSize(image.width(), image.height()); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } // Method to load image private void loadImage(Mat img) { final MatOfByte mof = new MatOfByte(); Imgcodecs.imencode(".png", img, mof); final byte[] imageData = mof.toArray(); // Change image byte to image icon final ImageIcon icon = new ImageIcon(imageData); // Add icon to jlabel imageView.setIcon(icon); } private void setUpView() { setLayout(null); imageView = newJLabel(); imageView.setBounds(0, 20, image.width(), image.height()); // Add mouse listener imageView.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { super.mousePressed(e); // Storing location of mouse pressed originPoint = new Point(e.getX(), e.getY()); } @Override public void mouseReleased(MouseEvent e) { super.mouseReleased(e); // when mouse release replace tempimage to // image image = tempImage.clone(); } }); // Adding another event mousemotionlistener imageView.addMouseMotionListener( new MouseMotionListener() { @Override public void mouseMoved(MouseEvent e) { // TODO Auto-generate method stub } @Override public void mouseDragged(MouseEvent e) { // Create temp image for drawing tempImage = image.clone(); final Point point = new Point(e.getX(), e.getY()); // NOW, DRAWING SHAPES // 1. Drawing line // Color in bgr format Imgproc.line( tempImage, originPoint, point, new Scalar(0, 0, 0), 5); loadImage(tempImage); } }); add(imageView); // Adding menu mb = new JMenuBar(); menu = new JMenu("file"); saveMenuItem = new JMenuItem("save"); menu.add(saveMenuItem); mb.add(menu); mb.setBounds(0, 0, image.width(), 20); add(mb); saveMenuItem.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub Imgcodecs.imwrite("images/ind1.png", image); } }); } private JLabel newJLabel() { // TODO Auto-generated method stub return null; } // Main driver method public static void main(String[] args) { // Loading library System.loadLibrary(Core.NATIVE_LIBRARY_NAME); EventQueue.invokeLater(new Runnable() { @Override public void run() { new OpenCVShapes(); } }); } }
Producción:
Ejemplo 2: dibujar rectángulos
Java
// Java Program using openCV to draw rectangles package com.pkg; import java.awt.EventQueue; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfByte; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; public class OpenCVShapes extends JFrame { Mat image; Mat tempImage; JLabel imageView; // menu for save image private JMenuBar mb; private JMenu menu; private JMenuItem saveMenuItem; private Point originPoint; public OpenCVShapes() { // load image image = Imgcodecs.imread("images/sample_image.png"); // view setup setUpView(); // load image to jlabel loadImage(image); // set iframe property setSize(image.width(), image.height()); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } private void loadImage(Mat img) { final MatOfByte mof = new MatOfByte(); Imgcodecs.imencode(".png", img, mof); final byte[] imageData = mof.toArray(); // change image byte to image icon final ImageIcon icon = new ImageIcon(imageData); // add icon to jlabel imageView.setIcon(icon); } private void setUpView() { setLayout(null); imageView = newJLabel(); imageView.setBounds(0, 20, image.width(), image.height()); // add mouse listener imageView.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { super.mousePressed(e); // store location of mouse pressed originPoint = new Point(e.getX(), e.getY()); } @Override public void mouseReleased(MouseEvent e) { super.mouseReleased(e); // when mouse release replace tempimage to // image image = tempImage.clone(); } }); // add another event mousemotionlistener imageView.addMouseMotionListener( new MouseMotionListener() { @Override public void mouseMoved(MouseEvent e) { // TODO Auto-generate method stub } @Override public void mouseDragged(MouseEvent e) { // create temp image for drawing tempImage = image.clone(); final Point point = new Point(e.getX(), e.getY()); // here we will draw shapes // draw rectangle Imgproc.rectangle( tempImage, originPoint, point, new Scalar(255, 0, 0), 5); loadImage(tempImage); } }); add(imageView); // add menu mb = new JMenuBar(); menu = new JMenu("file"); saveMenuItem = new JMenuItem("save"); menu.add(saveMenuItem); mb.add(menu); mb.setBounds(0, 0, image.width(), 20); add(mb); saveMenuItem.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub Imgcodecs.imwrite("images/ind1.png", image); } }); } private JLabel newJLabel() { // TODO Auto-generated method stub return null; } // main driver method public static void main(String[] args) { // Loading library System.loadLibrary(Core.NATIVE_LIBRARY_NAME); EventQueue.invokeLater(new Runnable() { @Override public void run() { new OpenCVShapes(); } }); } }
Producción:
Ejemplo 3: dibujar círculos
Java
// Java Program using openCV to draw circles package com.pkg; import java.awt.EventQueue; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfByte; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; public class OpenCVShapes extends JFrame { Mat image; Mat tempImage; JLabel imageView; // menu for save image private JMenuBar mb; private JMenu menu; private JMenuItem saveMenuItem; private Point originPoint; public OpenCVShapes() { // load image image = Imgcodecs.imread("images/sample_image.png"); // view setup setUpView(); // load image to jlabel loadImage(image); // set iframe property setSize(image.width(), image.height()); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } private void loadImage(Mat img) { final MatOfByte mof = new MatOfByte(); Imgcodecs.imencode(".png", img, mof); final byte[] imageData = mof.toArray(); // change image byte to image icon final ImageIcon icon = new ImageIcon(imageData); // add icon to jlabel imageView.setIcon(icon); } private void setUpView() { setLayout(null); imageView = newJLabel(); imageView.setBounds(0, 20, image.width(), image.height()); // add mouse listener imageView.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { super.mousePressed(e); // store location of mouse pressed originPoint = new Point(e.getX(), e.getY()); } @Override public void mouseReleased(MouseEvent e) { super.mouseReleased(e); // when mouse release replace tempimage to // image image = tempImage.clone(); } }); // add another event mousemotionlistener imageView.addMouseMotionListener( new MouseMotionListener() { @Override public void mouseMoved(MouseEvent e) { // TODO Auto-generate method stub } @Override public void mouseDragged(MouseEvent e) { // create temp image for drawing tempImage = image.clone(); final Point point = new Point(e.getX(), e.getY()); // here we will draw shapes // draw circle // first find distance of origin point // and point double ab2 = Math.pow(originPoint.x - point.x, 2) + Math.pow( originPoint.y - point.y, 2); int distance = (int)Math.sqrt(ab2); Imgproc.circle( tempImage, originPoint, distance, new Scalar(0, 255, 0), 5); loadImage(tempImage); } }); add(imageView); // add menu mb = new JMenuBar(); menu = new JMenu("file"); saveMenuItem = new JMenuItem("save"); menu.add(saveMenuItem); mb.add(menu); mb.setBounds(0, 0, image.width(), 20); add(mb); saveMenuItem.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub Imgcodecs.imwrite("images/ind1.png", image); } }); } private JLabel newJLabel() { // TODO Auto-generated method stub return null; } // Main driver method public static void main(String[] args) { // Loading library System.loadLibrary(Core.NATIVE_LIBRARY_NAME); EventQueue.invokeLater(new Runnable() { @Override public void run() { new OpenCVShapes(); } }); } }
Producción:
Ejemplo 4: Dibujar elipses
Java
// Java Program using openCV to draw ellipses package com.pkg; import java.awt.EventQueue; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfByte; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; public class OpenCVShapes extends JFrame { Mat image; Mat tempImage; JLabel imageView; // menu for save image private JMenuBar mb; private JMenu menu; private JMenuItem saveMenuItem; private Point originPoint; public OpenCVShapes() { // load image image = Imgcodecs.imread("images/sample_image.png"); // view setup setUpView(); // load image to jlabel loadImage(image); // set iframe property setSize(image.width(), image.height()); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } private void loadImage(Mat img) { final MatOfByte mof = new MatOfByte(); Imgcodecs.imencode(".png", img, mof); final byte[] imageData = mof.toArray(); // change image byte to image icon final ImageIcon icon = new ImageIcon(imageData); // add icon to jlabel imageView.setIcon(icon); } private void setUpView() { setLayout(null); imageView = newJLabel(); imageView.setBounds(0, 20, image.width(), image.height()); // add mouse listener imageView.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { super.mousePressed(e); // store location of mouse pressed originPoint = new Point(e.getX(), e.getY()); } @Override public void mouseReleased(MouseEvent e) { super.mouseReleased(e); // when mouse release replace tempimage to // image image = tempImage.clone(); } }); // add another event mousemotionlistener imageView.addMouseMotionListener( new MouseMotionListener() { @Override public void mouseMoved(MouseEvent e) { // TODO Auto-generate method stub } @Override public void mouseDragged(MouseEvent e) { // create temp image for drawing tempImage = image.clone(); final Point point = new Point(e.getX(), e.getY()); // here we will draw shapes // draw eclipse double x = Math.abs(point.x - originPoint.x); double y = Math.abs(point.y - originPoint.y); Size size = new Size(x * 2, y * 2); Imgproc.ellipse( tempImage, new RotateRect(originPoint, size, 0), new Scalar(255, 255, 0), 5); loadImage(tempImage); } }); add(imageView); // add menu mb = new JMenuBar(); menu = new JMenu("file"); saveMenuItem = new JMenuItem("save"); menu.add(saveMenuItem); mb.add(menu); mb.setBounds(0, 0, image.width(), 20); add(mb); saveMenuItem.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub Imgcodecs.imwrite("images/ind1.png", image); } }); } private JLabel newJLabel() { // TODO Auto-generated method stub return null; } // Main driver method public static void main(String[] args) { // Loading library System.loadLibrary(Core.NATIVE_LIBRARY_NAME); EventQueue.invokeLater(new Runnable() { @Override public void run() { new OpenCVShapes(); } }); } }
Producción: