Computer >> Máy Tính >  >> Lập trình >> Java

Làm thế nào để chuyển đổi đối tượng OpenCV Mat thành JavaFX WordsImage?


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