OpenCV - Guía rápida

OpenCV es una biblioteca multiplataforma con la que podemos desarrollar en tiempo real computer vision applications. Se centra principalmente en el procesamiento de imágenes, la captura y el análisis de vídeo, incluidas funciones como la detección de rostros y la detección de objetos.

Comencemos el capítulo definiendo el término "Visión por computadora".

Visión por computador

La Visión por Computador se puede definir como una disciplina que explica cómo reconstruir, interrumpir y comprender una escena 3D a partir de sus imágenes 2D, en términos de las propiedades de la estructura presente en la escena. Se trata de modelar y replicar la visión humana utilizando software y hardware de computadora.

Computer Vision se superpone significativamente con los siguientes campos:

  • Image Processing - Se centra en la manipulación de imágenes.

  • Pattern Recognition - Explica diversas técnicas para clasificar patrones.

  • Photogrammetry - Se ocupa de obtener medidas precisas a partir de imágenes.

Visión por computadora Vs Procesamiento de imágenes

Image processingse ocupa de la transformación de imagen a imagen. La entrada y la salida del procesamiento de imágenes son imágenes.

Computer visiones la construcción de descripciones explícitas y significativas de objetos físicos a partir de su imagen. El resultado de la visión por computadora es una descripción o una interpretación de estructuras en una escena 3D.

Aplicaciones de la visión por computadora

Aquí hemos enumerado algunos de los principales dominios en los que Computer Vision se usa mucho.

Aplicación de robótica

  • Localización: determina la ubicación del robot automáticamente

  • Navigation

  • Evitación de obstáculos

  • Montaje (clavija en agujero, soldadura, pintura)

  • Manipulación (por ejemplo, manipulador de robot PUMA)

  • Interacción de robot humano (HRI): robótica inteligente para interactuar y servir a las personas

Aplicación de medicina

  • Clasificación y detección (por ejemplo, clasificación de lesiones o células y detección de tumores)
  • Segmentación 2D / 3D
  • Reconstrucción de órganos humanos en 3D (resonancia magnética o ultrasonido)
  • Cirugía robótica guiada por visión

Aplicación de automatización industrial

  • Inspección industrial (detección de defectos)
  • Assembly
  • Lectura de códigos de barras y etiquetas de paquetes
  • Clasificación de objetos
  • Comprensión de documentos (por ejemplo, OCR)

Aplicación de seguridad

  • Biometría (iris, huellas dactilares, reconocimiento facial)

  • Vigilancia: detección de determinadas actividades o comportamientos sospechosos

Solicitud de transporte

  • Vehículo autónomo
  • Seguridad, por ejemplo, vigilancia de la vigilancia del conductor

Características de la biblioteca OpenCV

Usando la biblioteca OpenCV, puede:

  • Leer y escribir imágenes

  • Captura y guarda videos

  • Procesar imágenes (filtrar, transformar)

  • Realizar detección de características

  • Detecta objetos específicos como rostros, ojos, autos, en los videos o imágenes.

  • Analizar el video, es decir, estimar el movimiento en él, restar el fondo y rastrear los objetos en él.

OpenCV se desarrolló originalmente en C ++. Además, se proporcionaron enlaces de Python y Java. OpenCV se ejecuta en varios sistemas operativos como Windows, Linux, OSx, FreeBSD, Net BSD, Open BSD, etc.

Este tutorial explica los conceptos de OpenCV con ejemplos que utilizan enlaces de Java.

Módulos de biblioteca OpenCV

A continuación se muestran los principales módulos de la biblioteca de OpenCV.

Funcionalidad central

Este módulo cubre las estructuras de datos básicas como escalar, punto, rango, etc., que se utilizan para construir aplicaciones OpenCV. Además de estos, también incluye la matriz multidimensionalMat, que se utiliza para almacenar las imágenes. En la biblioteca Java de OpenCV, este módulo se incluye como un paquete con el nombreorg.opencv.core.

Procesamiento de imágenes

Este módulo cubre varias operaciones de procesamiento de imágenes como filtrado de imágenes, transformaciones de imágenes geométricas, conversión de espacio de color, histogramas, etc. En la biblioteca Java de OpenCV, este módulo se incluye como un paquete con el nombre org.opencv.imgproc.

Vídeo

Este módulo cubre los conceptos de análisis de video como estimación de movimiento, sustracción de fondo y seguimiento de objetos. En la biblioteca Java de OpenCV, este módulo se incluye como un paquete con el nombreorg.opencv.video.

E / S de video

Este módulo explica la captura de video y los códecs de video usando la biblioteca OpenCV. En la biblioteca Java de OpenCV, este módulo se incluye como un paquete con el nombreorg.opencv.videoio.

calib3d

Este módulo incluye algoritmos relacionados con los algoritmos básicos de geometría de múltiples vistas, calibración de cámara única y estéreo, estimación de la pose de objeto, correspondencia estéreo y elementos de reconstrucción 3D. En la biblioteca Java de OpenCV, este módulo se incluye como un paquete con el nombreorg.opencv.calib3d.

características2d

Este módulo incluye los conceptos de detección y descripción de características. En la biblioteca Java de OpenCV, este módulo se incluye como un paquete con el nombreorg.opencv.features2d.

Objdetect

Este módulo incluye la detección de objetos e instancias de las clases predefinidas como rostros, ojos, tazas, personas, autos, etc. En la biblioteca Java de OpenCV, este módulo se incluye como un paquete con el nombre org.opencv.objdetect.

Highgui

Esta es una interfaz fácil de usar con capacidades de interfaz de usuario simples. En la biblioteca Java de OpenCV, las características de este módulo se incluyen en dos paquetes diferentes, a saber,org.opencv.imgcodecs y org.opencv.videoio.

Una breve historia de OpenCV

OpenCV fue inicialmente una iniciativa de investigación de Intel para asesorar aplicaciones con uso intensivo de CPU. Fue lanzado oficialmente en 1999.

  • En el año 2006, se lanzó su primera versión principal, OpenCV 1.0.
  • En octubre de 2009, se lanzó la segunda versión principal, OpenCV 2.
  • En agosto de 2012, OpenCV fue adquirida por una organización sin fines de lucro, OpenCV.org.

En este capítulo, aprenderá cómo instalar OpenCV y configurar su entorno en su sistema.

Instalación de OpenCV

En primer lugar, debe descargar OpenCV en su sistema. Siga los pasos que se indican a continuación.

Step 1 - Abra la página de inicio de OpenCV haciendo clic en el siguiente enlace: http://opencv.org/ Al hacer clic, verá su página de inicio como se muestra a continuación.

Step 2 - Ahora, haga clic en el Downloadsenlace resaltado en la captura de pantalla anterior. Al hacer clic, se le dirigirá a la página de descargas de OpenCV.

Step 3 - Al hacer clic en el enlace resaltado en la captura de pantalla anterior, un archivo llamado opencv-3.1.0.exese descargará. Extrae este archivo para generar una carpetaopencv en su sistema, como se muestra en la siguiente captura de pantalla.

Step 4 - Abre la carpeta OpenCVbuildjava. Aquí encontrará el archivo jar de OpenCV llamadoopencv-310.jar. Guarde este archivo en una carpeta separada para su uso posterior.

Instalación de Eclipse

Después de descargar los archivos JAR necesarios, debe incrustar estos archivos JAR en su entorno Eclipse. Puede hacer esto configurando la ruta de compilación para estos archivos JAR y utilizandopom.xml.

Establecer ruta de compilación

Los siguientes son los pasos para configurar OpenCV en Eclipse:

Step 1- Asegúrese de haber instalado Eclipse en su sistema. Si no es así, descargue e instale Eclipse en su sistema.

Step 2 - Abra Eclipse, haga clic en Archivo, Nuevo y Abra un nuevo proyecto como se muestra en la siguiente captura de pantalla.

Step 3 - Al seleccionar el proyecto, obtendrá el New Projectmago. En este asistente, seleccione el proyecto Java y continúe haciendo clic en elNext , como se muestra en la siguiente captura de pantalla.

Step 4 - Al continuar, se le dirigirá al New Java Project wizard. Cree un nuevo proyecto y haga clic enNext, como se muestra en la siguiente captura de pantalla.

Step 5- Después de crear un nuevo proyecto, haga clic derecho sobre él. SeleccioneBuild Path y haga clic en Configure Build Path… como se muestra en la siguiente captura de pantalla.

Step 6 - Al hacer clic en el Build Path opción, se le dirigirá a la Java Build Path wizard. Haga clic en elAdd External JARs , como se muestra en la siguiente captura de pantalla.

Step 7 - Seleccione la ruta donde ha guardado el archivo opencv-310.jar.

Step 8 - Al hacer clic en el Open en la captura de pantalla anterior, esos archivos se agregarán a su biblioteca.

Step 9 - Al hacer clic OK, agregará con éxito los archivos JAR requeridos al proyecto actual y podrá verificar estas bibliotecas agregadas expandiendo las Bibliotecas de referencia.

Establecer el camino para las bibliotecas nativas

Además de los archivos JAR, debe establecer la ruta para las bibliotecas nativas (archivos DLL) de OpenCV.

Location of DLL files - Abra la carpeta de instalación de OpenCV y ve a la subcarpeta buildjava. Aquí encontrarás las dos carpetasx64 (64 bits) y x86 (32 bits) que contienen el dll archivos de OpenCV.

Abra la carpeta respectiva adecuada para su sistema operativo, luego podrá ver la dll archivo, como se muestra en la siguiente captura de pantalla.

Ahora, establezca la ruta para este archivo también siguiendo los pasos que se detallan a continuación:

Step 1- Una vez más, abra la ventana JavaBuildPath. Aquí puede observar el archivo JAR agregado y elJRE System Library.

Step 2 - Al expandirlo, obtendrá las bibliotecas del sistema y Native library location, como se destaca en la siguiente captura de pantalla.

Step 3 - Haga doble clic en el Native library location. Aquí puedes ver elNative Library Folder Configuration window Como se muestra abajo.

Aquí, haga clic en el botón External Folder… y seleccione la ubicación del dll archivo en su sistema.

Para capturar una imagen, utilizamos dispositivos como cámaras y escáneres. Estos dispositivos registran valores numéricos de la imagen (Ej .: valores de píxeles). OpenCV es una biblioteca que procesa las imágenes digitales, por lo tanto, necesitamos almacenar estas imágenes para su procesamiento.

los MatLa clase de biblioteca OpenCV se utiliza para almacenar los valores de una imagen. Representa una matriz n-dimensional y se utiliza para almacenar datos de imágenes de imágenes en escala de grises o en color, volúmenes de voxel, campos vectoriales, nubes de puntos, tensores, histogramas, etc.

Esta clase consta de dos partes de datos: el header y un pointer

  • Header - Contiene información como el tamaño, el método utilizado para almacenar y la dirección de la matriz (tamaño constante).

  • Pointer - Almacena los valores de píxeles de la imagen (sigue variando).

La clase Mat

La biblioteca OpenCV Java proporciona esta clase con el mismo nombre (Mat) dentro del paquete org.opencv.core.

Constructores

La clase Mat de la biblioteca OpenCV Java tiene varios constructores, con los que puede construir el objeto Mat.

S. No Constructores y descripción
1

Mat()

Este es el constructor predeterminado sin parámetros en la mayoría de los casos. Usamos esto en el constructor para crear una matriz vacía y pasar esto a otros métodos OpenCV.

2

Mat(int rows, int cols, int type)

Este constructor acepta tres parámetros de tipo entero que representan el número de filas y columnas en una matriz 2D y el tipo de matriz (que se utilizará para almacenar datos).

3

Mat(int rows, int cols, int type, Scalar s)

Incluyendo los parámetros del anterior, este constructor acepta adicionalmente un objeto de la clase Scalar como parámetro.

4

Mat(Size size, int type)

Este constructor acepta dos parámetros, un objeto que representa el tamaño de la matriz y un número entero que representa el tipo de matriz utilizada para almacenar los datos.

5

Mat(Size size, int type, Scalar s)

Incluyendo los parámetros del anterior, este constructor acepta adicionalmente un objeto de la clase Scalar como parámetro.

6

Mat(long addr)

7

Mat(Mat m, Range rowRange)

Este constructor acepta un objeto de otra matriz y un objeto de la clase Range que representa el rango de las filas que se tomarán para crear una nueva matriz.

8

Mat(Mat m, Range rowRange, Range colRange)

Incluyendo los parámetros del anterior, este constructor acepta adicionalmente un objeto de la clase. Rango que representa el rango de la columna.

9

Mat(Mat m, Rect roi)

Este constructor acepta dos objetos, uno que representa otra matriz y el otro que representa la Region OF Iinterés.

Note -

  • Tipo de matriz. Utilice CV_8UC1, ..., CV_64FC4 para crear matrices de 1-4 canales, o CV_8UC (n), ..., CV_64FC (n) para crear matrices multicanal (hasta canales CV_CN_MAX).

  • El tipo de matrices estuvo representado por varios campos de la clase. CvType que pertenece al paquete org.opencv.core.

Métodos y descripción

A continuación se muestran algunos de los métodos proporcionados por la clase Mat.

S. No Métodos y descripción
1

Mat col(int x)

Este método acepta un parámetro entero que representa el índice de una columna y recupera y devuelve esa columna.

2

Mat row(int y)

Este método acepta un parámetro entero que representa el índice de una fila y recupera y devuelve esa fila.

3

int cols()

Este método devuelve el número de columnas de la matriz.

4

int rows()

Este método devuelve el número de filas de la matriz.

5

Mat setTo(Mat value)

Este método acepta un objeto del Mat type y establece los elementos de la matriz en el valor especificado.

6

Mat setTo(Scalar s)

Este método acepta un objeto del Scalar type y establece los elementos de la matriz en el valor especificado.

Creación y visualización de la matriz

En esta sección, vamos a discutir nuestro primer ejemplo de OpenCV. Veremos cómo crear y mostrar una matriz OpenCV simple.

