版本选择
目前支持JDK1.8的最新版本是OpenCV-4.6.0
之后的版本都需要JDK11及以上。
对于OpenCV的Jar的兼容性还是挺好的,4.5.5
的方法在4.8.1
上都是可用的。
安装OpenCV
Windows环境
https://github.com/opencv/opencv/releases
下载这个exe文件,它是一个自解压文件
安装的时候选择目录的时候不用新建
opencv
,在解压的时候会自动创建opencv
文件夹。比如我选择的安装位置是
D:\Tools
,它实际上会解压到D:\Tools\opencv
这个目录。
CentOS源码编译
构建
下载地址
https://github.com/opencv/opencv/releases
安装依赖
1 | sudo yum install -y cmake gcc gcc-c++ gtk2-devel pkgconfig libpng-devel libjpeg-devel libtiff-devel libavcodec-devel libavformat-devel libswscale-devel libv4l-devel gstreamer-plugins-base-devel python-devel python-numpy |
下载
1 | wget -O opencv-4.6.0.zip https://github.com/opencv/opencv/archive/4.6.0.zip |
安装
1 | unzip opencv-4.6.0.zip |
注意只有显示如下才能成功构建Java依赖
如果没安装ant要先安装ant
查看是否安装ant
1 | ant -version |
安装ant
1 | yum install -y ant |
然后输入下述命令进行编译
1 | make -j$(nproc) |
使用make
如果中间如果因为特殊原因断了,可以使用make
命令再继续。
编译100%完成后最后输入下述命令进行安装:
1 | make install |
输入以下命令:
1 | cd /etc/ld.so.conf.d/ |
然后,复制.pc文件:
1 | sudo cp -f /usr/local/opencv4.6.0/lib64/pkgconfig/opencv4.pc /usr/lib64/pkgconfig/opencv4.pc |
注意,我安装的是4.6.0,生成的是opencv4.pc
,不是opencv.pc
测试一下:
1 | pkg-config --modversion opencv4 |
升级cmake
注意
本文中使用的cmake3就不用再升级cmake了。
cmake需要3.5.1以上的版本
1 | sudo yum install build-essential libssl-dev |
通过yum命令移除原先的CMake。
1 | yum remove cmake -y |
建立目标版本CMake的软连接。
1 | ln -s /usr/local/bin/cmake /usr/bin |
查看版本
1 | cmake --version |
升级libstdc
升级cmake的时候又报错
version `GLIBCXX_3.4.20‘ not found 解决方法
解决方法
1 | su root |
可以看到
libstdc++.so.6 ->libstdc++.so.6.0.19
1 | # 删除/usr/lib64原来的软连接libstdc++.so.6,删除之前先备份一份 |
确认库文件存在
1 | ls /usr/local/opencv4.6.0/share/java/opencv4 | grep libopencv_java460 |
设置 java.library.path
确保 JVM 能够找到 OpenCV 的原生库。你可以在启动 Java 应用程序时通过命令行参数或环境变量设置 java.library.path
。
通过命令行参数设置
1 | java -Djava.library.path=/usr/local/opencv4.6.0/share/java/opencv4 -cp /path/to/your/jar your.main.Class |
通过环境变量设置
在启动 Java 应用程序之前,设置 LD_LIBRARY_PATH
环境变量:
1 | export LD_LIBRARY_PATH=/usr/local/opencv4.6.0/share/java/opencv4:$LD_LIBRARY_PATH |
代码中加载
1 | static { |
CentOS中YUM安装
不建议使用YUM安装,YUM中的OpenCv版本太老了。
查看版本
1 | yum list opencv |
安装
1 | yum install opencv opencv-devel opencv-python -y |
卸载
1 | yum remove opencv opencv-devel opencv-python -y |
Ubuntu中APT安装
1 | sudo apt update |
获取版本
1 | python3 -c "import cv2; print(cv2.__version__)" |
卸载
1 | sudo apt remove -y libopencv-dev python3-opencv |
Ubuntu源码编译
https://github.com/opencv/opencv/releases
添加环境依赖
1 | sudo apt install -y build-essential cmake git pkg-config libgtk-3-dev \ |
cmake需要3.5.1以上的版本
查看cmake版本
1 | cmake --version |
安装:
1 | unzip opencv-4.6.0.zip |
然后输入下述命令进行编译:
1 | make -j12 |
使用make -j4
或者make -j8
进行多线程编译,虽然速度快但是容易出问题。
使用make
如果中间如果因为特殊原因断了,可以使用make
命令再继续。
编译100%完成后最后输入下述命令进行安装:
1 | make install |
输入以下命令:
1 | cd /etc/ld.so.conf.d/ |
然后,复制.pc文件:
1 | sudo cp -f /usr/local/opencv4.6.0/lib/pkgconfig/opencv4.pc /usr/lib/pkgconfig/opencv4.pc |
注意,我安装的是4.6.0,生成的是opencv4.pc
,不是opencv.pc
测试一下:
1 | pkg-config --modversion opencv4 |
加载依赖
项目中添加jar
jar的位置在安装目录下build\java
的目录下。
下面两种方式任选其一即可。
推荐方式1更灵活。
但是
无论哪一种都要确保开发和部署时OpenCV的版本号要完全一致。
引用Jar
1 | mvn install:install-file -Dfile=D:\Tools\opencv\build\java\opencv-460.jar -DgroupId="org.opencv" -DartifactId="opencv" -Dversion="4.6.0" -Dpackaging=jar |
项目下引用
1 | <dependency> |
引用本地库
方式1
添加测试代码
1 | import org.opencv.core.Core; |
加载本地库查找位置也可以通过两种方式设置。
配置运行时参数
通过菜单Run->Edit Configurations...
打开Run/Debug Configurations
对话框。
在对话框窗口右侧,找到VM options
标签对应的文本框。
在文本框中填写参数
-Djava.library.path=D:\Tools\opencv\build\java\x64
看好自己Java是64为就选x64,32位就选x86。
添加环境变量
1 | D:\Tools\opencv\build\java\x64 |
注意
推荐使用环境变量的方式,这样方便本地测试和服务端部署。
设置环境变量后IDEA需要重启才能生效。
方式2
这种方式就不用再指定java.library.path
了。
加载项目下的库文件
把jar和dll放到项目中。
代码中
1 | static { |
加载指定位置的库文件
1 | static { |
常用方法
1 | import org.opencv.core.*; |
如上就分别展示了
- 图片转灰度
- 灰度图片二值化
- 二值化图片黑色区域膨胀
- 图片的裁剪
灰度
1 | // 以灰度方式,读取图片 |
二值化
1 | // 转成二值化图片 |
膨胀
1 | // 膨胀 |
高斯模糊
1 | Mat img01 = new Mat(); |
剪裁
1 | // 截取左上角四分之一区域 |
拼接
1 | /** |
Mat转Base64
1 | /** |
工具类
通用
1 | package cn.psvmc.utils.opencv; |
透视变换
1 | package cn.psvmc.utils.opencv; |
轮廓相关
1 |
|
处理全流程
1 | import org.opencv.core.*; |
绘图
画线
1 | String basePath = "D:\\Project\\Java\\opencv-demo01\\pic\\"; |
说明
参数 | 解释 |
---|---|
InputOutPutArray img | 在 img 图像上绘制 |
Point pt1 | 端点1 |
Point pt2 | 端点2 |
Scalar& color | 颜色 |
int thickness | 线条厚度 |
lineType | 线条边缘类型(LINE_4(边缘像素采用4连通,即上下左右),LINE_8(边缘像素采用8连通,即上下左右还有四个对角),LINE_AA(边缘像素采用高斯滤波,抗锯齿)) |
画椭圆
1 | String basePath = "D:\\Project\\Java\\opencv-demo01\\pic\\"; |
矩形
1 | String basePath = "D:\\Project\\Java\\opencv-demo01\\pic\\"; |
圆圈
1 | String basePath = "D:\\Project\\Java\\opencv-demo01\\pic\\"; |
文本
1 | String basePath = "D:\\Project\\Java\\opencv-demo01\\pic\\"; |
要将文本放入图像中,需要指定以下内容。
- 您要写入的文字数据
- 您要放置它的位置坐标(即
文字的左下角
)。 - 字体类型
- 字体比例(指定字体大小)
- 线条类型 为了获得更好的外观,建议使用LINE_AA
Java加载本地库的方式
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
和 System.load(dllPath);
都用于在 Java 程序中加载本地库,
但它们有一些关键的区别:
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
- 作用:这个方法加载的是基于库名称的本地库。根据操作系统,会自动将库名称转换为对应的操作系统特定格式,并从标准库路径中查找和加载库。
- 使用场景:适用于加载系统默认路径中的库,例如:
- 在 Windows 上,
Core.NATIVE_LIBRARY_NAME
通常是"opencv_java455"
,系统会自动查找并加载opencv_java455.dll
。 - 在 Linux 上,系统会查找并加载
libopencv_java455.so
。
- 在 Windows 上,
- 优点:简化了加载过程,不需要指定库文件的完整路径。
- 缺点:依赖于系统默认库路径的配置。如果库文件不在默认路径中,可能会导致加载失败。
System.load(dllPath);
- 作用:这个方法加载指定路径的本地库文件。你需要提供库文件的完整路径。
- 使用场景:适用于加载不在系统默认路径中的库文件,或者是需要加载特定版本的库文件。
- 优点:灵活性高,可以加载任何位置的库文件。
- 缺点:需要明确指定库文件的完整路径,容易出错。