Java使用OpenCV进行图像操作

本文详细介绍了如何在Java中使用OpenCV进行图像操作,包括OpenCV的概述、下载安装、项目集成,以及Mat类的使用、常见图像API如读取、输出、显示、图像处理操作如缩放、亮度调整、边缘检测等。此外,还提供了图像压缩、解压缩、转换等实用技巧。
摘要由CSDN通过智能技术生成

OpenCV

概述

OpenCV(开源计算机视觉库)是在BSD(开源协议)许可下发布的。它是一个高度优化的库,专注于实时应用程序。它具有C ++,Python和Java接口,支持Windows,Linux,Mac OS,iOS和Android。

OpenCV是一个开源的计算机视觉库,它提供了一系列丰富的图像处理和计算机视觉算法,包括图像读取、显示、滤波、特征检测、目标跟踪等功能。

OpenCV被广泛应用于各种领域,如医疗影像处理、智能交通、安防监控、机器人视觉、虚拟现实等。它可以帮助开发者快速构建高效、准确、可靠的计算机视觉应用,并且支持多种编程语言,如C++、Python、Java等。

在计算机视觉应用中,OpenCV可以用来进行图像预处理、特征提取、物体检测、目标跟踪、三维重建等操作。通过结合深度学习技术,OpenCV还可以用于图像分类、目标分割、姿态估计等更加复杂的任务。

官网文档地址:https://docs.opencv.org/4.6.0/df/d65/tutorial_table_of_content_introduction.html

教程参考:https://www.w3cschool.cn/opencv/

教程参考:https://www.yiibai.com/opencv/opencv_adding_text.html

下载与安装

下载地址:https://opencv.org/releases/

在这里插入图片描述

下载到本地后,双击进行安装即可

在这里插入图片描述

目录说明

安装目录如下

在这里插入图片描述

build :基于window构建

sources:开源,提供源码

build目录说明

在这里插入图片描述

这里是Java开发关注java目录即可

在这里插入图片描述

x64与x86代表给不同的系统使用

opencv-460.jar给java操作openvc的程序包

由于是64位系统,所以关注x64目录

在这里插入图片描述

DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。DLL文件,放置于系统中。当执行某一个程序时,相应的DLL文件就会被调用

项目集成

方式1:

这里使用IDEA进行开发,导入opencv-460.jar库

使用快捷键 Ctrl+Shift+Alt+S打开
在这里插入图片描述
选择库项,导入Java库。
在这里插入图片描述
在这里插入图片描述
方式2:

除了上述方式,还可以将opencv-460.jar安装到本地仓库或私有仓库,然后在pom.xml中引入依赖。

在项目根目录创建lib目录,将上述提及的opencv-460.jaropencv_java460.dll放到该目录

在这里插入图片描述
pom.xml文件中,通过坐标的形式引入

        <!-- 加载lib目录下的opencv包 -->
        <dependency>
            <groupId>org.opencv</groupId>
            <artifactId>opencv</artifactId>
            <version>4.6.0</version>
            <scope>system</scope>
            <systemPath>${
   basedir}/lib/opencv-460.jar</systemPath>
        </dependency>

验证

public class MyTest {
   

