- OpenCV简介
- OpenCV开发环境配置
- OpenCV存储图像
- OpenCV读取图像
- OpenCV写入图像
- OpenCV用户界面
- 图像类型
- 图像转换
- 绘图函数
- 模糊功能
- 过滤功能
- 阈值
- 索贝尔衍生品
- 变换操作
- 相机和人脸检测
- 几何变换
- 杂篇
OpenCV用户界面
在前面的章节中,我们讨论了如何使用OpenCV Java库来读取和保存图像。 除此之外,我们还可以使用GUI库(如AWT/Swings和JavaFX)在单独的窗口中显示加载的图像。
将Mat转换成缓冲的图像
要读取图像,使用imread()
方法。 此方法返回以Matrix
的形式读取的图像。 但是,要将此图像与GUI库(AWT/Swings和JavaFX)结合使用,应将其转换为包java.awt.image.BufferedImage
的BufferedImage
类的对象。
以下是将OpenCV的Mat
对象转换为BufferedImage
对象的步骤。
第1步:将Mat编码为MatOfByte
首先,需要将矩阵转换为字节矩阵。 可以使用Imgcodecs
类的imencode()
方法来完成。 以下是此方法的语法。
imencode(ext, image, matOfByte);
该方法接受以下参数 -
- Ext - 指定图像格式(
.jpg
,.png
等)的String
参数。 - image - 图像的
Mat
对象 - matOfByte -
MatOfByte
类的空对象
使用此方法编码图像,如下所示。
//Reading the image Mat image = Imgcodecs.imread(file); //instantiating an empty MatOfByte class MatOfByte matOfByte = new MatOfByte(); //Converting the Mat object to MatOfByte Imgcodecs.imencode(".jpg", image, matOfByte);
第2步:将MatOfByte对象转换为字节数组
使用toArray()
方法将MatOfByte
对象转换为一个字节数组。
byte[] byteArray = matOfByte.toArray();
第3步:准备InputStream对象
通过将上一步中创建的字节数组传递给ByteArrayInputStream
类的构造函数来准备InputStream
对象。
//Preparing the InputStream object InputStream in = new ByteArrayInputStream(byteArray);
第4步:准备InputStream对象
将上一步中创建的输入流对象传递给ImageIO
类的read()
方法。 这将返回一个BufferedImage
对象。
//Preparing the BufferedImage BufferedImage bufImage = ImageIO.read(in);
使用AWT/Swings显示图像
要使用AWT/Swings框架显示图像,首先,使用imread()
方法读取图像,并按照上述步骤将其转换为BufferedImage
。
然后,实例化JFrame
类,并将创建的缓冲图像添加到JFrame
的ContentPane
中,如下代码片段所示 -
//Instantiate JFrame JFrame frame = new JFrame(); //Set Content to the JFrame frame.getContentPane().add(new JLabel(new ImageIcon(bufImage))); frame.pack(); frame.setVisible(true);
示例
以下程序代码显示了如何使用OpenCV库通过Swing窗口读取图像并显示它。
package zyiz.net; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.InputStream; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfByte; import org.opencv.imgcodecs.Imgcodecs; public class DisplayingImagesUsingSwings { public static void main(String args[]) throws Exception { //Loading the OpenCV core library System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); //Reading the Image from the file and storing it in to a Matrix object String file = "F:/worksp/opencv/images/sample.jpg"; Mat image = Imgcodecs.imread(file); //Encoding the image MatOfByte matOfByte = new MatOfByte(); Imgcodecs.imencode(".jpg", image, matOfByte); //Storing the encoded Mat in a byte array byte[] byteArray = matOfByte.toArray(); //Preparing the Buffered Image InputStream in = new ByteArrayInputStream(byteArray); BufferedImage bufImage = ImageIO.read(in); //Instantiate JFrame JFrame frame = new JFrame(); //Set Content to the JFrame frame.getContentPane().add(new JLabel(new ImageIcon(bufImage))); frame.pack(); frame.setVisible(true); System.out.println("Image Loaded"); } }
在执行上述程序时,您将得到以下输出 -
Image Loaded
除此之外,可以看到一个窗口显示加载的图像,如下所示 -
上一篇:OpenCV写入图像
扫描二维码
程序员编程王