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開發手冊 - 呂傑利 著
文章標籤
全站熱搜