A continuación se muestran los pasos a seguir para crear y mostrar una matriz en OpenCV.

Paso 1: Cargue la biblioteca nativa de OpenCV

Mientras escribe código Java usando la biblioteca OpenCV, el primer paso que debe hacer es cargar la biblioteca nativa de OpenCV usando el loadLibrary(). Cargue la biblioteca nativa de OpenCV como se muestra a continuación.

//Loading the core library 
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Paso 2: crear una instancia de la clase Mat

Cree una instancia de la clase Mat usando cualquiera de las funciones mencionadas anteriormente en este capítulo.

//Creating a matrix 
Mat matrix = new Mat(5, 5, CvType.CV_8UC1, new Scalar(0));

Paso 3: llene la matriz usando los métodos

Puede recuperar filas / columnas particulares de una matriz pasando valores de índice a los métodos row()/col().

Y puede establecer valores para estos utilizando cualquiera de las variantes del setTo() métodos.

//Retrieving the row with index 0 
Mat row0 = matrix.row(0); 
     
//setting values of all elements in the row with index 0 
row0.setTo(new Scalar(1)); 
     
//Retrieving the row with index 3 
Mat col3 = matrix.col(3);  
     
//setting values of all elements in the row with index 3 
col3.setTo(new Scalar(3));

Example

Puede usar el siguiente código de programa para crear y mostrar una matriz simple en Java usando la biblioteca OpenCV.

import org.opencv.core.Core; 
import org.opencv.core.Mat;  
import org.opencv.core.CvType;  
import org.opencv.core.Scalar;   

class DisplayingMatrix { 
   public static void main(String[] args) {     
      //Loading the core library 
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);     

      //Creating a matrix 
      Mat matrix = new Mat(5, 5, CvType.CV_8UC1, new Scalar(0));  

      //Retrieving the row with index 0 
      Mat row0 = matrix.row(0);

      //setting values of all elements in the row with index 0 
      row0.setTo(new Scalar(1)); 

      //Retrieving the row with index 3 
      Mat col3 = matrix.col(3);  

      //setting values of all elements in the row with index 3 
      col3.setTo(new Scalar(3)); 

      //Printing the matrix 
      System.out.println("OpenCV Mat data:\n" + matrix.dump()); 
   } 
}

Al ejecutar el programa anterior, obtendrá el siguiente resultado:

OpenCV Mat data: 
[  1,   1,   1,   3,   1; 
   0,   0,   0,   3,   0; 
   0,   0,   0,   3,   0; 
   0,   0,   0,   3,   0; 
   0,   0,   0,   3,   0]

Cargando imagen usando la API de JavaSE

los BufferedImage clase de la java.awt.image.BufferedImage El paquete se utiliza para almacenar una imagen y el ImageIO clase del paquete import javax.imageio proporciona métodos para leer y escribir imágenes.

Example

Puede utilizar el siguiente código de programa para cargar y guardar imágenes utilizando la biblioteca JavaSE.

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO;
  
public class LoadingImage_JSE_library {
   public static void main( String[] args ) throws IOException {
      //Input File 
      File input = new File("C:/EXAMPLES/OpenCV/sample.jpg");
          
      //Reading the image 
      BufferedImage image = ImageIO.read(input);
      
      //Saving the image with a different name
      File ouptut = new File("C:/OpenCV/sample.jpg");
      ImageIO.write(image, "jpg", ouptut);
         
      System.out.println("image Saved");
   } 
}

Al ejecutar el programa anterior, obtendrá el siguiente resultado:

image Saved

Si abre la ruta especificada, puede observar la imagen guardada de la siguiente manera:

los Imgcodecs clase del paquete org.opencv.imgcodecsproporciona métodos para leer y escribir imágenes. Con OpenCV, puede leer una imagen y almacenarla en una matriz (realice transformaciones en la matriz si es necesario). Posteriormente, puede escribir la matriz procesada en un archivo.

los read() método del ImgcodecsLa clase se usa para leer una imagen usando OpenCV. A continuación se muestra la sintaxis de este método.

imread(filename)

Acepta un argumento (filename), una variable del tipo String que representa la ruta del archivo que se va a leer.

A continuación se muestran los pasos a seguir para leer imágenes en Java utilizando la biblioteca OpenCV.

Paso 1: Cargue la biblioteca nativa de OpenCV

Cargue la biblioteca nativa de OpenCV usando el load() método, como se muestra a continuación.

//Loading the core library 
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Paso 2: crear una instancia de la clase Imgcodecs

Instancia del Imgcodecs clase.

//Instantiating the Imgcodecs class 
Imgcodecs imageCodecs = new Imgcodecs();

Paso 3: leer la imagen

Leer la imagen usando el método imread(). Este método acepta un argumento de cadena que representa la ruta de la imagen y devuelve la imagen leída comoMat objeto.

//Reading the Image from the file  
Mat matrix = imageCodecs.imread(Path of the image);

Ejemplo

El siguiente código de programa muestra cómo puede read an image utilizando la biblioteca OpenCV.

import org.opencv.core.Core; 
import org.opencv.core.Mat;  
import org.opencv.imgcodecs.Imgcodecs;
 
public class ReadingImages {
   public static void main(String args[]) { 
      //Loading the OpenCV core library  
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); 
     
      //Instantiating the Imagecodecs class 
      Imgcodecs imageCodecs = new Imgcodecs(); 
     
      //Reading the Image from the file  
      String file ="C:/EXAMPLES/OpenCV/sample.jpg"; 
      Mat matrix = imageCodecs.imread(file); 
     
      System.out.println("Image Loaded");     
   } 
}

Al ejecutar el programa anterior, OpenCV carga la imagen especificada y muestra la siguiente salida:

Image Loaded

los write() método del ImgcodecsLa clase se usa para escribir una imagen usando OpenCV. Para escribir una imagen, repita los primeros tres pasos del ejemplo anterior.

Para escribir una imagen, debe invocar el imwrite() método del Imgcodecs clase.

A continuación se muestra la sintaxis de este método.

imwrite(filename, mat)

Este método acepta los siguientes parámetros:

  • filename - A String variable que representa la ruta donde guardar el archivo.

  • mat - A Mat objeto que representa la imagen a escribir.

Ejemplo

El siguiente programa es un ejemplo para write an image usando el programa Java usando la biblioteca OpenCV.

import org.opencv.core.Core; 
import org.opencv.core.Mat; 
import org.opencv.imgcodecs.Imgcodecs;
 
public class WritingImages {  
   public static void main(String args[]) { 
      //Loading the OpenCV core library  
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
      
      //Instantiating the imagecodecs class 
      Imgcodecs imageCodecs = new Imgcodecs(); 

      //Reading the Image from the file and storing it in to a Matrix object 
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";   
      Mat matrix = imageCodecs.imread(file); 

      System.out.println("Image Loaded ..........");
      String file2 = "C:/EXAMPLES/OpenCV/sample_resaved.jpg"; 

      //Writing the image 
      imageCodecs.imwrite(file2, matrix); 
      System.out.println("Image Saved ............"); 
   } 
}

Al ejecutar el programa anterior, obtendrá el siguiente resultado:

Image Loaded .......... 
Image Saved ...........

Si abre la ruta especificada, puede observar la imagen guardada como se muestra a continuación:

En los capítulos anteriores, hemos discutido cómo leer y guardar una imagen usando la biblioteca OpenCV Java. Además de eso, también podemos mostrar las imágenes cargadas en una ventana separada usando bibliotecas GUI como AWT / Swings y JavaFX.

Conversión de tapete en imagen con búfer

Para leer una imagen usamos el método imread(). Este método devuelve la imagen leída en forma deMatrix. Pero, para usar esta imagen con bibliotecas GUI (AWT / Swings y JavaFX), debe convertirse como un objeto de la clase.BufferedImage del paquete java.awt.image.BufferedImage.

Los siguientes son los pasos para convertir un Mat objeto de OpenCV para BufferedImage objeto.

Paso 1: codifique el Mat en MatOfByte

En primer lugar, debe convertir la matriz en una matriz de bytes. Puedes hacerlo usando el métodoimencode() de la clase Imgcodecs. A continuación se muestra la sintaxis de este método.

imencode(ext, image, matOfByte);

Este método acepta los siguientes parámetros:

  • Ext - Un parámetro de cadena que especifica el formato de la imagen (.jpg, .png, etc.)

  • image - Un objeto Mat de la imagen

  • matOfByte - Un objeto vacío de la clase MatOfByte

Codifique la imagen utilizando este método como se muestra a continuación.

//Reading the image 
Mat image = Imgcodecs.imread(file);

//instantiating an empty MatOfByte class 
MatOfByte matOfByte = new MatOfByte();

//Converting the Mat object to MatOfByte 
Imgcodecs.imencode(".jpg", image, matOfByte);

Paso 2: Convierta el objeto MatOfByte en una matriz de bytes

Convertir el MatOfByte objeto en una matriz de bytes usando el método toArray().

byte[] byteArray = matOfByte.toArray();

Paso 3: preparar el objeto InputStream

Prepare el objeto InputStream pasando la matriz de bytes creada en el paso anterior al constructor del ByteArrayInputStream clase.

//Preparing the InputStream object 
InputStream in = new ByteArrayInputStream(byteArray);

Paso 4: preparación del objeto InputStream

Pase el objeto Flujo de entrada creado en el paso anterior al read() método del ImageIOclase. Esto devolverá un objeto BufferedImage.

//Preparing the BufferedImage 
BufferedImage bufImage = ImageIO.read(in);

Visualización de imágenes usando AWT / Swings

Para mostrar una imagen usando el marco AWT / Swings, primero que nada, lea una imagen usando el imread() método y convertirlo en BufferedImage siguiendo los pasos antes mencionados.

Luego, instancia el JFrame class y agregue la imagen almacenada en búfer creada al ContentPane del JFrame, como se muestra a continuación:

//Instantiate JFrame 
JFrame frame = new JFrame();
 
//Set Content to the JFrame 
frame.getContentPane().add(new JLabel(new ImageIcon(bufImage))); 
frame.pack(); 
frame.setVisible(true);

Example

El siguiente código de programa muestra cómo puede read una imagen y display a través de la ventana oscilante utilizando la biblioteca OpenCV.

import java.awt.image.BufferedImage;

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 org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;

public class DisplayingImagesUsingSwings {
   public static void main(String args[]) throws Exception { 
      //Loading the OpenCV core library  
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); 
    
      //Reading the Image from the file and storing it in to a Matrix object 
      String file = "C:/EXAMPLES/OpenCV/sample.jpg"; 
      Mat image = Imgcodecs.imread(file); 
    
      //Encoding the image 
      MatOfByte matOfByte = new MatOfByte();       
      Imgcodecs.imencode(".jpg", image, matOfByte); 

      //Storing the encoded Mat in a byte array 
      byte[] byteArray = matOfByte.toArray(); 

      //Preparing the Buffered Image 
      InputStream in = new ByteArrayInputStream(byteArray); 
      BufferedImage bufImage = ImageIO.read(in); 

      //Instantiate JFrame 
      JFrame frame = new JFrame(); 

      //Set Content to the JFrame 
      frame.getContentPane().add(new JLabel(new ImageIcon(bufImage))); 
      frame.pack(); 
      frame.setVisible(true);
      
      System.out.println("Image Loaded");     
   } 
}

Al ejecutar el programa anterior, obtendrá el siguiente resultado:

Image Loaded

Además de eso, puede ver una ventana que muestra la imagen cargada, de la siguiente manera:

Visualización de imágenes usando JavaFX

Para mostrar una imagen usando JavaFX, en primer lugar, lea una imagen usando el imread() método y convertirlo en BufferedImage. Luego, convierta BufferedImage en WritableImage, como se muestra a continuación.

WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

Pasa esto WritableImage objeto al constructor del ImageView clase.

ImageView imageView = new ImageView(writableImage);

Example

El siguiente código de programa muestra cómo read una imagen y display a través de la ventana JavaFX utilizando la biblioteca OpenCV.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import javax.imageio.ImageIO;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;

public class DisplayingImagesJavaFX extends Application {
   @Override 
   public void start(Stage stage) throws IOException {   
      WritableImage writableImage = loadImage(); 
  
      //Setting the image view 
      ImageView imageView = new ImageView(writableImage); 
        
      //Setting the position of the image 
      imageView.setX(50); 
      imageView.setY(25); 
        
      //setting the fit height and width of the image view 
      imageView.setFitHeight(400); 
      imageView.setFitWidth(500);
      
      //Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);
      
      //Creating a Group object  
      Group root = new Group(imageView);
      
      //Creating a scene object
      Scene scene = new Scene(root, 600, 400);
      
      //Setting title to the Stage 
      stage.setTitle("Loading an image");
      
      //Adding scene to the stage
      stage.setScene(scene);

      //Displaying the contents of the stage
      stage.show();
   } 
   public WritableImage loadImage() throws IOException {
      //Loading the OpenCV core library  
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
      
      //Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat image = Imgcodecs.imread(file);
      
      //Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", image, matOfByte);

      //Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();
      
      //Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray); 
      BufferedImage bufImage = ImageIO.read(in);

      System.out.println("Image Loaded");
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage; 
   }
   public static void main(String args[]) {
      launch(args); 
   } 
}

Al ejecutar el programa anterior, obtendrá el siguiente resultado:

Image Loaded

Además de eso, puede ver una ventana que muestra la imagen cargada, de la siguiente manera:

OpenCV admite varios tipos de imágenes, como colores, binarias, escala de grises, etc. imread() método y campos predefinidos del Imgcodecs class, puede leer una imagen dada como otro tipo.

El parámetro flags del método imread () (IMREAD_XXX)

En los capítulos anteriores, hemos visto la sintaxis de imread() método del Imgcodecsclase. Acepta un argumento de cadena que representa la ubicación de la imagen que se va a leer.

imread(filename)

los imread() El método tiene otra sintaxis.

imread(filename, int flags)

