在前面的章節中,我們討論了如何使用OpenCV Java庫來讀取和儲存影象。 除此之外,我們還可以使用GUI庫(如AWT/Swings和JavaFX)在單獨的視窗中顯示載入的影象。
要讀取影象,使用imread()
方法。 此方法返回以Matrix
的形式讀取的影象。 但是,要將此影象與GUI庫(AWT/Swings和JavaFX)結合使用,應將其轉換為包java.awt.image.BufferedImage
的BufferedImage
類的物件。
以下是將OpenCV的Mat
物件轉換為BufferedImage
物件的步驟。
第1步:將Mat編碼為MatOfByte
首先,需要將矩陣轉換為位元組矩陣。 可以使用Imgcodecs
類的imencode()
方法來完成。 以下是此方法的語法。
imencode(ext, image, matOfByte);
該方法接受以下引數 -
.jpg
,.png
等)的String
引數。Mat
物件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框架顯示影象,首先,使用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 tw511.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
除此之外,可以看到一個視窗顯示載入的影象,如下所示 -