您的位置:首页 > 编程语言 > Java开发

OpenCV-图像处理- Java(读取与显示图片)

2019-01-22 19:10 3371 查看
版权声明:本文由 Micheal 超 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/86599810
  • 在C++显示图片,OpenCV为其提供了一个叫做HighGUI的接口,尚且没有在java中实现。
  • OpenCV支持有限的图片格式,具体可参阅官方文档(常用的支持bmp、jpeg、png、tiff),可以使用Imgcodecs类的imread方法来读取图片(注意测试时,路径不要包括中文):

结构目录(Eclipse中):

创建两个类:OpenCVTest 和 ImageViewer

步骤

  1. 创建类 OpenCVTest
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class OpenCVTest {
public static void main(String[] args) {
// 载入dll(必须先加载)
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//将文件读入为OpenCV的Mat格式。注意测试时,路径不要包括中文
Mat src = Imgcodecs.imread("E:/Pictures/test.jpg");
if(src.dataAddr()==0){
System.out.println("打开文件出错");
}
ImageViewer imageViewer = new ImageViewer(src, "第一幅图片");
imageViewer.imshow();
}
}
  1. 创建类 ImageViewer
import org.opencv.core.Mat;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;

public class ImageViewer {

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;
}
}

参考博客

  1. https://www.geek-share.com/detail/2717498885.html
  2. https://blog.csdn.net/qq_36224522/article/details/81390110
  3. https://www.geek-share.com/detail/2726742539.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