Esta sintaxis acepta dos parámetros:

  • filename - Acepta un argumento (filename), una variable del tipo String que representa la ruta del archivo que se va a leer.

  • flags- Un valor entero que representa un valor de bandera predefinido. Para cada valor, esto lee la imagen dada como un tipo específico (color de escala de grises, etc.)

A continuación se muestra la tabla que enumera varios campos proporcionados en el Imgproc class como valores para este parámetro.

S. No Campos y descripción
1

IMREAD_COLOR

Si la bandera se establece en este valor, la imagen cargada se convertirá en una imagen de color BGR (azul verde rojo) de 3 canales.

2

IMREAD_GRAYSCALE

Si la bandera se establece en este valor, la imagen cargada se convertirá en una imagen en escala de grises de un solo canal.

3

IMREAD_LOAD_GDAL

Si la bandera se establece en este valor, puede cargar la imagen usando el gdal conductor.

4

IMREAD_ANYCOLOR

Si la bandera se establece en este valor, la imagen se lee en cualquier formato de color posible.

5

IMREAD_REDUCED_COLOR_2

IMREAD_REDUCED_COLOR_4

IMREAD_REDUCED_COLOR_8

Si el indicador se establece en este valor, la imagen se lee como de tres canales BGR, y el tamaño de la imagen se reduce a ½, ¼ º o ⅛ º del tamaño original de la imagen con respecto al campo utilizado.

6

IMREAD_REDUCED_GRAYSCALE_2

IMREAD_REDUCED_GRAYSCALE_4

IMREAD_REDUCED_GRAYSCALE_8

Si el indicador se establece en este valor, la imagen se lee una imagen de escala de grises de un solo canal como, y el tamaño de la imagen se reduce a ½, ¼ º o ⅛ º del tamaño original de la imagen con respecto al campo utilizado .

7

IMREAD_UNCHANGED

Si el indicador se establece en este valor, la imagen cargada se devuelve como está.

El siguiente programa demuestra cómo leer una imagen coloreada en escala de grises y mostrarla usando la ventana JavaFX. Aquí, hemos leído la imagen pasando la bandera.IMREAD_GRAYSCALE junto con la Cadena que sostiene el camino de una imagen coloreada.

import java.awt.image.BufferedImage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

public class ReadingAsGrayscale extends Application {
   @Override
   public void start(Stage stage) throws Exception {
      WritableImage writableImage = loadAndConvert();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // Setting the position of the image
      imageView.setX(10);
      imageView.setY(10);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);
      
      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);
      
      // Creating a Group object  
      Group root = new Group(imageView);
      
      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);
      
      // Setting title to the Stage
      stage.setTitle("Reading image as grayscale");
      
      // Adding scene to the stage
      stage.setScene(scene);
      
      // Displaying the contents of the stage
      stage.show();
   } 
   public WritableImage loadAndConvert() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Instantiating the imagecodecs class
      Imgcodecs imageCodecs = new Imgcodecs();

      String input = "C:/EXAMPLES/OpenCV/sample.jpg";

      // Reading the image
      Mat src = imageCodecs.imread(input, Imgcodecs.IMREAD_GRAYSCALE);
       
      byte[] data1 = new byte[src.rows() * src.cols() * (int)(src.elemSize())];
      src.get(0, 0, data1);
      
      // Creating the buffered image
      BufferedImage bufImage = new BufferedImage(src.cols(),src.rows(), 
         BufferedImage.TYPE_BYTE_GRAY);
      
      // Setting the data elements to the image
      bufImage.getRaster().setDataElements(0, 0, src.cols(), src.rows(), data1);
              
      // Creating a WritableImage
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      System.out.println("Image Read");
      return writableImage;
   } 
   public static void main(String args[]) throws Exception { 
      launch(args); 
   } 
}

Imagen de entrada

Suponga que la siguiente es la imagen de entrada sample.jpg especificado en el programa anterior.

Imagen de salida

Al ejecutar el programa, obtendrá el siguiente resultado.

El siguiente programa demuestra cómo leer una imagen coloreada como imagen de tipo BGR y mostrarla usando la ventana JavaFX. Aquí, hemos leído la imagen pasando la bandera.IMREAD_COLOR al método imread() junto con la Cadena que sostiene el camino de una imagen coloreada.

import java.awt.image.BufferedImage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

public class ReadingAsColored extends Application {
   @Override 
   public void start(Stage stage) throws Exception {
      WritableImage writableImage = loadAndConvert();
       
      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // Setting the position of the image
      imageView.setX(10);
      imageView.setY(10);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);
      
      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);
      
      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);
     
      // Setting title to the Stage
      stage.setTitle("Reading as colored image");

      // Adding scene to the stage
      stage.setScene(scene);
      
      // Displaying the contents of the stage
      stage.show();
   } 
   public WritableImage loadAndConvert() throws Exception {     
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
       
      String input = "C:/EXAMPLES/OpenCV/sample.jpg";
       
      Mat dst = new Mat();

      // Reading the image
      Mat src = Imgcodecs.imread(input, Imgcodecs.IMREAD_COLOR);

      byte[] data1 = new byte[src.rows() * src.cols() * (int)(src.elemSize())]; 
      src.get(0, 0, data1);
      
      // Creating the buffered image
      BufferedImage bufImage = new BufferedImage(src.cols(),src.rows(), 
         BufferedImage.TYPE_3BYTE_BGR);

      // Setting the data elements to the image 
      bufImage.getRaster().setDataElements(0, 0, src.cols(), src.rows(), data1);

      // Creating a WritableImage
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      System.out.println("Image read");
      return writableImage;
   } 
   public static void main(String args[]) throws Exception {
      launch(args);
   } 
}

Imagen de entrada

Suponga que la siguiente es la imagen de entrada sample.jpg especificado en el programa anterior.

Imagen de salida

Al ejecutar el programa, obtendrá el siguiente resultado.

En los capítulos anteriores, discutimos cómo leer una imagen de entrada en diferentes tipos (binaria, escala de grises, BGR, etc.). En este capítulo, aprenderemos cómo convertir un tipo de imagen en otro.

La clase nombrada Imgproc del paquete org.opencv.imgproc proporciona métodos para convertir una imagen de un color a otro.

Conversión de imágenes en color a escala de grises

Un método llamado cvtColor()se utiliza para convertir imágenes en color a escala de grises. A continuación se muestra la sintaxis de este método.

cvtColor(Mat src, Mat dst, int code)

Este método acepta los siguientes parámetros:

  • src - Una matriz que representa la fuente.

  • dst - Una matriz que representa el destino.

  • code - Un código entero que representa el tipo de conversión, por ejemplo, RGB a escala de grises.

Puede convertir imágenes en color a escala de grises pasando el código Imgproc.COLOR_RGB2GRAY junto con las matrices de origen y destino como un parámetro para el cvtColor() método.

Ejemplo

El siguiente programa demuestra cómo leer una imagen en color como una imagen en escala de grises y mostrarla usando la ventana JavaFX.

import java.awt.image.BufferedImage;
  
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;

import javafx.stage.Stage;

public class ColorToGrayscale extends Application {
   @Override
   public void start(Stage stage) throws Exception {
      WritableImage writableImage = loadAndConvert();
       
      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // Setting the position of the image
      imageView.setX(10);
      imageView.setY(10);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Colored to grayscale image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   } 
   public WritableImage loadAndConvert() throws Exception {
      //Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      String input = "C:/EXAMPLES/OpenCV/sample.jpg";

      //Reading the image
      Mat src = Imgcodecs.imread(input);

      //Creating the empty destination matrix
      Mat dst = new Mat();

      //Converting the image to gray sacle and saving it in the dst matrix
      Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2GRAY);
      
      //Extracting data from the transformed image (dst)
      byte[] data1 = new byte[dst.rows() * dst.cols() * (int)(dst.elemSize())];
      dst.get(0, 0, data1);

      //Creating Buffered image using the data
      BufferedImage bufImage = new BufferedImage(dst.cols(),dst.rows(), 
         BufferedImage.TYPE_BYTE_GRAY);

      //Setting the data elements to the image
      bufImage.getRaster().setDataElements(0, 0, dst.cols(), dst.rows(), data1);

      //Creating a WritableImage
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      System.out.println("Converted to Grayscale");
      return writableImage;
   }
   public static void main(String args[]) throws Exception {
      launch(args);
   }
}

Imagen de entrada

Suponga que la siguiente es la imagen de entrada sample.jpg especificado en el programa anterior.

Imagen de salida

Al ejecutar el programa, obtendrá el siguiente resultado.

Un método llamado threshold()se utiliza para convertir imágenes en escala de grises a imágenes binarias. A continuación se muestra la sintaxis de este método.

threshold(Mat src, Mat dst, double thresh, double maxval, int type)

Este método acepta los siguientes parámetros:

  • mat - A Mat objeto que representa la imagen de entrada.

  • dst - A Mat objeto que representa la imagen de salida.

  • thresh : Un número entero que representa el valor umbral.

  • maxval : Un número entero que representa el valor máximo que se debe utilizar con los tipos de umbral THRESH_BINARY y THRESH_BINARY_INV.

  • type - Un código entero que representa el tipo de conversión, por ejemplo, RGB a escala de grises.

Puede convertir una imagen en escala de grises en una imagen binaria pasando el código Imgproc.THRESH_BINARY junto con los valores de los parámetros restantes.

Ejemplo

El siguiente programa demuestra cómo leer una imagen coloreada como una imagen binaria y mostrarla usando la ventana JavaFX.

import java.awt.image.BufferedImage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

public class ColorToBinary extends Application {
   @Override
   public void start(Stage stage) throws Exception {
      WritableImage writableImage = loadAndConvert();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // Setting the position of the image
      imageView.setX(10);
      imageView.setY(10);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);
      
      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);
      
      // Setting title to the Stage
      stage.setTitle("Loading an image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage loadAndConvert() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Instantiating the Imgcodecs class
      Imgcodecs imageCodecs = new Imgcodecs();
        
      // File input = new File("C:/EXAMPLES/OpenCV/sample.jpg");
      String input = "C:/EXAMPLES/OpenCV/sample.jpg";

      // Reading the image
      Mat src = imageCodecs.imread(input);

      // Creating the destination matrix
      Mat dst = new Mat();

      // Converting to binary image...
      Imgproc.threshold(src, dst, 200, 500, Imgproc.THRESH_BINARY);

      // Extracting data from the transformed image (dst)
      byte[] data1 = new byte[dst.rows() * dst.cols() * (int)(dst.elemSize())];
      dst.get(0, 0, data1);

      // Creating Buffered image using the data
      BufferedImage bufImage = new BufferedImage(dst.cols(),dst.rows(), 
         BufferedImage.TYPE_BYTE_GRAY);

      // Setting the data elements to the image
      bufImage.getRaster().setDataElements(0, 0, dst.cols(), dst.rows(), data1);

      // Creating a Writable image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      System.out.println("Converted to binary");
      return writableImage;
   }  
   public static void main(String args[]) throws Exception {
      launch(args);
   }
}

Imagen de entrada

Suponga que la siguiente es la imagen de entrada sample.jpg especificado en el programa anterior.

Imagen de salida

Al ejecutar el programa, obtendrá el siguiente resultado.

Puede utilizar el mismo método mencionado en el capítulo anterior para convertir una imagen en escala de grises en una imagen binaria. Simplemente pase la ruta de una imagen en escala de grises como entrada a este programa.

Ejemplo

El siguiente programa demuestra cómo leer una imagen en escala de grises como una imagen binaria y mostrarla usando la ventana JavaFX.

import java.awt.image.BufferedImage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

public class GrayScaleToBinary extends Application {
   @Override
   public void start(Stage stage) throws Exception {
      WritableImage writableImage = loadAndConvert();
       
      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // Setting the position of the image
      imageView.setX(10);
      imageView.setY(10);
      
      // Setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Grayscale to binary image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage loadAndConvert() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Instantiating the imagecodecs class
      Imgcodecs imageCodecs = new Imgcodecs();

      String input = "E:/OpenCV/chap7/grayscale.jpg";

      // Reading the image
      Mat src = imageCodecs.imread(input);

      // Creating the destination matrix
      Mat dst = new Mat();

      // Converting to binary image...
      Imgproc.threshold(src, dst, 200, 500, Imgproc.THRESH_BINARY);

      // Extracting data from the transformed image (dst)
      byte[] data1 = new byte[dst.rows() * dst.cols() * (int)(dst.elemSize())];
      dst.get(0, 0, data1);

      // Creating Buffered image using the data
      BufferedImage bufImage = new BufferedImage(dst.cols(),dst.rows(), 
         BufferedImage.TYPE_BYTE_BINARY);

      // Setting the data elements to the image
      bufImage.getRaster().setDataElements(0, 0, dst.cols(), dst.rows(), data1);

      // Creating a Writable image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      System.out.println("Converted to binary");
      return writableImage;
   }
   public static void main(String args[]) throws Exception {
      launch(args);
   }
}

Imagen de entrada

Suponga que la siguiente es la imagen de entrada sample.jpg especificado en el programa anterior.

Imagen de salida

Al ejecutar el programa, obtendrá el siguiente resultado.

Puede dibujar varias formas como círculo, rectángulo, línea, elipse, polilíneas, convexas, polilíneas, polilíneas en una imagen usando los métodos respectivos de la org.opencv.imgproc paquete.

Puedes dibujar un círculo en una imagen usando el método circle() del imgprocclase. A continuación se muestra la sintaxis de este método:

circle(img, center, radius, color, thickness)

Este método acepta los siguientes parámetros:

  • mat - A Mat objeto que representa la imagen en la que se va a dibujar el círculo.

  • point - A Point objeto que representa el centro del círculo.

  • radius - Una variable del tipo integer que representa el radio del círculo.

  • scalar - A Scalarobjeto que representa el color del círculo. (BGR)

  • thickness - un integerque representa el grosor del círculo; por defecto, el valor del grosor es 1.

