使用Java开发OpenCV3程序-2.读取并显示一幅图片【改】

系统:win10-x64

opencv版本:3.3.1

Java版本:eclipse平台的1.1.8版本

我参考了两篇文献写成的该文件(也可以说抄袭)

  1. package orgwechat;


  2. import org.opencv.core.*;
  3. import org.opencv.imgcodecs.Imgcodecs;




  4. import javax.swing.*;
  5. import java.awt.*;
  6. import java.awt.image.BufferedImage;
  7. import java.awt.image.DataBufferByte;




  8.  class ImageViewer{


  9. /**
  10.  * Created by kofee on 2016/3/28.
  11.  */


  12.     private JLabel imageView;


  13.     private Mat image;
  14.     private String windowName;


  15.     /**
  16.      * 如果使用junit测试时调用该方法,图像会一闪而过,可通过sleep()等方式暂时显示
  17.      *
  18.      * @param
  19.      */


  20.     public  ImageViewer(Mat image) {
  21.         this.image = image;
  22.     }




  23.     /**
  24.      * @param image      要显示的mat
  25.      * @param windowName 窗口标题
  26.      */
  27.     public  ImageViewer(Mat image, String windowName) {
  28.         this.image = image;
  29.         this.windowName = windowName;
  30.     }


  31.     /**
  32.      * 图片显示
  33.      */
  34.     public void imshow() {
  35.         setSystemLookAndFeel();
  36.         Image loadedImage = toBufferedImage(image);
  37.         JFrame frame = createJFrame(windowName, image.width(), image.height());
  38.         imageView.setIcon(new ImageIcon(loadedImage));
  39.         frame.pack();
  40.         frame.setLocationRelativeTo(null);
  41.         frame.setVisible(true);
  42.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 用户点击窗口关闭
  43.     }


  44.     private void setSystemLookAndFeel() {
  45.         try {
  46.             UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
  47.         } catch (ClassNotFoundException e) {
  48.             e.printStackTrace();
  49.         } catch (InstantiationException e) {
  50.             e.printStackTrace();
  51.         } catch (IllegalAccessException e) {
  52.             e.printStackTrace();
  53.         } catch (UnsupportedLookAndFeelException e) {
  54.             e.printStackTrace();
  55.         }
  56.     }


  57.     private JFrame createJFrame(String windowName, int width, int height) {
  58.         JFrame frame = new JFrame(windowName);
  59.         imageView = new JLabel();
  60.         final JScrollPane imageScrollPane = new JScrollPane(imageView);
  61.         imageScrollPane.setPreferredSize(new Dimension(width, height));
  62.         frame.add(imageScrollPane, BorderLayout.CENTER);
  63.         frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  64.         return frame;
  65.     }




  66.     private Image toBufferedImage(Mat matrix) {
  67.         int type = BufferedImage.TYPE_BYTE_GRAY;
  68.         if (matrix.channels() > 1) {
  69.             type = BufferedImage.TYPE_3BYTE_BGR;
  70.         }
  71.         int bufferSize = matrix.channels() * matrix.cols() * matrix.rows();
  72.         byte[] buffer = new byte[bufferSize];
  73.         matrix.get(0, 0, buffer); // 获取所有的像素点
  74.         BufferedImage image = new BufferedImage(matrix.cols(), matrix.rows(), type);
  75.         final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
  76.         System.arraycopy(buffer, 0, targetPixels, 0, buffer.length);
  77.         return image;
  78.     }

  79. }
  80. public class ShowPicture{
  81. static{System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}
  82.     public static void main(String[] args) {
  83.     Mat mat =Imgcodecs.imread("C:/Users/hasee/Desktop/wei.png");
  84.     ImageViewer imageViewer = new ImageViewer(mat, "第一幅图片");
  85.     imageViewer.imshow(); 
  86.     }
  87. }
在我们原本看的代码里面他缺少了全部的过程,我进行全部的合成。不过我在这个代码理解上面还是有欠缺。还得继续努力。

这段代码“static{System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}”意味着可以访问外部的文件,也就是本地库的文件像C,D,E的盘不然只能在该文件夹里面加在图片。缺少上述代码会出现下面的错误:

  1. Exceptioninthread "main" java.lang.UnsatisfiedLinkError: 
           org.opencv.imgcodecs.Imgcodecs.imread_1(Ljava/lang/String;)J
  1. at org.opencv.imgcodecs.Imgcodecs.imread_1(Native Method)
  2. at org.opencv.imgcodecs.Imgcodecs.imread(Imgcodecs.java:118)
  3. at orgwechat.ShowPicture.main(ShowPicture.java:101)

经过运行后所得的结果:

使用Java开发OpenCV3程序-2.读取并显示一幅图片【改】_第1张图片
该图是我偷的文章https://www.cnblogs.com/superbool/p/5331196.html的图,原图没有就不搞了。希望该文作者见谅。

参考文献:

https://www.cnblogs.com/superbool/p/5331196.html

http://blog.csdn.net/u012343179/article/details/68063432

你可能感兴趣的:(opencv初学)