Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 OpenCV Mat 객체를 BufferedImage 객체로 변환하는 방법

OpenCV의 imread() 메서드를 사용하여 이미지를 읽으면 결과로 Mat 객체가 반환됩니다. 하지만 이렇게 얻은 Mat 객체의 내용을 AWT나 Swing 기반 창에 표시하려면, 먼저 해당 객체를 java.awt.image.BufferedImage 클래스의 객체로 변환해야 합니다. 변환 작업은 아래 단계를 순서대로 따라 하면 됩니다.

  • Mat을 MatOfByte로 인코딩하기 — 가장 먼저 행렬(Mat)을 바이트 행렬로 변환해야 합니다. 이 작업은 Imgcodecs 클래스의 imencode() 메서드를 사용하여 수행할 수 있습니다.

    이 메서드는 문자열 매개변수(이미지 형식 지정), 이미지를 나타내는 Mat 객체, 그리고 MatOfByte 객체를 인수로 받습니다.

  • MatOfByte 객체를 바이트 배열로 변환하기toArray() 메서드를 사용하여 MatOfByte 객체를 바이트 배열(byte array)로 변환합니다.

  • ByteArrayInputStream 인스턴스 생성하기 — 이전 단계에서 만든 바이트 배열을 생성자 중 하나에 전달하여 ByteArrayInputStream 클래스의 인스턴스를 생성합니다.

  • BufferedImage 객체 생성하기 — 이전 단계에서 만든 InputStream 객체를 ImageIO 클래스의 read() 메서드에 전달하면 BufferedImage 객체가 반환됩니다.

예제 코드

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{
      //이미지 인코딩
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", mat, matOfByte);
      //인코딩된 Mat을 바이트 배열에 저장
      byte[] byteArray = matOfByte.toArray();
      //BufferedImage 준비
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);
      return bufImage;
   }
   public static void main(String args[]) throws Exception {
      //OpenCV 코어 라이브러리 로드
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
      //파일에서 이미지 읽기
      String file = "C:/EXAMPLES/OpenCV/sample.jpg";
      Mat image = Imgcodecs.imread(file);
      BufferedImage obj = Mat2BufferedImage(image);
      System.out.println(obj);
   }
}

실행 결과

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