Ejemplo

El siguiente programa demuestra cómo dibujar un círculo en una imagen y mostrarlo usando la ventana JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingCircle extends Application {
   Mat matrix = null;
   
   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      DrawingCircle obj = new DrawingCircle();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing Circle on the image");
      
      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }      
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      //Drawing a Circle Imgproc.circle ( matrix, //Matrix obj of the image new Point(230, 160), //Center of the circle 100, //Radius new Scalar(0, 0, 255), //Scalar object for color 10 //Thickness of the circle );
      
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);
      this.matrix = matrix;
      
      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Al ejecutar el programa anterior, obtendrá el siguiente resultado:

Puedes dibujar una línea en una imagen usando el método line() del imgprocclase. A continuación se muestra la sintaxis de este método.

line(img, pt1, pt2, color, thickness)

Este método acepta los siguientes parámetros:

  • mat - A Mat objeto que representa la imagen en la que se dibujará la línea.

  • pt1 and pt2 - dos Point objetos que representan los puntos entre los que se trazará la línea.

  • scalar - A Scalarobjeto que representa el color del círculo. (BGR)

  • thickness- Un número entero que representa el grosor de la línea; por defecto, el valor del grosor es 1.

Ejemplo

El siguiente programa demuestra cómo dibujar una línea en una imagen y mostrarla usando la ventana JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingLine extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
   
      // Capturing the snapshot from the camera
      DrawingLine obj = new DrawingLine();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object  
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing a line on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      // Drawing a line Imgproc.line ( matrix, //Matrix obj of the image new Point(10, 200), //p1 new Point(300, 200), //p2 new Scalar(0, 0, 255), //Scalar object for color 5 //Thickness of the line );
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);

      this.matrix = matrix;

      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Al ejecutar el programa anterior, obtendrá el siguiente resultado:

Puedes dibujar un rectángulo en una imagen usando el método rectangle() del imgprocclase. A continuación se muestra la sintaxis de este método:

rectangle(img, pt1, pt2, color, thickness)

Este método acepta los siguientes parámetros:

  • mat - A Mat objeto que representa la imagen en la que se va a dibujar el rectángulo.

  • pt1 and pt2 - dos Point objetos que representan los vértices del rectángulo que se va a dibujar.

  • scalar - A Scalarobjeto que representa el color del rectángulo. (BGR)

  • thickness- Un número entero que representa el grosor del rectángulo; por defecto, el valor del grosor es 1.

Ejemplo

El siguiente ejemplo demuestra cómo dibujar un rectángulo en una imagen y mostrarlo usando la ventana JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingRectangle extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      DrawingRectangle obj = new DrawingRectangle();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing Rectangle on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      // Drawing a Rectangle Imgproc.rectangle ( matrix, //Matrix obj of the image new Point(130, 50), //p1 new Point(300, 280), //p2 new Scalar(0, 0, 255), //Scalar object for color 5 //Thickness of the line );
      
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);

      this.matrix = matrix;

      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Al ejecutar el programa anterior, obtendrá el siguiente resultado:

Puedes dibujar una elipse en una imagen usando el método rectangle() del imgprocclase. A continuación se muestra la sintaxis de este método:

ellipse(img, box, color, thickness)

Este método acepta los siguientes parámetros:

  • mat - A Mat objeto que representa la imagen en la que se dibujará el rectángulo.

  • box - Un objeto RotatedRect (la elipse se dibuja inscrita en este rectángulo).

  • scalar - A Scalarobjeto que representa el color del rectángulo. (BGR)

  • thickness- Un número entero que representa el grosor del rectángulo; por defecto, el valor del grosor es 1.

El constructor del RotatedRect la clase acepta un objeto de la clase Point, un objeto de la clase Size y una variable de tipo double, como se muestra a continuación.

RotatedRect(Point c, Size s, double a)

Ejemplo

El siguiente programa demuestra cómo dibujar una elipse en una imagen y mostrarla usando la ventana JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.RotatedRect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingEllipse extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      DrawingEllipse obj = new DrawingEllipse();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing Ellipse on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      // Drawing an Ellipse Imgproc.ellipse ( matrix, //Matrix obj of the image new RotatedRect ( // RotatedRect(Point c, Size s, double a) new Point(200, 150), new Size(260, 180), 180 ), new Scalar(0, 0, 255), //Scalar object for color 10 //Thickness of the line );
      
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);

      this.matrix = matrix;
      
      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Al ejecutar el programa anterior, obtendrá el siguiente resultado:

Puede dibujar polilíneas en una imagen usando el método polylines() del imgprocclase. A continuación se muestra la sintaxis de este método.

polylines(img, pts, isClosed, color, thickness)

Este método acepta los siguientes parámetros:

  • mat - A Mat objeto que representa la imagen en la que se dibujarán las polilíneas.

  • pts - A List objeto que sostiene los objetos del tipo MatOfPoint.

  • isClosed - Un parámetro de tipo booleano que especifica si las polilíneas están cerradas.

  • scalar - A Scalarobjeto que representa el color de las polilíneas. (BGR)

  • thickness- Un número entero que representa el grosor de las polilíneas; por defecto, el valor del grosor es 1.

El constructor del MatOfPoint la clase acepta objetos de la clase Point.

MatOfPoint(Point... a)

Ejemplo

El siguiente programa demuestra cómo dibujar polilíneas en una imagen y mostrarla usando la ventana JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingPolyLines extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      DrawingPolyLines obj = new DrawingPolyLines();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing Polylines on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }      
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      List<MatOfPoint> list = new ArrayList();
      list.add(
         new MatOfPoint (
            new Point(75, 100), new Point(350, 100),
            new Point(75, 150), new Point(350, 150),
            new Point(75, 200), new Point(350, 200),
            new Point(75, 250), new Point(350, 250)
         )
      );
      // Drawing polylines Imgproc.polylines ( matrix, // Matrix obj of the image list, // java.util.List<MatOfPoint> pts false, // isClosed new Scalar(0, 0, 255), // Scalar object for color 2 // Thickness of the line );
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);

      this.matrix = matrix;

      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Al ejecutar el programa anterior, obtendrá el siguiente resultado:

Puede dibujar polilíneas convexas en una imagen utilizando el método fillconvexPoly() del imgprocclase. A continuación se muestra la sintaxis de este método.

fillConvexPoly(Mat img, MatOfPoint points, Scalar color)

Este método acepta los siguientes parámetros:

  • mat - A Mat objeto que representa la imagen en la que se dibujarán las polilíneas convexas.

  • points - A MatOfPoint objeto que representa los puntos entre los que se dibujarán las polilíneas convexas.

  • scalar - A Scalarobjeto que representa el color de las polilíneas convexas. (BGR)

El constructor del MatOfPoint la clase acepta objetos de la clase Point.

MatOfPoint(Point... a)

Ejemplo

El siguiente programa demuestra cómo dibujar polilíneas convexas en una imagen y mostrarla usando la ventana JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class FillConvexPoly extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      FillConvexPoly obj = new FillConvexPoly();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      //Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing convex Polylines (fill) on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      MatOfPoint matOfPoint = new MatOfPoint (
         new Point(75, 100), new Point(350, 100),
         new Point(75, 150), new Point(350, 150),
         new Point(75, 200), new Point(350, 200),
         new Point(75, 250), new Point(350, 250)
      ); 
      // Drawing polylines Imgproc.fillConvexPoly ( matrix, // Matrix obj of the image matOfPoint, // java.util.List<MatOfPoint> pts new Scalar(0, 0, 255) // Scalar object for color );
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);
      this.matrix = matrix;
            
      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   } 
   public static void main(String args[]) {
      launch(args);
   }
}

Al ejecutar el programa anterior, obtendrá el siguiente resultado:

Puede dibujar una línea con flechas en una imagen usando el método arrowedLine() del imgprocclase. A continuación se muestra la sintaxis de este método:

arrowedLine(Mat img, Point pt1, Point pt2, Scalar color)

Este método acepta los siguientes parámetros:

  • mat - A Mat objeto que representa la imagen en la que se va a dibujar la línea con flechas.

  • pt1 and pt2 - dos Point objetos que representan los puntos entre los cuales se debe trazar la línea con flechas.

  • scalar - A Scalarobjeto que representa el color de la línea con flechas. (BGR)

Ejemplo

El siguiente programa demuestra cómo dibujar una línea con flechas en una imagen y mostrarla usando la ventana JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DrawingArrowedLine extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      DrawingArrowedLine obj = new DrawingArrowedLine();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Drawing a line on the image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/Aish.jpg";
      Mat matrix = Imgcodecs.imread(file);

      //Drawing a line Imgproc.arrowedLine( matrix, // Matrix obj of the image new Point(10, 200), // p1 new Point(590, 200), // p2 new Scalar(0, 100, 255) // Scalar object for color );

      // arrowedLine(Mat img, Point pt1, Point pt2, Scalar color)
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);
      this.matrix = matrix;

      // Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);

      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Al ejecutar el programa anterior, obtendrá el siguiente resultado:

Puedes agregar texto a una imagen usando el método arrowedLine() del imgprocclase. A continuación se muestra la sintaxis de este método.

putText(img, text, org, fontFace, fontScale, Scalar color, int thickness)

Este método acepta los siguientes parámetros:

  • mat - A Mat objeto que representa la imagen a la que se agregará el texto.

  • text - A string variable de representación del texto que se va a agregar.

  • org - A Point objeto que representa la cadena de texto de la esquina inferior izquierda de la imagen.

  • fontFace - Una variable de tipo entero que representa el tipo de fuente.

  • fontScale - Una variable del tipo double que representa el factor de escala que se multiplica por el tamaño base específico de la fuente.

  • scalar - A Scalarobjeto que representa el color del texto que se va a agregar. (BGR)

  • thickness - Un número entero que representa el grosor de la línea de forma predeterminada, el valor del grosor es 1.

Ejemplo

El siguiente programa demuestra cómo agregar texto a una imagen y mostrarlo usando la ventana JavaFX.

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class AddingTextToImage extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws Exception {
      // Capturing the snapshot from the camera
      AddingTextToImage obj = new AddingTextToImage();
      WritableImage writableImage = obj.LoadImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(600);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Adding text to an image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage LoadImage() throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap8/input.jpg";
      Mat matrix = Imgcodecs.imread(file);

      // Adding Text Imgproc.putText ( matrix, // Matrix obj of the image "Ravivarma's Painting", // Text to be added new Point(10, 50), // point Core.FONT_HERSHEY_SIMPLEX , // front face 1, // front scale new Scalar(0, 0, 0), // Scalar object for color 4 // Thickness );
      
      // Encoding the image
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", matrix, matOfByte);

      // Storing the encoded Mat in a byte array
      byte[] byteArray = matOfByte.toArray();

      // Displaying the image
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);
      this.matrix = matrix;

      //Creating the Writable Image
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Al ejecutar el programa anterior, obtendrá el siguiente resultado:

El desenfoque (suavizado) es la operación de procesamiento de imágenes más utilizada para reducir el ruido de la imagen. El proceso elimina el contenido de alta frecuencia, como los bordes, de la imagen y la suaviza.

En general, el desenfoque se logra convolucionando (cada elemento de la imagen se agrega a sus vecinos locales, ponderados por el núcleo) la imagen a través de un núcleo de filtro de paso bajo.

Desenfoque (promediado)

Durante esta operación, la imagen se convoluciona con un filtro de caja (normalizado). En este proceso, el elemento central de la imagen se reemplaza por el promedio de todos los píxeles en el área del núcleo.

Puede realizar esta operación en una imagen utilizando el método blur() del imgprocclase. A continuación se muestra la sintaxis de este método:

blur(src, dst, ksize, anchor, borderType)

Este método acepta los siguientes parámetros:

  • src - A Mat objeto que representa la fuente (imagen de entrada) para esta operación.

  • dst - A Mat objeto que representa el destino (imagen de salida) para esta operación.

  • ksize - A Size objeto que representa el tamaño del kernel.

  • anchor - Una variable de tipo entero que representa el punto de ancla.

  • borderType - Una variable de tipo entero que representa el tipo de borde que se utilizará en la salida.

Ejemplo

El siguiente programa demuestra cómo realizar la operación de promediado (desenfoque) en una imagen.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class BlurTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating the Size and Point objects
      Size size = new Size(45, 45);
      Point point = new Point(20, 30);

      // Applying Blur effect on the Image
      Imgproc.blur(src, dst, size, point, Core.BORDER_DEFAULT);

      // blur(Mat src, Mat dst, Size ksize, Point anchor, int borderType)
      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap9/blur.jpg", dst);
      System.out.println("Image processed");
   }
}

Suponga que la siguiente es la imagen de entrada sample.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

En la operación de Desenfoque gaussiano, la imagen se convoluciona con un filtro gaussiano en lugar del filtro de caja. El filtro gaussiano es un filtro de paso bajo que elimina los componentes de alta frecuencia que se reducen.

Puede realizar esta operación en una imagen utilizando el Gaussianblur() método del imgprocclase. A continuación se muestra la sintaxis de este método:

GaussianBlur(src, dst, ksize, sigmaX)

Este método acepta los siguientes parámetros:

  • src - A Mat objeto que representa la fuente (imagen de entrada) para esta operación.

  • dst - A Mat objeto que representa el destino (imagen de salida) para esta operación.

  • ksize - A Size objeto que representa el tamaño del kernel.

  • sigmaX - Una variable del tipo double que representa la desviación estándar del kernel de Gauss en la dirección X.

Ejemplo

El siguiente programa demuestra cómo realizar la operación de desenfoque gaussiano en una imagen.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class GaussianTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();
    
      // Applying GaussianBlur on the Image
      Imgproc.GaussianBlur(src, dst, new Size(45, 45), 0);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap9/Gaussian.jpg", dst);
      System.out.println("Image Processed");
   }
}

Suponga que la siguiente es la imagen de entrada sample.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

