OpenCV - Armazenamento de imagens

Para capturar uma imagem, usamos dispositivos como câmeras e scanners. Esses dispositivos registram valores numéricos da imagem (Ex: valores de pixel). OpenCV é uma biblioteca que processa as imagens digitais, portanto precisamos armazenar essas imagens para processamento.

o MatA classe da biblioteca OpenCV é usada para armazenar os valores de uma imagem. Ele representa uma matriz n-dimensional e é usado para armazenar dados de imagem em tons de cinza ou imagens coloridas, volumes de voxel, campos de vetor, nuvens de pontos, tensores, histogramas, etc.

Esta classe é composta por duas partes de dados: o header e um pointer

  • Header - Contém informações como tamanho, método usado para armazenamento e o endereço da matriz (tamanho constante).

  • Pointer - Armazena os valores de pixel da imagem (continua variando).

The Mat Class

A biblioteca OpenCV Java fornece a esta classe o mesmo nome (Mat) dentro do pacote org.opencv.core.

Construtores

A classe Mat da biblioteca OpenCV Java possui vários construtores, com os quais você pode construir o objeto Mat.

S.No Construtores e descrição
1

Mat()

Este é o construtor padrão sem parâmetros na maioria dos casos. Usamos isso como construtor para criar uma matriz vazia e passá-la para outros métodos OpenCV.

2

Mat(int rows, int cols, int type)

Este construtor aceita três parâmetros do tipo inteiro que representam o número de linhas e colunas em um array 2D e o tipo do array (que deve ser usado para armazenar dados).

3

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

Incluindo os parâmetros do anterior, este construtor aceita adicionalmente como parâmetro um objeto da classe Scalar.

4

Mat(Size size, int type)

Este construtor aceita dois parâmetros, um objeto que representa o tamanho da matriz e um inteiro que representa o tipo de array usado para armazenar os dados.

5

Mat(Size size, int type, Scalar s)

Incluindo os parâmetros do anterior, este construtor aceita adicionalmente como parâmetro um objeto da classe Scalar.

6

Mat(long addr)

7

Mat(Mat m, Range rowRange)

Este construtor aceita um objeto de outra matriz e um objeto da classe Range que representa o intervalo das linhas a serem utilizadas para criar uma nova matriz.

8

Mat(Mat m, Range rowRange, Range colRange)

Incluindo os parâmetros do anterior, este construtor aceita adicionalmente um objeto da classe. Intervalo que representa o intervalo da coluna.

9

Mat(Mat m, Rect roi)

Este construtor aceita dois objetos, um representando outra matriz e outro representando o Região Of Interest.

Note -

  • Tipo de matriz. Use CV_8UC1, ..., CV_64FC4 para criar matrizes de 1-4 canais ou CV_8UC (n), ..., CV_64FC (n) para criar matrizes de multicanais (até canais CV_CN_MAX).

  • O tipo das matrizes foram representados por vários campos da classe CvType que pertence ao pacote org.opencv.core.

Métodos e Descrição

A seguir estão alguns dos métodos fornecidos pela classe Mat.

S.No Métodos e Descrição
1

Mat col(int x)

Este método aceita um parâmetro inteiro que representa o índice de uma coluna e recupera e retorna essa coluna.

2

Mat row(int y)

Este método aceita um parâmetro inteiro que representa o índice de uma linha e recupera e retorna essa linha.

3

int cols()

Este método retorna o número de colunas na matriz.

4

int rows()

Este método retorna o número de linhas na matriz.

5

Mat setTo(Mat value)

Este método aceita um objeto da Mat digite e define os elementos da matriz com o valor especificado.

6

Mat setTo(Scalar s)

Este método aceita um objeto da Scalar digite e define os elementos da matriz com o valor especificado.

Criação e exibição da matriz

Nesta seção, vamos discutir nosso primeiro exemplo de OpenCV. Veremos como criar e exibir uma matriz OpenCV simples.

A seguir estão as etapas a serem seguidas para criar e exibir uma matriz em OpenCV.

Etapa 1: carregar a biblioteca nativa OpenCV

Ao escrever o código Java usando a biblioteca OpenCV, a primeira etapa que você precisa fazer é carregar a biblioteca nativa do OpenCV usando o loadLibrary(). Carregue a biblioteca nativa OpenCV conforme mostrado abaixo.

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

Etapa 2: instanciar a classe Mat

Instancie a classe Mat usando qualquer uma das funções mencionadas neste capítulo anteriormente.

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

Etapa 3: Preencher a matriz usando os métodos

Você pode recuperar linhas / colunas específicas de uma matriz passando valores de índice para os métodos row()/col().

E você pode definir valores para eles usando qualquer uma das variantes do 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

Você pode usar o seguinte código de programa para criar e exibir uma matriz simples em Java usando a 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()); 
   } 
}

Ao executar o programa acima, você obterá a seguinte saída -

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]

Carregando imagem usando JavaSE API

o BufferedImage classe do java.awt.image.BufferedImage pacote é usado para armazenar uma imagem e o ImageIO classe do pacote import javax.imageio fornece métodos para ler e gravar imagens.

Example

Você pode usar o seguinte código de programa para carregar e salvar imagens usando a 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");
   } 
}

Ao executar o programa acima, você obterá a seguinte saída -

image Saved

Se você abrir o caminho especificado, você pode observar a imagem salva da seguinte maneira -