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 -