La operación de Desenfoque mediano es similar a los otros métodos de promediado. Aquí, el elemento central de la imagen se reemplaza por la mediana de todos los píxeles en el área del kernel. Esta operación procesa los bordes mientras elimina el ruido.

Puede realizar esta operación en una imagen utilizando el medianBlur() método del imgprocclase. A continuación se muestra la sintaxis de este método:

medianBlur(src, dst, ksize)

Este método acepta los siguientes parámetros:

  • src - A Mat objeto que representa la fuente (imagen de entrada) para esta operación.

  • dst - A Mat objeto que representa el destino (imagen de salida) para esta operación.

  • ksize - A Size objeto que representa el tamaño del kernel.

Ejemplo

El siguiente programa demuestra cómo realizar la operación de desenfoque medio en una imagen.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class MedianBlurTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying MedianBlur on the Image
      Imgproc.medianBlur(src, dst, 15);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap9/median.jpg", dst);

      System.out.println("Image Processed");
   }
}

Suponga que la siguiente es la imagen de entrada sample.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

El filtrado de imágenes le permite aplicar varios efectos a una imagen. En este capítulo y los tres capítulos siguientes, vamos a discutir varias operaciones de filtro como Filtro Bilateral, Filtro de Caja, Filtro de Caja SQR y Filter2D.

Filtro bilateral

La operación Filtro bilateral aplica una imagen bilateral a un filtro. Puede realizar esta operación en una imagen utilizando elmedianBlur() método del imgprocclase. A continuación se muestra la sintaxis de este método.

bilateralFilter(src, dst, d, sigmaColor, sigmaSpace, borderType)

Este método acepta los siguientes parámetros:

  • src - A Mat objeto que representa la fuente (imagen de entrada) para esta operación.

  • dst - A Mat objeto que representa el destino (imagen de salida) para esta operación.

  • d - Una variable de tipo entero que representa el diámetro de la vecindad de píxeles.

  • sigmaColor - Una variable de tipo integer que representa el filtro sigma en el espacio de color.

  • sigmaSpace - Una variable de tipo entero que representa el filtro sigma en el espacio de coordenadas.

  • borderType - Un objeto entero que representa el tipo de borde utilizado.

Ejemplo

El siguiente programa demuestra cómo realizar la operación de filtro bilateral en una imagen.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class BilateralFilter {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap11/filter_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying Bilateral filter on the Image
      Imgproc.bilateralFilter(src, dst, 15, 80, 80, Core.BORDER_DEFAULT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap11/bilateralfilter.jpg", dst);

      System.out.println("Image Processed");
   }
}

Suponga que la siguiente es la imagen de entrada filter_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

La operación de filtro de caja es similar a la operación de promediado de desenfoque; aplica una imagen bilateral a un filtro. Aquí puede elegir si el cuadro debe normalizarse o no.

Puede realizar esta operación en una imagen utilizando el boxFilter() método del imgprocclase. A continuación se muestra la sintaxis de este método:

boxFilter(src, dst, ddepth, ksize, anchor, normalize, borderType)

Este método acepta los siguientes parámetros:

  • src - A Mat objeto que representa la fuente (imagen de entrada) para esta operación.

  • dst - A Mat objeto que representa el destino (imagen de salida) para esta operación.

  • ddepth - Una variable de tipo entero que representa la profundidad de la imagen de salida.

  • ksize - A Size objeto que representa el tamaño del kernel difuminado.

  • anchor - Una variable de tipo entero que representa el punto de ancla.

  • Normalize - Una variable de tipo booleano que especifica si el kernel debe normalizarse.

  • borderType - Un objeto entero que representa el tipo de borde utilizado.

Ejemplo

El siguiente programa demuestra cómo realizar la operación de filtro de caja en una imagen.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class BoxFilterTest {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file = "E:/OpenCV/chap11/filter_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating the objects for Size and Point
      Size size = new Size(45, 45);
      Point point = Point(-1, -1);

      // Applying Box Filter effect on the Image
      Imgproc.boxFilter(src, dst, 50, size, point, true, Core.BORDER_DEFAULT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap11/boxfilterjpg", dst);

      System.out.println("Image Processed");
   }
}

Suponga que la siguiente es la imagen de entrada filter_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

Puede realizar la operación de filtro SQRBox en una imagen utilizando el boxFilter() método del imgprocclase. A continuación se muestra la sintaxis de este método:

sqrBoxFilter(src, dst, ddepth, ksize)

Este método acepta los siguientes parámetros:

  • src - A Mat objeto que representa la fuente (imagen de entrada) para esta operación.

  • dst - A Mat objeto que representa el destino (imagen de salida) para esta operación.

  • ddepth - Una variable de tipo entero que representa la profundidad de la imagen de salida.

  • ksize - A Size objeto que representa el tamaño del kernel difuminado.

Ejemplo

El siguiente programa demuestra cómo realizar la operación de filtro Sqrbox en una imagen determinada.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class SqrBoxFilterTest {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap11/filter_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying Box Filter effect on the Image
      Imgproc.sqrBoxFilter(src, dst, -1, new Size(1, 1));
     
      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap11/sqrboxfilter.jpg", dst);

      System.out.println("Image Processed");
   } 
}

Suponga que la siguiente es la imagen de entrada filter_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

La operación Filter2D convoluciona una imagen con el kernel. Puede realizar esta operación en una imagen utilizando elFilter2D() método del imgprocclase. A continuación se muestra la sintaxis de este método:

filter2D(src, dst, ddepth, kernel)

Este método acepta los siguientes parámetros:

  • src - A Mat objeto que representa la fuente (imagen de entrada) para esta operación.

  • dst - A Mat objeto que representa el destino (imagen de salida) para esta operación.

  • ddepth - Una variable de tipo entero que representa la profundidad de la imagen de salida.

  • kernel - A Mat objeto que representa el núcleo de convolución.

Ejemplo

El siguiente programa demuestra cómo realizar la operación Filter2D en una imagen.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Filter2D {
   public static void main( String[] args ) {
      //Loading the OpenCV core library  
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      //Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap11/filter_input.jpg";
      Mat src = Imgcodecs.imread(file);

      //Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating kernel matrix
      Mat kernel = Mat.ones(2,2, CvType.CV_32F);
      
      for(int i = 0; i<kernel.rows(); i++) {
         for(int j = 0; j<kernel.cols(); j++) {
            double[] m = kernel.get(i, j);

            for(int k = 1; k<m.length; k++) {
               m[k] = m[k]/(2 * 2);
            }
            kernel.put(i,j, m);
         }
      }
      Imgproc.filter2D(src, dst, -1, kernel);
      Imgcodecs.imwrite("E:/OpenCV/chap11/filter2d.jpg", dst);
      System.out.println("Image Processed");
   }
}

Suponga que la siguiente es la imagen de entrada filter_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

La erosión y la dilatación son los dos tipos de operaciones morfológicas. Como su nombre lo indica, las operaciones morfológicas son el conjunto de operaciones que procesan imágenes según sus formas.

Basado en la imagen de entrada dada, se desarrolla un "elemento estructural". Esto se puede realizar en cualquiera de los dos procedimientos. Estos tienen como objetivo eliminar el ruido y asentar las imperfecciones, para aclarar la imagen.

Dilatación

Este procedimiento sigue a la convolución con algún núcleo de una forma específica, como un cuadrado o un círculo. Este núcleo tiene un punto de anclaje, que denota su centro.

Este núcleo se superpone sobre la imagen para calcular el valor máximo de píxeles. Después de calcular, la imagen se reemplaza con un ancla en el centro. Con este procedimiento, las áreas de las regiones brillantes aumentan de tamaño y, por lo tanto, aumenta el tamaño de la imagen.

Por ejemplo, el tamaño de un objeto en tono blanco o tono brillante aumenta, mientras que el tamaño de un objeto en tono negro o tono oscuro disminuye.

Puede realizar la operación de dilatación en una imagen utilizando el dilate() método del imgprocclase. A continuación se muestra la sintaxis de este método.

dilate(src, dst, kernel)

Este método acepta los siguientes parámetros:

  • src - A Mat objeto que representa la fuente (imagen de entrada) para esta operación.

  • dst - A Mat objeto que representa el destino (imagen de salida) para esta operación.

  • kernel - A Mat objeto que representa el kernel.

Ejemplo

Puede preparar la matriz del kernel utilizando el getStructuringElement()método. Este método acepta un número entero que representa elmorph_rect tipo y un objeto del tipo Size.

Imgproc.getStructuringElement(int shape, Size ksize);

El siguiente programa demuestra cómo realizar la operación de dilatación en una imagen determinada.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class DilateTest {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Preparing the kernel matrix object 
      Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, 
         new  Size((2*2) + 1, (2*2)+1));

      // Applying dilate on the Image
      Imgproc.dilate(src, dst, kernel);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap10/Dilation.jpg", dst);

      System.out.println("Image Processed");
   } 
}

Entrada

Suponga que la siguiente es la imagen de entrada sample.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

La erosión es un proceso bastante similar a la dilatación. Pero el valor de píxel calculado aquí es mínimo en lugar de máximo en dilatación. La imagen se reemplaza debajo del punto de anclaje con ese valor de píxel mínimo.

Con este procedimiento, las áreas de las regiones oscuras aumentan de tamaño y las regiones brillantes se reducen. Por ejemplo, el tamaño de un objeto en tono oscuro o tono negro aumenta, mientras que disminuye en tono blanco o tono brillante.

Ejemplo

Puede realizar esta operación en una imagen utilizando el erode() método del imgprocclase. A continuación se muestra la sintaxis de este método:

erode(src, dst, kernel)

Este método acepta los siguientes parámetros:

  • src - A Mat objeto que representa la fuente (imagen de entrada) para esta operación.

  • dst - A Mat objeto que representa el destino (imagen de salida) para esta operación.

  • kernel - A Mat objeto que representa el kernel.

Puede preparar la matriz del kernel utilizando el getStructuringElement()método. Este método acepta un número entero que representa elmorph_rect tipo y un objeto del tipo Size.

Imgproc.getStructuringElement(int shape, Size ksize);

El siguiente programa demuestra cómo realizar la operación de erosión en una imagen determinada.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class ErodeTest {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="C:/EXAMPLES/OpenCV/sample.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Preparing the kernel matrix object
      Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, 
         new  Size((2*2) + 1, (2*2)+1));

      // Applying erode on the Image
      Imgproc.erode(src, dst, kernel);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap10/Erosion.jpg", dst);

      System.out.println("Image processed");
   }
}

Suponga que la siguiente es la imagen de entrada sample.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Loaded

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

En los capítulos anteriores, discutimos el proceso de erosion y dilation. Además de estos dos, OpenCV tiene más transformaciones morfológicas. losmorphologyEx() del método de la clase Imgproc se utiliza para realizar estas operaciones en una imagen determinada.

A continuación se muestra la sintaxis de este método:

morphologyEx(src, dst, op, kernel)

Este método acepta los siguientes parámetros:

  • src - Un objeto de la clase Mat que representa la imagen de origen (entrada).

  • dst - objeto de la clase Mat que representa la imagen de destino (salida).

  • op - Un número entero que representa el tipo de operación morfológica.

  • kernel - Una matriz de kernel.

Ejemplo

El siguiente programa demuestra cómo aplicar la operación morfológica "top-hat" en una imagen usando la biblioteca OpenCV.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class MorphologyExTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap12/morph_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating kernel matrix
      Mat kernel = Mat.ones(5,5, CvType.CV_32F);

      // Applying Blur effect on the Image 
      Imgproc.morphologyEx(src, dst, Imgproc.MORPH_TOPHAT, kernel);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap12/morph_tophat.jpg", dst);

      System.out.println("Image Processed");
   } 
}

Suponga que la siguiente es la imagen de entrada morph_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

Más operaciones

Además de la operación morfológica TOPHAT, demostrado en la anterior example, OpenCV se adapta a otros tipos de morfologías. Todos estos tipos están representados por campos estáticos predefinidos (valores fijos) deImgproc clase.

Puede elegir el tipo de morfología que necesita pasando su respectivo valor predefinido al parámetro op del morphologyEx() método.

// Applying Blur effect on the Image
Imgproc.morphologyEx(src, dst, Imgproc.MORPH_TOPHAT, kernel);

A continuación se muestran los valores que representan el tipo de operaciones morfológicas y sus respectivos resultados.

Operación y descripción Salida
MORPH_BLACKHAT
MORPH_CLOSE
MORPH_CROSS
MORPH_DILATE
MORPH_ELLIPSE
MORPH_ERODE
MORPH_GRADIENT
MORPH_OPEN
MORPH_RECT
MORPH_TOPHAT

Pyramid es una operación en una imagen donde,

  • Una imagen de entrada se suaviza inicialmente utilizando un filtro de suavizado particular (por ejemplo, gaussiano, laplaciano) y luego se submuestrea la imagen suavizada.

  • Este proceso se repite varias veces.

Durante la operación piramidal, la suavidad de la imagen aumenta y la resolución (tamaño) disminuye.

Pirámide arriba

En Pyramid Up, la imagen se muestra inicialmente y luego se difumina. Puede realizar la operación Pyramid Up en una imagen usando elpyrUP() método del imgprocclase. A continuación se muestra la sintaxis de este método:

pyrUp(src, dst, dstsize, borderType)

Este método acepta los siguientes parámetros:

  • src - Un objeto de la clase Mat que representa la imagen de origen (entrada).

  • mat - Un objeto de la clase Mat que representa la imagen de destino (salida).

  • size - Un objeto de la clase Size que representa el tamaño al que se va a aumentar o disminuir la imagen.

  • borderType - Una variable de tipo entero que representa el tipo de borde que se utilizará.

Ejemplo

El siguiente programa demuestra cómo realizar la operación Pyramid Up en una imagen.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class PyramidUp {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap13/pyramid_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying pyrUp on the Image
      Imgproc.pyrUp(src, dst, new Size(src.cols()*2,  src.rows()*2), Core.BORDER_DEFAULT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap13/pyrUp_output.jpg", dst);

      System.out.println("Image Processed");
   }
}

