OpenCV图像操作
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.jar
与opencv_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(