[JAVA] Afficher l'image de type Mat sur l'interface graphique avec Swing

Aperçu

Affiche le résultat du traitement d'OpenCV sur l'interface graphique en utilisant Swing.

Qu'est-ce que le swing

Il s'agit d'une boîte à outils Java GUI et d'une extension d'AWT. L'interface graphique créée par Swing dessine avec son propre composant GUI sans s'appuyer sur le composant OS. L'avantage est qu'il peut être utilisé quel que soit l'environnement d'exécution. L'inconvénient est que le processus de fonctionnement est lent car il ne s'agit plus d'un composant du système d'exploitation.

Traitement des images dans Swing

BufferedImage est utilisé dans cet article pour afficher l'image sur le type Swing from Mat. BudderedImage est des données d'image avec un tampon accessible et se compose de ColorModel et Raster. Le nombre et le type de bandes dans le SampleModel de Raster doivent correspondre au nombre et au type requis pour que le ColorModel représente sa couleur et sa valeur alpha. Les coordonnées (0,0) sont dans le coin supérieur gauche. Par conséquent, Raster doit être minX = 0, minY = 0.

Étape de préparation

Présentez ce qui suit: ・ Environnement de développement Java ・ OpenCV3.1

Si vous le recherchez, vous verrez différentes pages d'explications en japonais, je vais donc l'omettre.

Méthode à mettre en œuvre

La partie traitement est la suivante.

Mat2Image


public static BufferedImage Mat2Image(Mat src) {

//Obtenez le nombre de canaux dans Mat src
	    int type = 0;
	    if (src.channels() == 1) {
	        type = BufferedImage.TYPE_BYTE_GRAY;
	    } else if (src.channels() == 3) {
	        type = BufferedImage.TYPE_3BYTE_BGR;
	    } else {
	        return null;
	    }
//Créez un nouveau type BufferedImage avec la largeur, la longueur et le nombre de canaux src.
	    BufferedImage image = new BufferedImage(src.width(), src.height(), type);
//Extraire le raster de la BufferedImage créée.
      WritableRaster raster = image.getRaster();
//Extrayez le tampon du raster extrait.
	    DataBufferByte Buf = (DataBufferByte) raster.getDataBuffer();
	    byte[] data = Buf.getData();
	    src.get(0, 0, data);

	    return image;
	}

Si vous appelez ceci et mettez .setIcon dans le libellé de Swing, il sera affiché.

SetIcon


    lblNewLabel = new JLabel();
    ImageIcon image = new ImageIcon(createAwtImage(src));
    lblNewLabel.setIcon(image);

Résultat d'exécution

lena.png

J'ai pu afficher l'image de type Mat lue par Imread sur l'interface graphique en toute sécurité.

Distribution de code

La source de l'interface graphique d'affichage d'image créée cette fois est ici. https://github.com/JackdMasaki/Mad2Image/blob/master/Mat2Imagetest.java

référence

J'ai fait référence à la page suivante lors de la création de cet article. Je suis profondément reconnaissant. http://answers.opencv.org/question/10344/opencv-java-load-image-to-gui/ https://docs.oracle.com/javase/8/docs/api/index.html?java/awt/image/BufferedImage.html

Recommended Posts

Afficher l'image de type Mat sur l'interface graphique avec Swing
Affichez l'application ROS sur Docker avec l'interface graphique du côté hôte
J'ai créé une interface graphique avec Swing
Afficher le texte en haut de l'image
Mettre à jour l'image du conteneur avec KUSANAGI s'exécute sur Docker
Affichage de l'image JavaFX8
Afficher la liste en setDétails à l'écran avec ressort-sécurité
Afficher les caractères sur l'écran LCD I2C 1602 avec Raspberry Pi 3 et Java