Suponga que la siguiente es la imagen de entrada pyramid_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

Pirámide abajo

En Pyramid Down, la imagen se difumina inicialmente y luego se reduce la muestra. Puede realizar la operación Pyramid Down en una imagen usando elpyrDown() método del imgprocclase. A continuación se muestra la sintaxis de este método:

pyrDown(src, dst, dstsize, borderType)

Este método acepta los siguientes parámetros:

  • src - Un objeto de la clase Mat que representa la imagen de origen (entrada).

  • mat - Un objeto de la clase Mat que representa la imagen de destino (salida).

  • size - Un objeto de la clase Size que representa el tamaño al que se va a aumentar o disminuir la imagen.

  • borderType - Una variable de tipo entero que representa el tipo de borde que se utilizará.

Ejemplo

El siguiente programa demuestra cómo realizar la operación Pyramid Down en una imagen.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class PyramidDown {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap13/pyramid_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying pyrDown on the Image
      Imgproc.pyrDown(src, dst, new Size(src.cols()/2,  src.rows()/2),
         Core.BORDER_DEFAULT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap13/pyrDown_output.jpg", dst);

      System.out.println("Image Processed");
   } 
}

Suponga que la siguiente es la imagen de entrada pyramid_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

Filtrado de cambio medio

En la operación de pirámide de cambio medio, se lleva a cabo un paso inicial de segmentación del cambio medio de una imagen.

Puede realizar la operación de filtrado de cambio medio piramidal en una imagen utilizando el pyrDown() método del imgprocclase. A continuación se muestra la sintaxis de este método.

pyrMeanShiftFiltering(src, dst, sp, sr)

Este método acepta los siguientes parámetros:

  • src - Un objeto de la clase Mat que representa la imagen de origen (entrada).

  • mat - Un objeto de la clase Mat que representa la imagen de destino (salida).

  • sp - Una variable de tipo double que representa el radio espacial de la ventana.

  • sr - Una variable del tipo double que representa el radio de la ventana de color.

Ejemplo

El siguiente programa demuestra cómo realizar una operación de filtrado de cambio medio en una imagen determinada.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class PyramidMeanShift {
   public static void main( String[] args ) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap13/pyramid_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying meanShifting on the Image
      Imgproc.pyrMeanShiftFiltering(src, dst, 200, 300);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap13/meanShift_output.jpg", dst);
      
      System.out.println("Image Processed");
   } 
}

Suponga que la siguiente es la imagen de entrada pyramid_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

La creación de umbrales es un método de segmentación de imágenes, en general se utiliza para crear imágenes binarias. El umbral es de dos tipos, a saber, umbral simple y umbral adaptativo.

Umbral simple

En una operación de umbral simple, a los píxeles cuyos valores son mayores que el valor umbral especificado, se les asigna un valor estándar.

Puede realizar una operación de umbral simple en una imagen utilizando el método threshold() del Imgproc class, A continuación se muestra la sintaxis de este método.

threshold(src, dst, thresh, maxval, type)

Este método acepta los siguientes parámetros:

  • src - Un objeto de la clase Mat que representa la imagen de origen (entrada).

  • dst - Un objeto de la clase Mat que representa la imagen de destino (salida).

  • thresh - Una variable de tipo doble que representa el valor umbral.

  • maxval - Una variable de tipo doble que representa el valor que se debe dar si el valor del píxel es mayor que el valor umbral.

  • type - Una variable de tipo entero que representa el tipo de umbral que se utilizará.

Ejemplo

El siguiente programa demuestra cómo realizar una operación de umbral simple en una imagen en OpenCV.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Thresh {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap14/thresh_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();
      Imgproc.threshold(src, dst, 50, 255, Imgproc.THRESH_BINARY);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap14/thresh_trunc.jpg", dst);

      System.out.println("Image Processed");
   }
}

Suponga que la siguiente es la imagen de entrada thresh_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

Otros tipos de umbrales simples

Además de THRESH_BINARYOperación demostrada en el ejemplo anterior, OpenCV abastece a varios otros tipos de operaciones de umbral. Todos estos tipos están representados por campos estáticos predefinidos (valores fijos) deImgproc clase.

Puede elegir el tipo de operación de umbral que necesita, pasando su valor predefinido respectivo al parámetro denominado type del threshold() método.

Imgproc.threshold(src, dst, 50, 255, Imgproc.THRESH_BINARY);

A continuación se muestran los valores que representan varios tipos de operaciones de umbral y sus respectivas salidas.

Operación y descripción Salida
THRESH_BINARY
THRESH_BINARY_INV
THRESH_TRUNC
THRESH_TOZERO
THRESH_TOZERO_INV

En simple thresholding, el valor de umbral es global, es decir, es el mismo para todos los píxeles de la imagen. Adaptive thresholding es el método en el que el valor de umbral se calcula para regiones más pequeñas y, por lo tanto, habrá diferentes valores de umbral para diferentes regiones.

En OpenCV, puede realizar una operación de umbral adaptativo en una imagen utilizando el método adaptiveThreshold() del Imgprocclase. A continuación se muestra la sintaxis de este método.

adaptiveThreshold(src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C)

Este método acepta los siguientes parámetros:

  • src - Un objeto de la clase Mat que representa la imagen de origen (entrada).

  • dst - Un objeto de la clase Mat que representa la imagen de destino (salida).

  • maxValue - Una variable de tipo doble que representa el valor que se debe dar si el valor del píxel es mayor que el valor umbral.

  • adaptiveMethod- Una variable de tipo entero que representa el método adaptativo que se utilizará. Este será cualquiera de los dos valores siguientes

    • ADAPTIVE_THRESH_MEAN_C - el valor umbral es la media del área del vecindario.

    • ADAPTIVE_THRESH_GAUSSIAN_C - el valor umbral es la suma ponderada de los valores de vecindad donde los pesos son una ventana gaussiana.

  • thresholdType - Una variable de tipo entero que representa el tipo de umbral que se utilizará.

  • blockSize - Una variable de tipo entero que representa el tamaño de la vecindad de píxeles utilizada para calcular el valor de umbral.

  • C - Una variable de tipo doble que representa la constante utilizada en ambos métodos (restada de la media o media ponderada).

  • Ejemplo

    El siguiente programa demuestra cómo realizar la operación de umbral adaptativo en una imagen en OpenCV. Aquí estamos eligiendo un umbral adaptativo de tipobinary y ADAPTIVE_THRESH_MEAN_C para el método de umbral.

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    
    public class AdaptiveThresh {
       public static void main(String args[]) throws Exception {
          // Loading the OpenCV core library
          System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
    
          // Reading the Image from the file and storing it in to a Matrix object
          String file ="E:/OpenCV/chap14/thresh_input.jpg";
          
          // Reading the image
          Mat src = Imgcodecs.imread(file,0);
    
          // Creating an empty matrix to store the result
          Mat dst = new Mat();
    
          Imgproc.adaptiveThreshold(src, dst, 125, Imgproc.ADAPTIVE_THRESH_MEAN_C,
             Imgproc.THRESH_BINARY, 11, 12);
    
          // Writing the image
          Imgcodecs.imwrite("E:/OpenCV/chap14/Adaptivemean_thresh_binary.jpg", dst);
    
          System.out.println("Image Processed");
       } 
    }

    Suponga que la siguiente es la imagen de entrada thresh_input.jpg especificado en el programa anterior.

    Salida

    Al ejecutar el programa, obtendrá el siguiente resultado:

    Image Processed

    Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

    Otros tipos de umbralización adaptativa

    Además de ADAPTIVE_THRESH_MEAN_C como el método adaptativo y THRESH_BINARY como tipo de umbral como se demostró en el ejemplo anterior, podemos elegir más combinaciones de estos dos valores.

    Imgproc.adaptiveThreshold(src, dst, 125, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 11, 12);

    A continuación se muestran los valores que representan varias combinaciones de valores para los parámetros. adaptiveMethod y thresholdType y sus respectivos productos.

    adaptiveMethod /resholdType ADAPTIVE_THRESH_MEAN_C ADAPTIVE_THRESH_GAUSSIAN_C:
    THRESH_BINARY
    THRESH_BINARY_INV

    Este capítulo le enseña cómo agregar bordes a una imagen.

    El método copyMakeBorder ()

    Puede agregar varios bordes a una imagen usando el método copyMakeBorder() de la clase denominada Core, que pertenece al paquete org.opencv.core. A continuación se muestra la sintaxis de este método.

    copyMakeBorder(src, dst, top, bottom, left, right, borderType)

    Este método acepta los siguientes parámetros:

    • src - Un objeto de la clase Mat que representa la imagen de origen (entrada).

    • dst - Un objeto de la clase Mat que representa la imagen de destino (salida).

    • top - Una variable de entero del tipo entero que representa la longitud del borde en la parte superior de la imagen.

    • bottom - Una variable de entero del tipo entero que representa la longitud del borde en la parte inferior de la imagen.

    • left - Una variable de entero del tipo entero que representa la longitud del borde a la izquierda de la imagen.

    • right - Una variable de entero del tipo entero que representa la longitud del borde a la derecha de la imagen.

    • borderType - Una variable de tipo entero que representa el tipo de borde que se va a utilizar.

    Ejemplo

    El siguiente programa es un ejemplo que demuestra cómo agregar un borde a una imagen determinada.

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.imgcodecs.Imgcodecs;
    
    public class AddingBorder {
       public static void main( String[] args ) {
          // Loading the OpenCV core library
          System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
          // Reading the Image from the file and storing it in to a Matrix object
          String file ="E:/OpenCV/chap15/input.jpg";
          Mat src = Imgcodecs.imread(file);
    
          // Creating an empty matrix to store the result
          Mat dst = new Mat();
       
          Core.copyMakeBorder(src, dst, 20, 20, 20, 20, Core.BORDER_CONSTANT);
          Imgcodecs.imwrite("E:/OpenCV/chap15/border_constant.jpg", dst);
    
          System.out.println("Image Processed");
       }
    }

    Suponga que la siguiente es la imagen de entrada thresh_input.jpg especificado en el programa anterior.

    Salida

    Al ejecutar el programa, obtendrá el siguiente resultado:

    Image Processed

    Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

    Otros tipos de fronteras

    Además del tipo de borde, BORDER_CONSTANTComo se demostró en el ejemplo anterior, OpenCV se adapta a otros tipos de fronteras. Todos estos tipos están representados por campos estáticos predefinidos (valores fijos) de clase Core.

    Puede elegir el tipo de operación de umbral que necesita, pasando su valor predefinido respectivo al parámetro denominado borderType del copyMakeBorder() método.

    Core.copyMakeBorder(src, dst, 20, 20, 20, 20, Core.BORDER_CONSTANT);

    A continuación se muestran los valores que representan varios tipos de operaciones fronterizas y sus respectivos resultados.

    Operación y descripción Salida
    BORDER_CONSTANT
    BORDER_ISOLATED
    BORDER_DEFAULT
    BORDER_REFLECT
    BORDER_REFLECT_101
    BORDER_REFLECT101
    BORDER_REPLICATE
    BORDER_WRAP

    Utilizando el sobel operation, puede detectar los bordes de una imagen tanto en dirección horizontal como vertical. Puede aplicar la operación de sobel en una imagen usando el métodosobel(). A continuación se muestra la sintaxis de este método:

    Sobel(src, dst, ddepth, dx, dy)

    Este método acepta los siguientes parámetros:

    • src - Un objeto de la clase Mat que representa la imagen de origen (entrada).

    • dst - Un objeto de la clase Mat que representa la imagen de destino (salida).

    • ddepth - Una variable entera que representa la profundidad de la imagen (-1)

    • dx- Una variable entera que representa la derivada x. (0 o 1)

    • dy- Una variable entera que representa la derivada y. (0 o 1)

    Ejemplo

    El siguiente programa demuestra cómo realizar la operación Sobel en una imagen determinada.

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    
    public class SobelTest {
       public static void main(String args[]) {
          // Loading the OpenCV core library
          System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    
          // Reading the Image from the file and storing it in to a Matrix object
          String file ="E:/OpenCV/chap16/sobel_input.jpg";
          Mat src = Imgcodecs.imread(file);
    
          // Creating an empty matrix to store the result
          Mat dst = new Mat();
    
          // Applying sobel on the Image
          Imgproc.Sobel(src, dst, -1, 1, 1);
    
          // Writing the image
          Imgcodecs.imwrite("E:/OpenCV/chap16/sobel_output.jpg", dst);
    
          System.out.println("Image processed");
       }
    }

    Suponga que la siguiente es la imagen de entrada sobel_input.jpg especificado en el programa anterior.

    Salida

    Al ejecutar el programa, obtendrá el siguiente resultado:

    Image Processed

    Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

    Variantes sobel

    Al pasar diferentes valores al último a los parámetros (dx y dy) (entre 0 y 1), obtendrá diferentes salidas:

    // Applying sobel on the Image
    Imgproc.Sobel(src, dst, -1, 1, 1);

    La siguiente tabla enumera varios valores para las variables dx y dy del método Sobel() y sus respectivos productos.

    Derivado X Derivado de Y Salida
    0 1
    1 0
    1 1

    Scharr también se utiliza para detectar las segundas derivadas de una imagen en direcciones horizontal y vertical. Puede realizar la operación Scharr en una imagen utilizando el métodoscharr(). A continuación se muestra la sintaxis de este método:

    Scharr(src, dst, ddepth, dx, dy)

    Este método acepta los siguientes parámetros:

    • src - Un objeto de la clase Mat que representa la imagen de origen (entrada).

    • dst - Un objeto de la clase Mat que representa la imagen de destino (salida).

    • ddepth - Una variable entera que representa la profundidad de la imagen (-1)

    • dx- Una variable entera que representa la derivada x. (0 o 1)

    • dy- Una variable entera que representa la derivada y. (0 o 1)

    Ejemplo

    El siguiente programa demuestra cómo aplicar scharr a una imagen determinada.

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    
    public class ScharrTest {
    
       public static void main( String[] args ) {
    
          // Loading the OpenCV core library
          System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
    
          // Reading the Image from the file and storing it in to a Matrix object
          String file ="E:/OpenCV/chap16/sobel_input.jpg";
          Mat src = Imgcodecs.imread(file);
    
          // Creating an empty matrix to store the result
          Mat dst = new Mat();
    
          // Applying Box Filter effect on the Image
          Imgproc.Scharr(src, dst, Imgproc.CV_SCHARR, 0, 1);
    
          // Writing the image
          Imgcodecs.imwrite("E:/OpenCV/chap16/scharr_output.jpg", dst);
    
          System.out.println("Image processed");
       }
    }

    Suponga que la siguiente es la imagen de entrada scharr_input.jpg especificado en el programa anterior.

    Salida

    Al ejecutarlo, obtendrá el siguiente resultado:

    Image Processed

    Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

    Más derivados de scharr

    Al pasar diferentes valores al último a los parámetros (dx y dy) (entre 0 y 1) obtendrá diferentes salidas:

    // Applying scharr on the Image
    Imgproc.Scharr(src, dst, -1, 1, 1);

    A continuación se muestra una tabla que enumera varios valores para las variables dx y dy del método scharr() y sus respectivos productos.

    Derivado X Derivado de Y Salida
    0 1
    1 0

    El operador laplaciano es también un operador derivado que se utiliza para encontrar bordes en una imagen. Es una máscara derivada de segundo orden. En esta máscara tenemos dos clasificaciones más, una es Operador Laplaciano Positivo y otra es Operador Laplaciano Negativo.

    A diferencia de otros operadores, Laplacian no eliminó los bordes en ninguna dirección en particular, sino que eliminó los bordes en la siguiente clasificación.

    • Bordes hacia adentro
    • Bordes exteriores

    Puedes realizar Laplacian Transform operación en una imagen usando el Laplacian() método del imgproc class, a continuación se muestra la sintaxis de este método.

    Laplacian(src, dst, ddepth)

    Este método acepta los siguientes parámetros:

    • src - A Mat objeto que representa la fuente (imagen de entrada) para esta operación.

    • dst - A Mat objeto que representa el destino (imagen de salida) para esta operación.

    • ddepth - Una variable de tipo entero que representa la profundidad de la imagen de destino.

    Ejemplo

    El siguiente programa demuestra cómo realizar la operación de transformación de Laplace en una imagen dada.

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    
    public class LaplacianTest {
       public static void main(String args[]) {
          // Loading the OpenCV core library
          System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    
          //Reading the Image from the file and storing it in to a Matrix object
          String file ="E:/OpenCV/chap18/laplacian_input.jpg";
          Mat src = Imgcodecs.imread(file);
    
          // Creating an empty matrix to store the result
          Mat dst = new Mat();
    
          // Applying GaussianBlur on the Image
          Imgproc.Laplacian(src, dst, 10);
    
          // Writing the image
          Imgcodecs.imwrite("E:/OpenCV/chap18/laplacian.jpg", dst);
    
          System.out.println("Image Processed");
       }
    }

    Suponga que la siguiente es la imagen de entrada laplacian_input.jpg especificado en el programa anterior.

    Salida

    Al ejecutar el programa, obtendrá el siguiente resultado:

    Image Processed

    Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

    los distance transformEl operador generalmente toma imágenes binarias como entradas. En esta operación, las intensidades del nivel de gris de los puntos dentro de las regiones de primer plano se cambian para distanciar sus respectivas distancias del valor 0 más cercano (límite).

    Puede aplicar la transformación de distancia en OpenCV usando el método distanceTransform(). A continuación se muestra la sintaxis de este método.

    distanceTransform(src, dst, distanceType, maskSize)

    Este método acepta los siguientes parámetros:

    • src - Un objeto de la clase Mat que representa la imagen de origen (entrada).

    • dst - Un objeto de la clase Mat que representa la imagen de destino (salida).

    • distanceType - Una variable de tipo entero que representa el tipo de transformación de distancia que se aplicará.

    • maskSize - Una variable de tipo entero que representa el tamaño de la máscara que se utilizará.

    Ejemplo

    El siguiente programa demuestra cómo realizar la operación de transformación de distancia en una imagen dada.

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    
    public class DistanceTransform {
       public static void main(String args[]) {
          // Loading the OpenCV core library
          System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
    
          // Reading the Image from the file and storing it in to a Matrix object
          String file ="E:/OpenCV/chap19/input.jpg";
          Mat src = Imgcodecs.imread(file,0);
    
          // Creating an empty matrix to store the results
          Mat dst = new Mat();
          Mat binary = new Mat();
    
          // Converting the grayscale image to binary image
          Imgproc.threshold(src, binary, 100, 255, Imgproc.THRESH_BINARY);
    
          // Applying distance transform
          Imgproc.distanceTransform(mat, dst, Imgproc.DIST_C, 3);
    
          // Writing the image
          Imgcodecs.imwrite("E:/OpenCV/chap19/distnceTransform.jpg", dst);
    
          System.out.println("Image Processed");
       }
    }

