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 đối tượng BufferedImage bằng Java?


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ổ AWT / Swings Bạn cần chuyển đổi đối tượng Mat thành một đối tượng của lớp java.awt.image.BufferedImage. Để 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 cách sử dụng phương thức 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.

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;
public class Mat2BufferedImage {
   public static BufferedImage Mat2BufferedImage(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);
      return bufImage;
   }
   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);
      BufferedImage obj = Mat2BufferedImage(image);
      System.out.println(obj);
   }
}

Đầu ra

BufferedImage@579bb367: type = 5 ColorModel: #pixelBits = 24 numComponents = 3
color space = java.awt.color.ICC_ColorSpace@1de0aca6 transparency = 1 has alpha =
false isAlphaPre = false ByteInterleavedRaster: width = 500 height = 360
#numDataElements 3 dataOff[0] = 2