OpenCV用戶界面
在前面的章節中,我們討論瞭如何使用OpenCV Java庫來讀取和保存圖像。 除此之外,我們還可以使用GUI庫(如AWT/Swings和JavaFX)在單獨的窗口中顯示加載的圖像。
將Mat轉換成緩衝的圖像
要讀取圖像,使用imread()
方法。 此方法返回以Matrix
的形式讀取的圖像。 但是,要將此圖像與GUI庫(AWT/Swings和JavaFX)結合使用,應將其轉換爲包java.awt.image.BufferedImage
的BufferedImage
類的對象。
以下是將OpenCV的Mat
對象轉換爲BufferedImage
對象的步驟。
第1步:將Mat編碼爲MatOfByte
首先,需要將矩陣轉換爲字節矩陣。 可以使用Imgcodecs
類的imencode()
方法來完成。 以下是此方法的語法。
imencode(ext, image, matOfByte);
該方法接受以下參數 -
- Ext - 指定圖像格式(
.jpg
,.png
等)的String
參數。 - image - 圖像的
Mat
對象 - matOfByte -
MatOfByte
類的空對象
使用此方法編碼圖像,如下所示。
//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);
第2步:將MatOfByte對象轉換爲字節數組
使用toArray()
方法將MatOfByte
對象轉換爲一個字節數組。
byte[] byteArray = matOfByte.toArray();
第3步:準備InputStream對象
通過將上一步中創建的字節數組傳遞給ByteArrayInputStream
類的構造函數來準備InputStream
對象。
//Preparing the InputStream object
InputStream in = new ByteArrayInputStream(byteArray);
第4步:準備InputStream對象
將上一步中創建的輸入流對象傳遞給ImageIO
類的read()
方法。 這將返回一個BufferedImage
對象。
//Preparing the BufferedImage
BufferedImage bufImage = ImageIO.read(in);
使用AWT/Swings顯示圖像
要使用AWT/Swings框架顯示圖像,首先,使用imread()
方法讀取圖像,並按照上述步驟將其轉換爲BufferedImage
。
然後,實例化JFrame
類,並將創建的緩衝圖像添加到JFrame
的ContentPane
中,如下代碼片段所示 -
//Instantiate JFrame
JFrame frame = new JFrame();
//Set Content to the JFrame
frame.getContentPane().add(new JLabel(new ImageIcon(bufImage)));
frame.pack();
frame.setVisible(true);
示例
以下程序代碼顯示瞭如何使用OpenCV庫通過Swing窗口讀取圖像並顯示它。
package yiibai.com;
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 = "F:/worksp/opencv/images/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");
}
}
在執行上述程序時,您將得到以下輸出 -
Image Loaded
除此之外,可以看到一個窗口顯示加載的圖像,如下所示 -