环境

本文基于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.dll64位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
Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