基于Java+OpnenCV的图像读取与显示

本文介绍了一种使用Java和OpenCV进行图像读取及显示的方法。通过Eclipse和特定的开发环境配置,实现了从文件加载图像并将其显示在Swing界面中的功能。文中提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本程序实现基于Java和Opencv的图像读取与显示。

开发环境:Eclipse4.6,JDK1.8+Opencv3.0

注:学习心得,仅供参考。如有错误,请不吝指教。

【直接贴源代码】

package opencvTest;

import java.awt.EventQueue;
import java.awt.image.BufferedImage;

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.imgcodecs.Imgcodecs;

public class ShowImage {
	/*调用opencv的库之前,得要有下面的代码来加载*/
	static{System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}

	private JFrame frame;

	/*
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					ShowImage window = new ShowImage();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/*
	 * Create the application.
	 */
	public ShowImage() {
		initialize();
	}

	/*
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 800, 450);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
		JLabel label = new JLabel("");
		label.setBounds(0, 0, 800, 450);
		frame.getContentPane().add(label);
		
		Mat source=Imgcodecs.imread("sky.jpg");//加载sky图像为Mat格式//注:图像应位于当前工程路径下//
		BufferedImage image=mat2BufferedImage.matToBufferedImage(source);
		label.setIcon(new ImageIcon(image));
	}

}
//将Opencv中Mat格式的图像转换成Java Swing中的BufferedImage格式
//因为在Swing中只支持BufferedImage格式图像显示。
class mat2BufferedImage {
	public static BufferedImage matToBufferedImage(Mat matrix) {
		int cols = matrix.cols();
		int rows = matrix.rows();
		int elemSize = (int) matrix.elemSize();
		byte[] data = new byte[cols * rows * elemSize];
		int type;
		matrix.get(0, 0, data);
		switch (matrix.channels()) {
		case 1:
			type = BufferedImage.TYPE_BYTE_GRAY;
			break;
		case 3:
			type = BufferedImage.TYPE_3BYTE_BGR;
			// bgr to rgb
			byte b;
			for (int i = 0; i < data.length; i = i + 3) {
				b = data[i];
				data[i] = data[i + 2];
				data[i + 2] = b;
			}
			break;
		default:
			return null;
		}
		BufferedImage image2 = new BufferedImage(cols, rows, type);
		image2.getRaster().setDataElements(0, 0, cols, rows, data);
		return image2;
	}
}

实现效果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值