LoginSignup
3
3

More than 5 years have passed since last update.

SwingでMat型画像をGUI上に表示

Posted at

概要

Swingを使ったGUI上でOpenCVの処理結果を表示してみる.

Swingとは

JavaのGUIツールキットでありAWTを拡張したものになります.
Swingで作成したGUIはOSのコンポーネントに頼らずに独自のGUIコンポーネントで描画を行うため
実行環境によらずに使用できる点がメリットです.
デメリットとしてはOSのコンポーネントではなくなるために動作処理が遅くなる点があります.

Swingでの画像の扱い

Mat型からSwing上で画像を表示するために本稿ではBufferedImageを使用します.
BudderedImageはアクセス可能なバッファを持つイメージデータでColorModelとRasterで構成されています.
RasterのSampleModel内のバンド数と型はその色とアルファ値を表すためのColorModelに必要な数と型と一致する必要があります.
また(0,0)座標は左上隅となっています.そのためRasterはminX=0,minY=0でなければなりません.

準備段階

次のものを導入します.
・java開発環境
・OpenCV3.1

調べれば様々な日本語での説明ページがでるため割愛します.

実装するメソッド

処理部分は次のようになります.

Mat2Image
public static BufferedImage Mat2Image(Mat src) {

//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;
        }
//新規BufferedImage型をsrcの幅,縦,チャネル数で作成.
        BufferedImage image = new BufferedImage(src.width(), src.height(), type);
//作成したBufferedImageからRasterを抜き出す.
      WritableRaster raster = image.getRaster();
//抜き出したRasterからバッファを抜き出す.
        DataBufferByte Buf = (DataBufferByte) raster.getDataBuffer();
        byte[] data = Buf.getData();
        src.get(0, 0, data);

        return image;
    }

これを呼び出してSwingのLabelに.setIconしてあげれば表示されます.

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

実行結果

lena.png

無事GUI上にImreadで読み込んだMat型の画像を表示することができました.

コード配布

今回作成した画像表示用GUIのソースはこちらになります.
https://github.com/JackdMasaki/Mad2Image/blob/master/Mat2Imagetest.java

参考

当記事の作成にあたって次のページを参考にさせていただきました.
深く感謝申しあげます.
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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3