Suponga que la siguiente es la imagen de entrada input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

Tipos de operaciones de transformación de distancia

Además del tipo de operación a distancia DIST_CComo se demostró en el ejemplo anterior, OpenCV ofrece otros tipos de operaciones de transformación de distancia. Todos estos tipos están representados por campos estáticos predefinidos (valores fijos) de la clase Imgproc.

Puede elegir el tipo de operación de transformación de distancia que necesita, pasando su valor predefinido respectivo al parámetro denominado distanceType del distanceTransform() método.

// Applying distance transform 
Imgproc.distanceTransform(mat, dst, Imgproc.DIST_C, 3);

A continuación se muestran los valores que representan varios tipos de distanceTransform operaciones y sus respectivos productos.

Operación y descripción Salida
DIST_C
DIST_L1
DIST_L2
DIST_LABEL_PIXEL
DIST_MASK_3

En este capítulo, aprenderemos cómo usar OpenCV para capturar cuadros usando la cámara del sistema. losVideoCapture clase de la org.opencv.videoioEl paquete contiene clases y métodos para capturar video usando la cámara. Vayamos paso a paso y aprendamos a capturar fotogramas:

Paso 1: Cargue la biblioteca nativa de OpenCV

Mientras escribe código Java usando la biblioteca OpenCV, el primer paso que debe hacer es cargar la biblioteca nativa de OpenCV usando el loadLibrary(). Cargue la biblioteca nativa de OpenCV como se muestra a continuación.

// Loading the core library 
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Paso 2: crear una instancia de la clase de captura de video

Cree una instancia de la clase Mat utilizando cualquiera de las funciones mencionadas anteriormente en este tutorial.

// Instantiating the VideoCapture class (camera:: 0) 
VideoCapture capture = new VideoCapture(0);

Paso 3: lee los marcos

Puede leer los fotogramas de la cámara utilizando el read() método del VideoCaptureclase. Este método acepta un objeto de la clase.Mat para almacenar el marco leído.

// Reading the next video frame from the camera 
Mat matrix = new Mat(); 
capture.read(matrix);

Ejemplo

El siguiente programa demuestra cómo capturar un fotograma usando la cámara y mostrarlo usando la ventana JavaFX. También guarda el fotograma capturado.

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;

import java.io.FileNotFoundException;
import java.io.IOException;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;

public class CameraSnapshotJavaFX extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws FileNotFoundException, IOException {
      // Capturing the snapshot from the camera
      CameraSnapshotJavaFX obj = new CameraSnapshotJavaFX();
      WritableImage writableImage = obj.capureSnapShot();

      // Saving the image
      obj.saveImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Capturing an image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage capureSnapShot() {
      WritableImage WritableImage = null;

      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Instantiating the VideoCapture class (camera:: 0)
      VideoCapture capture = new VideoCapture(0);

      // Reading the next video frame from the camera
      Mat matrix = new Mat();
      capture.read(matrix);

      // If camera is opened
      if( capture.isOpened()) {
         // If there is next video frame
         if (capture.read(matrix)) {
            // Creating BuffredImage from the matrix
            BufferedImage image = new BufferedImage(matrix.width(), 
               matrix.height(), BufferedImage.TYPE_3BYTE_BGR);
            
            WritableRaster raster = image.getRaster();
            DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();
            byte[] data = dataBuffer.getData();
            matrix.get(0, 0, data);
            this.matrix = matrix;
            
            // Creating the Writable Image
            WritableImage = SwingFXUtils.toFXImage(image, null);
         }
      }
      return WritableImage;
   }
   public void saveImage() {
      // Saving the Image
      String file = "E:/OpenCV/chap22/sanpshot.jpg";

      // Instantiating the imgcodecs class
      Imgcodecs imageCodecs = new Imgcodecs();

      // Saving it again 
      imageCodecs.imwrite(file, matrix);
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Salida

Al ejecutar el programa, obtendrá el siguiente resultado.

Si abre la ruta especificada, puede observar el mismo marco que se guarda como un archivo jpg.

los VideoCapture clase de la org.opencv.videoioEl paquete contiene clases y métodos para capturar video usando la cámara del sistema. Vayamos paso a paso y aprendamos a hacerlo.

Paso 1: Cargue la biblioteca nativa de OpenCV

Mientras escribe código Java usando la biblioteca OpenCV, el primer paso que debe hacer es cargar la biblioteca nativa de OpenCV usando el loadLibrary(). Cargue la biblioteca nativa de OpenCV como se muestra a continuación.

// Loading the core library 
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Paso 2: crear una instancia de la clase CascadeClassifier

los CascadeClassifier clase del paquete org.opencv.objdetectse utiliza para cargar el archivo clasificador. Cree una instancia de esta clase pasando elxml archivo lbpcascade_frontalface.xml Como se muestra abajo.

// Instantiating the CascadeClassifier 
String xmlFile = "E:/OpenCV/facedetect/lbpcascade_frontalface.xml"; 
CascadeClassifier classifier = new CascadeClassifier(xmlFile);

Paso 3: detecta las caras

Puede detectar las caras en la imagen usando el método detectMultiScale() de la clase nombrada CascadeClassifier. Este método acepta un objeto de la clase.Mat sosteniendo la imagen de entrada y un objeto de la clase MatOfRect para almacenar los rostros detectados.

// Detecting the face in the snap 
MatOfRect faceDetections = new MatOfRect(); 
classifier.detectMultiScale(src, faceDetections);

Ejemplo

El siguiente programa demuestra cómo detectar caras en una imagen.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
  
public class FaceDetectionImage {
   public static void main (String[] args) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap23/facedetection_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Instantiating the CascadeClassifier
      String xmlFile = "E:/OpenCV/facedetect/lbpcascade_frontalface.xml";
      CascadeClassifier classifier = new CascadeClassifier(xmlFile);

      // Detecting the face in the snap
      MatOfRect faceDetections = new MatOfRect();
      classifier.detectMultiScale(src, faceDetections);
      System.out.println(String.format("Detected %s faces", 
         faceDetections.toArray().length));

      // Drawing boxes for (Rect rect : faceDetections.toArray()) { Imgproc.rectangle( src, // where to draw the box new Point(rect.x, rect.y), // bottom left new Point(rect.x + rect.width, rect.y + rect.height), // top right new Scalar(0, 0, 255), 3 // RGB colour );
      }

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap23/facedetect_output1.jpg", src);

      System.out.println("Image Processed");
   }
}

Suponga que la siguiente es la imagen de entrada facedetection_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Detected 3 faces 
Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

El siguiente programa demuestra cómo detectar rostros usando la cámara del sistema y mostrarlo usando la ventana JavaFX.

Ejemplo

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;

import java.io.FileNotFoundException;
import java.io.IOException;

import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.videoio.VideoCapture;

public class faceDetectionJavaFXX extends Application {
   Mat matrix = null;

   @Override
   public void start(Stage stage) throws FileNotFoundException, IOException {
      // Capturing the snapshot from the camera
      faceDetectionJavaFXX obj = new faceDetectionJavaFXX();
      WritableImage writableImage = obj.capureFrame();

      // Saving the image
      obj.saveImage();

      // Setting the image view
      ImageView imageView = new ImageView(writableImage);

      // setting the fit height and width of the image view
      imageView.setFitHeight(400);
      imageView.setFitWidth(600);

      // Setting the preserve ratio of the image view
      imageView.setPreserveRatio(true);

      // Creating a Group object
      Group root = new Group(imageView);

      // Creating a scene object
      Scene scene = new Scene(root, 600, 400);

      // Setting title to the Stage
      stage.setTitle("Capturing an image");

      // Adding scene to the stage
      stage.setScene(scene);

      // Displaying the contents of the stage
      stage.show();
   }
   public WritableImage capureFrame() {
      WritableImage writableImage = null;

      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Instantiating the VideoCapture class (camera:: 0)
      VideoCapture capture = new VideoCapture(0);

      // Reading the next video frame from the camera
      Mat matrix = new Mat();
      capture.read(matrix);

      // If camera is opened
      if(!capture.isOpened()) {
         System.out.println("camera not detected");
      } else
         System.out.println("Camera detected ");
           
      // If there is next video frame
      if (capture.read(matrix)) {
         /////// Detecting the face in the snap /////
         String file = "E:/OpenCV/facedetect/lbpcascade_frontalface.xml";
         CascadeClassifier classifier = new CascadeClassifier(file);

         MatOfRect faceDetections = new MatOfRect();
         classifier.detectMultiScale(matrix, faceDetections);
         System.out.println(String.format("Detected %s faces",
            faceDetections.toArray().length));

         // Drawing boxes for (Rect rect : faceDetections.toArray()) { Imgproc.rectangle( matrix, //where to draw the box new Point(rect.x, rect.y), //bottom left new Point(rect.x + rect.width, rect.y + rect.height), //top right new Scalar(0, 0, 255) //RGB colour );
         }
         // Creating BuffredImage from the matrix
         BufferedImage image = new BufferedImage(matrix.width(), matrix.height(),
            BufferedImage.TYPE_3BYTE_BGR);
         
         WritableRaster raster = image.getRaster();
         DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();
         byte[] data = dataBuffer.getData();
         matrix.get(0, 0, data);

         this.matrix = matrix;
           
         // Creating the Writable Image
         writableImage = SwingFXUtils.toFXImage(image, null);
      }
      return writableImage;
   }
   public void saveImage() {
      // Saving the Image
      String file = "E:/OpenCV/chap23/facedetected.jpg";

      // Instantiating the imagecodecs class
      Imgcodecs imageCodecs = new Imgcodecs();

      // Saving it again
      imageCodecs.imwrite(file, matrix);
   }
   public static void main(String args[]) {
      launch(args);
   }
}

