close

OpenCV Mat格式轉 Java BufferedImage格式

   1: public BufferedImage matToBufferedImage(Mat matrix){
   2:         int cols = matrix.cols();
   3:         int rows = matrix.rows();
   4:         int elemSize = (int)matrix.elemSize();
   5:         byte[] data = new byte[cols*rows*elemSize];    
   6:         matrix.get(0, 0, data);
   7:         BufferedImage bufImg = null;
   8:         switch(matrix.channels())
   9:         {
  10:         case 1:
  11:             bufImg = new BufferedImage(cols, rows, BufferedImage.TYPE_BYTE_GRAY);
  12:             break;
  13:         case 3:
  14:             bufImg = new BufferedImage(cols,rows, BufferedImage.TYPE_3BYTE_BGR);
  15:             break;
  16:         }        
  17:         bufImg.getRaster().setDataElements(0, 0, cols, rows, data);
  18:         return bufImg;        
  19:     }

initialize()事件中加入

1. imread()讀圖

2. 利用cvtColor將OpenCV BGR轉成Java RGB

3. 透過matToBufferedImage()副程式進行格式轉換

   1: private void initialize() {
   2:         System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
   3:         Mat imgSrc = Imgcodecs.imread("C:\\OpenCV\\images\\lena.jpg");
   4:         //Mat imgSrc = Imgcodecs.imread("C:\\OpenCV\\images\\left01.jpg");
   5:         Mat imgDst = new Mat();
   6:         Imgproc.cvtColor(imgSrc, imgDst, Imgproc.COLOR_BGR2RGB);
   7:         BufferedImage bufImg = matToBufferedImage(imgDst);
   8:         
   9:         frame = new JFrame();
  10:         frame.setBounds(100, 100, 700, 737);
  11:         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  12:         frame.getContentPane().setLayout(null);
  13:         
  14:         JLabel lblImage = new JLabel("New label");
  15:         lblImage.setBounds(0, 0, imgSrc.width(), imgSrc.height());
  16:         lblImage.setIcon(new ImageIcon(bufImg));
  17:         frame.getContentPane().add(lblImage);
  18:         frame.setBounds(100,100,imgSrc.width(), imgSrc.height());
  19:     
  20:     }

參考[1]書中是採用for-loop自行將BGR轉RGB,不過OpenCV有提供更簡單的cvtColor就可以用內建函式將BGR轉RGB進行轉換,所以下列r像素b像素對調的部分我就不用做囉!

   1: // bgr to rgb
   2: byte b;
   3: for(int i=0; i< data.length; i=i+3)
   4: {
   5:    b = data[i];
   6:    data[i] = data[i+2];
   7:    data[i+2]= b;
   8: }


測試灰階影像

image

測試彩色影像

image



參考資料:

1. 王者歸來 OpenCV3 使用Java開發手冊 - 呂傑利 著

王者歸來:OpenCV3使用Java開發手冊

2. Eclipse下設定OpenCV 3.1開發環境

3. Win 10環境下安裝Java

arrow
arrow
    全站熱搜

    me1237guy 發表在 痞客邦 留言(0) 人氣()