	// 调用OpenCV库文件
    static {
   
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    public static void main(String args[]) {
   
        // 创建一个3X3的对角矩阵
        Mat a = Mat.eye(3, 3, CvType.CV_8UC1);
        System.out.println(a.dump());
    }
}

执行上述代码,不出意外将出现如下异常:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java460 in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
	at java.lang.Runtime.loadLibrary0(Runtime.java:871)
	at java.lang.System.loadLibrary(System.java:1122)

解决方案有2种:

1.将D:\Development\opencv\build\java\x64\opencv_java460.dll文件拷贝至下面2个目录,任选其一即可。

在这里插入图片描述

在这里插入图片描述
2.通过指定虚拟机参数解决:

-Djava.library.path=D:\WorkSpace\projectName\demo\lib\opencv_java460.dll

Mat类

OpenCV中的Mat类是一个用于表示图像、矩阵和向量的基本数据类型,它可以包含任意尺寸和类型的元素。

创建Mat对象

创建一个Mat对象

# 生成一个空的矩阵
Mat mat = new Mat();

创建Mat对象时同时设置矩阵的基本参数

params1:代表矩阵的行数(rows)

params2:代表矩阵的列数(cols)

params3:代表矩阵中像素点的位数和通道数
Mat a = Mat.eye(3, 3, CvType.CV_8UC1);

其他操作

访问Mat对象中的像素值

double[] pixel = mat.get(row, col); // 获取像素值

修改Mat对象中的像素值

mat.put(row, col, new double[]{
   255, 255, 255}); // 修改像素值

获取Mat对象的大小和通道数

int rows = mat.rows(); // 获取行数
int cols = mat.cols(); // 获取列数
int channels = mat.channels(); // 获取通道数

常见图像API

读取与输出图像

在OpenCV中,图象输入与输出使用imread()imwrite()两个方法

1.imread()

params1:代表输入图片路径

params2:一个标志表明加载图象的颜色类型

从文件读取一张图像并创建一个Mat对象

Mat mat1 = Imgcodecs.imread("D://test.png");

Mat mat2 = Imgcodecs.imread("D://test.png",Imgcodecs.IMREAD_LOAD_GDAL);

2.imwrite()

params1:文件输出位置

params2:将要输出为图片的源矩阵的名字,它是一个我们读入或处理过的Mat类型的参数

将一个Mat对象保存到文件中

    public static void main(String args[]) {
   
	    // 加载本地OpenCV库
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        
        Mat mat = Imgcodecs.imread("D://test.png");
        boolean imwrite = Imgcodecs.imwrite("D://write.png", mat);
        System.out.println("图像是否输出成功: " + imwrite);
    }

显示图像

可以通过GUI的方式显示图片,不需要再将图像通过流输出到本地再来查看

    public static void main(String args[]) {
   
        // 加载本地OpenCV库
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        
        Mat mat = Imgcodecs.imread("D://test.png");
        //显示图像
        HighGui.imshow("原图", mat);
        //延时多长时间后显示
        HighGui.waitKey(
  • 34
    点赞
  • 162
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Java 可以使用 OpenCV进行图像处理和比对。下面是一个简单的示例代码,用于比较两张图片是否相似: ```java import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.CvType; import org.opencv.core.Scalar; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; public class ImageCompare { public static void main(String[] args) { // 加载 OpenCV 库 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // 读取图片 Mat img1 = Imgcodecs.imread("path/to/image1.jpg"); Mat img2 = Imgcodecs.imread("path/to/image2.jpg"); // 转换为灰度图像 Imgproc.cvtColor(img1, img1, Imgproc.COLOR_BGR2GRAY); Imgproc.cvtColor(img2, img2, Imgproc.COLOR_BGR2GRAY); // 计算直方图 Mat hist1 = new Mat(); Mat hist2 = new Mat(); Imgproc.calcHist( new Mat[]{img1}, new MatOfInt(0), new Mat(), hist1, new MatOfInt(256), new MatOfFloat(0, 256) ); Imgproc.calcHist( new Mat[]{img2}, new MatOfInt(0), new Mat(), hist2, new MatOfInt(256), new MatOfFloat(0, 256) ); // 比较直方图 double correlation = Imgproc.compareHist(hist1, hist2, Imgproc.HISTCMP_CORREL); // 输出比较结果 System.out.println("Correlation: " + correlation); if (correlation > 0.9) { System.out.println("Images are similar."); } else { System.out.println("Images are not similar."); } } } ``` 这个示例程序使用 OpenCV 计算两张图片的直方图,并使用相关系数(correlation)比较两张图片的相似度。如果相关系数大于 0.9,则认为两张图片相似。 需要注意的是,这个方法只能检测两张图片是否相似,而不能检测图片中的物体是否相同。如果需要检测物体是否相同,可以使用 OpenCV 的物体识别功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeDevMaster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值