Programa Java para Dibujar Formas Geométricas en Imágenes en OpenCV

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

  1. Cree un proyecto y agregue la biblioteca OpenCV
  2. Crear paquete
  3. Crear una clase
  4. Cree una carpeta llamada «imágenes» y coloque un archivo .jpg o .png en ella.
  5. 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: 

  1. Línea
  2. Rectángulos
  3. círculos
  4. 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: 

Publicación traducida automáticamente

Artículo escrito por pawki y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *