20

Java Opencv-2.4.4 とスイング GUI を使用してアプリケーションを開発しています。問題は、処理された画像 ( Matオブジェクトに保存) を Java Swing GUI に出力する効率的な方法を示す解決策が見つからないことです。現時点では、この不器用なソリューションを使用しています。

javax.swing.JLabel outputImage;
outputImage.setIcon(new javax.swing.ImageIcon("/home/username/Output.png"));

private void sliderStateChanged(javax.swing.event.ChangeEvent evt) { 
       .
       .
  Mat canny; // Here is saved what I want to plot
  String filename = "/home/username/Output.png";
  Highgui.imwrite(filename, canny);  // write to disk
  outputImage.setIcon(new ImageIcon(ImageIO.read(new File(filename)))); //update Icon
       .
       .
}

ユーザーがいくつかの値、入力などを変更すると、GUIでディスク上のOutput.pngを上書きし、ディスクからの新しいイメージで jLabel を更新する必要があります。

これに対するよりエレガントで効率的なソリューションはありますか? MatオブジェクトをCanvasImageなど、swing で画像として印刷できるものに直接プロットまたは変換することは可能ですか?

4

4 に答える 4

15

はい、もっとエレガントな方法があります。Mat を BufferedImage タイプにコンサートしてから、swing でロードするだけです。バッファリングされた画像に変換するコードは次のとおりです。

    Mat image_tmp = your image

    MatOfByte matOfByte = new MatOfByte();

    Highgui.imencode(".jpg", image_tmp, matOfByte); 

    byte[] byteArray = matOfByte.toArray();
    BufferedImage bufImage = null;

    try {

        InputStream in = new ByteArrayInputStream(byteArray);
        bufImage = ImageIO.read(in);
    } catch (Exception e) {
        e.printStackTrace();
    }

そして、それを GUI オブジェクトにペイントすることができます:

g.drawImage(bufImage , 0, 0, null);

g は Graphics 型です

お役に立てれば。

于 2013-03-29T11:30:20.893 に答える
1

@andriy の anwser を使用します。私はこの解決策を思いつきました。Graphics の代わりに JFrame を使用しました。お役に立てれば。

public void imshow(Mat src){
    BufferedImage bufImage = null;
    try {
        MatOfByte matOfByte = new MatOfByte();
        Highgui.imencode(".jpg", src, matOfByte); 
        byte[] byteArray = matOfByte.toArray();
        InputStream in = new ByteArrayInputStream(byteArray);
        bufImage = ImageIO.read(in);

        JFrame frame = new JFrame("Image");
        frame.getContentPane().setLayout(new FlowLayout());
        frame.getContentPane().add(new JLabel(new ImageIcon(bufImage)));
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
于 2016-06-22T21:13:06.390 に答える