#概要
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
調べれば様々な日本語での説明ページがでるため割愛します.
#実装するメソッド
処理部分は次のようになります.
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してあげれば表示されます.
lblNewLabel = new JLabel();
ImageIcon image = new ImageIcon(createAwtImage(src));
lblNewLabel.setIcon(image);
#実行結果
無事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