OpenCV - GUI
Nei capitoli precedenti, abbiamo discusso come leggere e salvare un'immagine utilizzando la libreria Java OpenCV. Oltre a ciò, possiamo anche visualizzare le immagini caricate in una finestra separata utilizzando le librerie GUI come AWT / Swings e JavaFX.
Conversione di mat in immagine tamponata
Per leggere un'immagine usiamo il metodo imread(). Questo metodo restituisce l'immagine letta sotto forma diMatrix. Ma, per utilizzare questa immagine con le librerie GUI (AWT / Swings e JavaFX), dovrebbe essere convertita come oggetto della classeBufferedImage del pacchetto java.awt.image.BufferedImage.
Di seguito sono riportati i passaggi per convertire un file Mat oggetto di OpenCV a BufferedImage oggetto.
Passaggio 1: codifica Mat in MatOfByte
Prima di tutto, devi convertire la matrice in matrice di byte. Puoi farlo usando il metodoimencode() della classe Imgcodecs. Di seguito è riportata la sintassi di questo metodo.
imencode(ext, image, matOfByte);
Questo metodo accetta i seguenti parametri:
Ext - Un parametro String che specifica il formato dell'immagine (.jpg, .png, ecc.)
image - Un oggetto Mat dell'immagine
matOfByte - Un oggetto vuoto della classe MatOfByte
Codifica l'immagine utilizzando questo metodo come mostrato di seguito.
//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);
Passaggio 2: converti l'oggetto MatOfByte in un array di byte
Converti il file MatOfByte oggetto in una matrice di byte utilizzando il metodo toArray().
byte[] byteArray = matOfByte.toArray();
Passaggio 3: preparazione dell'oggetto InputStream
Preparare l'oggetto InputStream passando la matrice di byte creata nel passaggio precedente al costruttore di ByteArrayInputStream classe.
//Preparing the InputStream object
InputStream in = new ByteArrayInputStream(byteArray);
Passaggio 4: preparazione dell'oggetto InputStream
Passare l'oggetto Input Stream creato nel passaggio precedente al file read() metodo del ImageIOclasse. Ciò restituirà un oggetto BufferedImage.
//Preparing the BufferedImage
BufferedImage bufImage = ImageIO.read(in);
Visualizzazione dell'immagine utilizzando AWT / Swings
Per visualizzare un'immagine utilizzando la cornice AWT / Swings, prima di tutto, leggi un'immagine utilizzando il imread() metodo e convertirlo in BufferedImage seguendo i passaggi sopra indicati.
Quindi, istanzia il file JFrame class e aggiungi l'immagine bufferizzata creata al ContentPane di JFrame, come mostrato di seguito -
//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
Il codice del programma seguente mostra come puoi farlo read un'immagine e display attraverso la finestra oscillante utilizzando la libreria 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");
}
}
Eseguendo il programma sopra, otterrai il seguente output:
Image Loaded
Oltre a ciò, puoi vedere una finestra che mostra l'immagine caricata, come segue:
Visualizzazione dell'immagine utilizzando JavaFX
Per visualizzare un'immagine utilizzando JavaFX, prima di tutto, leggi un'immagine utilizzando il imread() metodo e convertirlo in BufferedImage. Quindi, converti BufferedImage in WritableImage, come mostrato di seguito.
WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
Passa questo WritableImage oggetto al costruttore del file ImageView classe.
ImageView imageView = new ImageView(writableImage);
Example
Il codice di programma seguente mostra come read un'immagine e display attraverso la finestra JavaFX utilizzando la libreria 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);
}
}
Eseguendo il programma sopra, otterrai il seguente output:
Image Loaded
Oltre a ciò, puoi vedere una finestra che mostra l'immagine caricata, come segue: