OpenCV - Interface graphique
Dans les chapitres précédents, nous avons expliqué comment lire et enregistrer une image à l'aide de la bibliothèque Java OpenCV. En plus de cela, nous pouvons également afficher les images chargées dans une fenêtre séparée à l'aide de bibliothèques d'interface graphique telles que AWT / Swings et JavaFX.
Conversion d'un tapis en image tamponnée
Pour lire une image, nous utilisons la méthode imread(). Cette méthode renvoie l'image lue sous la forme deMatrix. Mais, pour utiliser cette image avec des bibliothèques GUI (AWT / Swings et JavaFX), elle doit être convertie en objet de la classeBufferedImage du forfait java.awt.image.BufferedImage.
Voici les étapes pour convertir un Mat objet d'OpenCV à BufferedImage objet.
Étape 1: encodez le Mat en MatOfByte
Tout d'abord, vous devez convertir la matrice en matrice d'octet. Vous pouvez le faire en utilisant la méthodeimencode() de la classe Imgcodecs. Voici la syntaxe de cette méthode.
imencode(ext, image, matOfByte);
Cette méthode accepte les paramètres suivants -
Ext - Un paramètre String spécifiant le format de l'image (.jpg, .png, etc.)
image - Un objet Mat de l'image
matOfByte - Un objet vide de la classe MatOfByte
Encodez l'image en utilisant cette méthode comme indiqué ci-dessous.
//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);
Étape 2: Convertissez l'objet MatOfByte en tableau d'octets
Convertissez le MatOfByte objet dans un tableau d'octets à l'aide de la méthode toArray().
byte[] byteArray = matOfByte.toArray();
Étape 3: préparation de l'objet InputStream
Préparez l'objet InputStream en passant le tableau d'octets créé à l'étape précédente au constructeur du ByteArrayInputStream classe.
//Preparing the InputStream object
InputStream in = new ByteArrayInputStream(byteArray);
Étape 4: préparation de l'objet InputStream
Passez l'objet Input Stream créé à l'étape précédente au read() méthode de la ImageIOclasse. Cela renverra un objet BufferedImage.
//Preparing the BufferedImage
BufferedImage bufImage = ImageIO.read(in);
Affichage de l'image à l'aide d'AWT / Swings
Pour afficher une image à l'aide du cadre AWT / Swings, tout d'abord, lisez une image à l'aide du imread() méthode et convertissez-la en BufferedImage en suivant les étapes mentionnées ci-dessus.
Ensuite, instanciez le JFrame et ajoutez l'image mise en mémoire tampon créée au ContentPane du JFrame, comme indiqué ci-dessous -
//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
Le code de programme suivant montre comment vous pouvez read une image et display à travers la fenêtre pivotante en utilisant la bibliothèque 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");
}
}
Lors de l'exécution du programme ci-dessus, vous obtiendrez la sortie suivante -
Image Loaded
En plus de cela, vous pouvez voir une fenêtre affichant l'image chargée, comme suit -
Affichage de l'image à l'aide de JavaFX
Pour afficher une image à l'aide de JavaFX, tout d'abord, lisez une image à l'aide du imread() méthode et convertissez-la en BufferedImage. Ensuite, convertissez BufferedImage en WritableImage, comme illustré ci-dessous.
WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
Passe ça WritableImage objet au constructeur du ImageView classe.
ImageView imageView = new ImageView(writableImage);
Example
Le code de programme suivant montre comment read une image et display via la fenêtre JavaFX en utilisant la bibliothèque 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);
}
}
Lors de l'exécution du programme ci-dessus, vous obtiendrez la sortie suivante -
Image Loaded
En plus de cela, vous pouvez voir une fenêtre affichant l'image chargée, comme suit -