Salida

Al ejecutar el programa, obtendrá el siguiente resultado.

Si abre la ruta especificada, puede ver la misma instantánea guardada como un jpg imagen.

Puedes realizar affine translation en una imagen usando el warpAffine()método de la clase imgproc. A continuación se muestra la sintaxis de este método:

Imgproc.warpAffine(src, dst, tranformMatrix, size);

Este método acepta los siguientes parámetros:

  • src - A Mat objeto que representa la fuente (imagen de entrada) para esta operación.

  • dst - A Mat objeto que representa el destino (imagen de salida) para esta operación.

  • tranformMatrix - A Mat objeto que representa la matriz de transformación.

  • size - Una variable de tipo entero que representa el tamaño de la imagen de salida.

Ejemplo

El siguiente programa demuestra cómo aplicar una operación afín en una imagen determinada.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class AffineTranslation {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap24/transform_input.jpg";
      Mat src = Imgcodecs.imread(file);

      //Creating an empty matrix to store the result
      Mat dst = new Mat();

      Point p1 = new Point( 0,0 );
      Point p2 = new Point( src.cols() - 1, 0 );
      Point p3 = new Point( 0, src.rows() - 1 );
      Point p4 = new Point( src.cols()*0.0, src.rows()*0.33 );
      Point p5 = new Point( src.cols()*0.85, src.rows()*0.25 );
      Point p6 = new Point( src.cols()*0.15, src.rows()*0.7 );
      
      MatOfPoint2f ma1 = new MatOfPoint2f(p1,p2,p3);
      MatOfPoint2f ma2 = new MatOfPoint2f(p4,p5,p6);

      // Creating the transformation matrix
      Mat tranformMatrix = Imgproc.getAffineTransform(ma1,ma2);

      // Creating object of the class Size
      Size size = new Size(src.cols(), src.cols());

      // Applying Wrap Affine
      Imgproc.warpAffine(src, dst, tranformMatrix, size);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap24/Affinetranslate.jpg", dst);

      System.out.println("Image Processed");
   }
}

Suponga que la siguiente es la imagen de entrada transform_input.jpg especificado en el programa anterior.

Salida

Al ejecutarlo, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

Usted puede perform rotation operación en una imagen usando el warpAffine() método del imgprocclase. A continuación se muestra la sintaxis de este método:

Imgproc.warpAffine(src, dst, rotationMatrix, size);

Este método acepta los siguientes parámetros:

  • src - A Mat objeto que representa la fuente (imagen de entrada) para esta operación.

  • dst - A Mat objeto que representa el destino (imagen de salida) para esta operación.

  • rotationMatrix - A Mat objeto que representa la matriz de rotación.

  • size - Una variable de tipo entero que representa el tamaño de la imagen de salida.

Ejemplo

El siguiente programa demuestra cómo rotar una imagen.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Rotation {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap24/transform_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating a Point object
      Point point = new Point(300, 200)

      // Creating the transformation matrix M
      Mat rotationMatrix = Imgproc.getRotationMatrix2D(point, 30, 1);

      // Creating the object of the class Size
      Size size = new Size(src.cols(), src.cols());

      // Rotating the given image
      Imgproc.warpAffine(src, dst, rotationMatrix, size);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap24/rotate_output.jpg", dst);

      System.out.println("Image Processed");
   }
}

Suponga que la siguiente es la imagen de entrada transform_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

Puedes realizar scaling en una imagen usando el resize() método del imgprocclase. A continuación se muestra la sintaxis de este método.

resize(Mat src, Mat dst, Size dsize, double fx, double fy, int interpolation)

Este método acepta los siguientes parámetros:

  • src - A Mat objeto que representa la fuente (imagen de entrada) para esta operación.

  • dst - A Mat objeto que representa el destino (imagen de salida) para esta operación.

  • dsize - A Size objeto que representa el tamaño de la imagen de salida.

  • fx - Una variable del tipo double que representa el factor de escala a lo largo del eje horizontal.

  • fy - Una variable del tipo double que representa el factor de escala a lo largo del eje vertical.

  • Interpolation - Una variable entera que representa el método de interpolación.

Ejemplo

El siguiente programa demuestra cómo aplicar scale transformation a una imagen.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Scaling {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap24/transform_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Creating the Size object
      Size size = new Size(src.rows()*2, src.rows()*2);

      // Scaling the Image
      Imgproc.resize(src, dst, size, 0, 0, Imgproc.INTER_AREA);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap24/scale_output.jpg", dst);

      System.out.println("Image Processed");
   }
}

Suponga que la siguiente es la imagen de entrada transform_input.jpg especificado en el programa anterior (tamaño - Ancho: 300px y alto: 300px).

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera (tamaño - Ancho: 600px y alto: 600px) -

En OpenCV, puede aplicar diferentes mapas de color a una imagen usando el método applyColorMap() de la clase Imgproc. A continuación se muestra la sintaxis de este método:

applyColorMap(Mat src, Mat dst, int colormap)

Acepta tres parámetros:

  • src - Un objeto de la clase Mat que representa la imagen de origen (entrada).

  • dst - Un objeto de la clase Mat que representa la imagen de destino (salida).

  • colormap - Una variable de tipo entero que representa el tipo de mapa de color que se aplicará.

Ejemplo

El siguiente programa demuestra cómo aplicar color map a una imagen.

import org.opencv.core.Core;
import org.opencv.core.Mat;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class ColorMapTest {
   public static void main(String args[]) {
      // Loading the OpenCV core library
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap25/color_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat dst = new Mat();

      // Applying color map to an image
      Imgproc.applyColorMap(src, dst, Imgproc.COLORMAP_HOT);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap25/colormap_hot.jpg", dst);
      System.out.println("Image processed");
   }
}

Suponga que la siguiente es la imagen de entrada color_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa anterior, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

Más operaciones

Además de COLORMAP_HOTComo se demostró en el ejemplo anterior, OpenCV ofrece otros tipos de mapas de color. Todos estos tipos están representados por campos estáticos predefinidos (valores fijos) de la clase Imgproc.

Puede elegir el tipo de mapa de colores que necesita, pasando su respectivo valor predefinido al parámetro denominado colormap del applyColorMap() método.

Imgproc.applyColorMap(src, dst, Imgproc.COLORMAP_HOT);

A continuación se muestran los valores que representan varios tipos de mapas de color y sus respectivos resultados.

Operación y descripción Salida
COLORMAP_AUTUMN
COLORMAP_BONE
COLORMAP_COOL
COLORMAP_HOT
COLORMAP_HSV
COLORMAP_JET
COLORMAP_OCEAN
COLORMAP_PARULA
COLORMAP_PINK
COLORMAP_RAINBOW
COLORMAP_SPRING
COLORMAP_SUMMER
COLORMAP_WINTER

Canny Edge Detection se utiliza para detectar los bordes en una imagen. Acepta una imagen en escala de grises como entrada y utiliza un algoritmo de varias etapas.

Puede realizar esta operación en una imagen utilizando el Canny() método del imgproc class, a continuación se muestra la sintaxis de este método.

Canny(image, edges, threshold1, threshold2)

Este método acepta los siguientes parámetros:

  • image - A Mat objeto que representa la fuente (imagen de entrada) para esta operación.

  • edges - A Mat objeto que representa el destino (bordes) de esta operación.

  • threshold1 - Una variable del tipo double que representa el primer umbral para el procedimiento de histéresis.

  • threshold2 - Una variable del tipo double que representa el segundo umbral del procedimiento de histéresis.

Ejemplo

El siguiente programa es un ejemplo que demuestra cómo realizar la operación Canny Edge Detection en una imagen determinada.

import org.opencv.core.Core;
import org.opencv.core.Mat;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class CannyEdgeDetection {
   public static void main(String args[]) throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

      // Reading the Image from the file and storing it in to a Matrix object
      String file = "E:/OpenCV/chap17/canny_input.jpg";

      // Reading the image
      Mat src = Imgcodecs.imread(file);

      // Creating an empty matrix to store the result
      Mat gray = new Mat();

      // Converting the image from color to Gray
      Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
      Mat edges = new Mat();

      // Detecting the edges
      Imgproc.Canny(gray, edges, 60, 60*3);

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap17/canny_output.jpg", edges);
      System.out.println("Image Loaded");
   } 
}

Suponga que la siguiente es la imagen de entrada canny_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa anterior, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

Puede detectar la forma de una imagen determinada aplicando el Hough Transform technique usando el método HoughLines() del Imgprocclase. A continuación se muestra la sintaxis de este método.

HoughLines(image, lines, rho, theta, threshold)

Este método acepta los siguientes parámetros:

  • image - Un objeto de la clase Mat que representa la imagen de origen (entrada).

  • lines - Un objeto de la clase Mat que almacena el vector que almacena los parámetros (r, Φ) de las líneas.

  • rho - Una variable de tipo double que representa la resolución del parámetro r en píxeles.

  • theta - Una variable de tipo double que representa la resolución del parámetro Φ en radianes.

  • threshold - Una variable de tipo entero que representa el número mínimo de intersecciones para "detectar" una línea.

Ejemplo

El siguiente programa demuestra cómo detectar líneas Hough en una imagen determinada.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class HoughlinesTest {
   public static void main(String args[]) throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file = "E:/OpenCV/chap21/hough_input.jpg";

      // Reading the image
      Mat src = Imgcodecs.imread(file,0);

      // Detecting edges of it
      Mat canny = new Mat();
      Imgproc.Canny(src, canny, 50, 200, 3, false);

      // Changing the color of the canny
      Mat cannyColor = new Mat();
      Imgproc.cvtColor(canny, cannyColor, Imgproc.COLOR_GRAY2BGR);

      // Detecting the hough lines from (canny)
      Mat lines = new Mat();
      Imgproc.HoughLines(canny, lines, 1, Math.PI/180, 100);

      System.out.println(lines.rows());
      System.out.println(lines.cols());

      // Drawing lines on the image
      double[] data;
      double rho, theta;
      Point pt1 = new Point();
      Point pt2 = new Point();
      double a, b;
      double x0, y0;
      
      for (int i = 0; i < lines.cols(); i++) {
         data = lines.get(0, i);
         rho = data[0];
         theta = data[1];
         
         a = Math.cos(theta);
         b = Math.sin(theta);
         x0 = a*rho;
         y0 = b*rho;
         
         pt1.x = Math.round(x0 + 1000*(-b));
         pt1.y = Math.round(y0 + 1000*(a));
         pt2.x = Math.round(x0 - 1000*(-b));
         pt2.y = Math.round(y0 - 1000 *(a));
         Imgproc.line(cannyColor, pt1, pt2, new Scalar(0, 0, 255), 6);
      }
      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap21/hough_output.jpg", cannyColor);
          
      System.out.println("Image Processed");
   }
}

Suponga que la siguiente es la imagen de entrada hough_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

143 
1 
Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera:

los histogramde una imagen muestra la frecuencia de los valores de intensidad de los píxeles. En un histograma de imagen, el eje X muestra las intensidades del nivel de gris y el eje Y muestra la frecuencia de estas intensidades.

Histogram equalizationmejora el contraste de una imagen para ampliar el rango de intensidad. Puede ecualizar el histograma de una imagen determinada utilizando el métodoequalizeHist() del Imgprocclase. A continuación se muestra la sintaxis de este método.

equalizeHist(src, dst)

Este método acepta los siguientes parámetros:

  • src - Un objeto de la clase Mat que representa la imagen de origen (entrada).

  • dst - Un objeto de la clase Matque representa la salida. (Imagen obtenida tras ecualizar el histograma)

Ejemplo

El siguiente programa demuestra cómo ecualizar el histograma de una imagen dada.

import java.util.ArrayList;
import java.util.List;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class HistoTest {
   public static void main (String[] args) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap20/histo_input.jpg";

      // Load the image
      Mat img = Imgcodecs.imread(file);

      // Creating an empty matrix
      Mat equ = new Mat();
      img.copyTo(equ);

      // Applying blur
      Imgproc.blur(equ, equ, new Size(3, 3));

      // Applying color
      Imgproc.cvtColor(equ, equ, Imgproc.COLOR_BGR2YCrCb);
      List<Mat> channels = new ArrayList<Mat>();

      // Splitting the channels
      Core.split(equ, channels);

      // Equalizing the histogram of the image
      Imgproc.equalizeHist(channels.get(0), channels.get(0));
      Core.merge(channels, equ);
      Imgproc.cvtColor(equ, equ, Imgproc.COLOR_YCrCb2BGR);

      Mat gray = new Mat();
      Imgproc.cvtColor(equ, gray, Imgproc.COLOR_BGR2GRAY);
      Mat grayOrig = new Mat();
      Imgproc.cvtColor(img, grayOrig, Imgproc.COLOR_BGR2GRAY);

      Imgcodecs.imwrite("E:/OpenCV/chap20/histo_output.jpg", equ);
      System.out.println("Image Processed");
   }
}

Suponga que la siguiente es la imagen de entrada histo_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera: