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: }
測試灰階影像
測試彩色影像
參考資料:
1. 王者歸來 OpenCV3 使用Java開發手冊 - 呂傑利 著
全站熱搜