系统:win10-x64
opencv版本:3.3.1
Java版本:eclipse平台的1.1.8版本
我参考了两篇文献写成的该文件(也可以说抄袭)
- package orgwechat;
- import org.opencv.core.*;
- import org.opencv.imgcodecs.Imgcodecs;
- import javax.swing.*;
- import java.awt.*;
- import java.awt.image.BufferedImage;
- import java.awt.image.DataBufferByte;
- class ImageViewer{
- /**
- * Created by kofee on 2016/3/28.
- */
- private JLabel imageView;
- private Mat image;
- private String windowName;
- /**
- * 如果使用junit测试时调用该方法,图像会一闪而过,可通过sleep()等方式暂时显示
- *
- * @param
- */
- public ImageViewer(Mat image) {
- this.image = image;
- }
- /**
- * @param image 要显示的mat
- * @param windowName 窗口标题
- */
- public ImageViewer(Mat image, String windowName) {
- this.image = image;
- this.windowName = windowName;
- }
- /**
- * 图片显示
- */
- public void imshow() {
- setSystemLookAndFeel();
- Image loadedImage = toBufferedImage(image);
- JFrame frame = createJFrame(windowName, image.width(), image.height());
- imageView.setIcon(new ImageIcon(loadedImage));
- frame.pack();
- frame.setLocationRelativeTo(null);
- frame.setVisible(true);
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 用户点击窗口关闭
- }
- private void setSystemLookAndFeel() {
- try {
- UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (UnsupportedLookAndFeelException e) {
- e.printStackTrace();
- }
- }
- private JFrame createJFrame(String windowName, int width, int height) {
- JFrame frame = new JFrame(windowName);
- imageView = new JLabel();
- final JScrollPane imageScrollPane = new JScrollPane(imageView);
- imageScrollPane.setPreferredSize(new Dimension(width, height));
- frame.add(imageScrollPane, BorderLayout.CENTER);
- frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
- return frame;
- }
- private Image toBufferedImage(Mat matrix) {
- int type = BufferedImage.TYPE_BYTE_GRAY;
- if (matrix.channels() > 1) {
- type = BufferedImage.TYPE_3BYTE_BGR;
- }
- int bufferSize = matrix.channels() * matrix.cols() * matrix.rows();
- byte[] buffer = new byte[bufferSize];
- matrix.get(0, 0, buffer); // 获取所有的像素点
- BufferedImage image = new BufferedImage(matrix.cols(), matrix.rows(), type);
- final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
- System.arraycopy(buffer, 0, targetPixels, 0, buffer.length);
- return image;
- }
- }
- public class ShowPicture{
- static{System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}
- public static void main(String[] args) {
- Mat mat =Imgcodecs.imread("C:/Users/hasee/Desktop/wei.png");
- ImageViewer imageViewer = new ImageViewer(mat, "第一幅图片");
- imageViewer.imshow();
- }
- }
这段代码“static{System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}”意味着可以访问外部的文件,也就是本地库的文件像C,D,E的盘不然只能在该文件夹里面加在图片。缺少上述代码会出现下面的错误:
- Exceptioninthread "main" java.lang.UnsatisfiedLinkError:
- at org.opencv.imgcodecs.Imgcodecs.imread_1(Native Method)
- at org.opencv.imgcodecs.Imgcodecs.imread(Imgcodecs.java:118)
- at orgwechat.ShowPicture.main(ShowPicture.java:101)
经过运行后所得的结果:
该图是我偷的文章https://www.cnblogs.com/superbool/p/5331196.html的图,原图没有就不搞了。希望该文作者见谅。
参考文献:
https://www.cnblogs.com/superbool/p/5331196.html
http://blog.csdn.net/u012343179/article/details/68063432