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 -