环境
本文基于Linux(CentOS 7)、SpringBoot部署运行OpenCV 4.5.5,并顺带记录Windows/IDEA下如何调试SpringBoot调用OpenCV项目。
Windows下调试
首先我们编写代码,并在Windows/IDEA下调试通过。
下载Windows版安装包,并安装。地址https://opencv.org/releases/,本例是4.5.5:
注意OpenCV较新的版本需要比较高的JDK版本,如果你的环境受限于JDK8,那么不要下载最新版,而是选择4.5.5版本。
将安装目录下的build\java\x64\opencv_java455.dll
64位dll拷贝到C:\Windows\System32
。下。
将build\java\opencv-455.jar
拷贝到SpringBoot项目根目录下的lib
。
配置项目pom.xml
,添加OpenCV本地依赖:
<dependency>
<groupId>org.opencv</groupId>
<artifactId>opencv</artifactId>
<version>4.5.5</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/opencv-455.jar</systemPath>
</dependency>
添加打包配置,将这个本地jar包打包到最终输出:
<build>
<plugins>
<!-- 省略其他配置 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 打包时是否包含scope为system的依赖 -->
<includeSystemScope>true</includeSystemScope>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
去除spring-boot-devtools
,否则IDEA上调试运行会找不到这个dll:
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-devtools</artifactId>-->
<!-- <scope>runtime</scope>-->
<!-- <optional>true</optional>-->
<!-- </dependency>-->
接下来就可以愉快地在Windows编写测试代码了~
建议将OpenCV调用封装成一个门面类,在类的静态代码块中初始化native引用:
public class MyOpenCV {
// 引入native库
static {
System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);
}
// 测试方法
public void test() {
Mat mat = new Mat();
System.out.println("" + mat);
}
}
不要在SpringBoot程序入口引用,否则在调试阶段可能会报错。
然后在Controller中写个测试接口,调用MyOpenCV.test()
,就可以通过接口验证集成是否成功了。
有的人调试会遇到java.lang.UnsatisfiedLinkError
,需要分辨下报错是so找不到,还是native方法找不到。
- so找不到是因为so不在
java.library.path
,所以稳妥做法是把so拷贝到C:\Windows\System32
下。 - native方法找不到,很可能是IDEA调试下,
spring-boot-devtools
热加载作妖。
发布Linux
调试完成后,就要开始部署服务端了。
安装依赖
安装如下依赖:
yum install gcc gcc-c++ gtk+-devel gimp-devel gimp-devel-tools gimp-help-browser zlib-devel libtiff-devel libjpeg-devel libpng-devel gstreamer-devel libavc1394-devel libraw1394-devel libdc1394-devel jasper-devel jasper-utils swig python libtool nasm ant
可以注意到上面并没有安装最重要的CMake,这是因为通过yum安装的CMake最高是2.x版本,不符合OpenCV所需的要求,需要手动安装。
安装CMake
https://cmake.org/download/下载最新版本。
上传服务器,并解压安装:
rz
tar xzvf cmake-3.29.0-rc3.tar.gz
cd ./cmake-3.29.0-rc3
./configure
make
make install
ln -s /usr/local/bin/cmake /usr/bin
检查安装:
cmake --version
安装OpenCV
去https://opencv.org/releases/下载源码,本例下载4.5.5。
将zip包上传服务器,并解压到合适的目录下:
rz
unzip opencv-4.5.5.zip
创建build目录:
cd opencv-4.5.5
mkdir build
cd build
配置构建:
cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_GENERATE_PKGCONFIG=ON -D ENABLE_CXX11=ON -D WITH_1394=OFF -D BUILD_opencv_xfeatures2d=OFF -D BUILD_SHARED_LIBS=OFF -D BUILD_TESTS=OFF ..
注意CMake的打印结果:
ant必须要有,Java Wrappers必须是YES,并且日志没有出现报错才可以进行下一步,如果是warning可以忽略。
接下来开始构建:
make -j4
-j4
指定了4线程,可以根据实际机器配置更改,否则很慢。
完成以后安装:
make install
执行后会在/usr/local/lib64
(如果你的机器是64位)下看到生成文件。
而我们需要的Java so文件在/usr/local/share/java/opencv4/
下,拷贝过去:
cp /usr/local/share/java/opencv4/libopencv_java455.so /usr/local/lib64
所以千万不要以为/usr/local/lib64
下安装了很多OpenCV的so就是成功了,要检查/usr/local/share/java/opencv4/
目录有没有生成,如果生成成功,把libopencv_java455.so
拷贝到/usr/local/lib64
一块去,方便管理。
配置
需要配置java.library.path
,使得Java程序找到so,在SpringBoot的启动脚本中加上-Djava.library.path
配置:
java -jar -Djava.library.path=/usr/local/lib64 [你的jar包名].jar