Nếu bạn cố đọc hình ảnh bằng OpenCV imread () nó trả về một đối tượng Mat. Nếu bạn muốn hiển thị nội dung của đối tượng Mat kết quả bằng cửa sổ JavaFX Bạn cần chuyển đổi đối tượng Mat thành một đối tượng của lớp javafx.scene.image.WainedImage. Để làm như vậy, bạn cần làm theo các bước dưới đây -
-
Mã hóa Mat thành MatOfByte - Trước hết, bạn cần chuyển ma trận về ma trận của một byte. Bạn có thể làm điều đó bằng phương pháp imencode () của lớp Imgcodec.
-
Phương thức này chấp nhận một tham số String (xác định định dạng hình ảnh), một đối tượng Mat (đại diện cho hình ảnh), một đối tượng MatOfByte.
-
Chuyển đổi đối tượng MatOfByte thành mảng byte - Chuyển đối tượng MatOfByte thành mảng byte bằng phương thức toArray ().
-
Khởi tạo ByteArrayInputStream - Khởi tạo lớp ByteArrayInputStream bằng cách chuyển mảng byte đã tạo ở bước trước tới một trong các hàm tạo của nó.
-
Tạo đối tượng BufferedImage - Truyền đối tượng Input Stream đã tạo ở bước trước vào phương thức read () của lớp ImageIO. Điều này sẽ trả về một đối tượng BufferedImage.
-
Cuối cùng, gọi toFXImage () phương pháp của SwingFXUtils lớp bằng cách chuyển BufferedImage đối tượng thu được ở bước trước dưới dạng một tham số.
Ví dụ
import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import javax.imageio.ImageIO; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfByte; import org.opencv.imgcodecs.Imgcodecs; import javafx.embed.swing.SwingFXUtils; import javafx.scene.image.WritableImage; public class Mat2WritableImage { public static WritableImage Mat2WritableImage(Mat mat) throws IOException{ //Encoding the image MatOfByte matOfByte = new MatOfByte(); Imgcodecs.imencode(".jpg", mat, 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); System.out.println("Image Loaded"); WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null); return writableImage; } 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 String file = "C:/EXAMPLES/OpenCV/sample.jpg"; Mat image = Imgcodecs.imread(file); WritableImage obj = Mat2WritableImage(image); System.out.println(obj); } }
Đầu ra
Image Loaded javafx.scene.image.WritableImage@142269f2