Linux/Windows下部署OpenCV环境(Java/SpringBoot/IDEA)

环境

本文基于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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/447358.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

macbook pro 2018 安装 arch linux 双系统

文章目录 友情提醒关于我的 mac在 mac 上需要提前做的事情复制 wifi 驱动 在 linux 上的操作还原 wifi 驱动连接 wifi 网络磁盘分区制作文件系统挂载分区 使用 archinstall 来安装 arch linux遗留问题 友情提醒 安装 archl linux 的时候&#xff0c;mac 的键盘是没法用的&#…

堆宝塔(Python)

作者 陈越 单位 浙江大学 堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小&#xff0c;按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下&#xff1a; 首先准备两根柱子&#xff0c;一根 A 柱串宝塔&#xff0c;一根 B 柱用于…

在高并发、高性能、高可用 三高项目中如何设计适合实际业务场景的分布式id(一)

分布式ID组件&#xff1a;黄金链路上的关键基石 在现代分布式系统中&#xff0c;分布式ID组件无疑扮演着至关重要的角色。作为整个系统的黄金链路上的关键组件&#xff0c;它的稳定性和可靠性直接关乎到整个系统的正常运作。一旦分布式ID组件出现问题&#xff0c;黄金链路上的…

【armv8 / armv9】: MMU深度学习

文章目录 一、MMU概念介绍二、虚拟地址空间和物理地址空间2.1、(虚拟/物理)地址空间的范围2.2、物理地址空间有效位(范围) 三、Translation regimes四、地址翻译/几级页表&#xff1f;4.1、思考&#xff1a;页表到底有几级&#xff1f;4.2、以4KB granule为例&#xff0c;页表的…

FreeRTOS教程1 基础知识

目录 1、准备材料 2、学习目标 3、前提知识 3.1、FreeRTOS简介 3.2、源码函数命名规律 4、动手创建一个FreeRTOS空工程 4.1、CubeMX相关配置 4.1.1、工程基本配置 4.1.2、时钟树配置 4.1.3、外设参数配置 4.1.4、外设中断配置 4.2、生成代码 4.2.1、配置Project Ma…

AIGC实战——GPT(Generative Pre-trained Transformer)

AIGC实战——GPT 0. 前言1. GPT 简介2. 葡萄酒评论数据集3. 注意力机制3.1 查询、键和值3.2 多头注意力3.3 因果掩码 4. Transformer4.1 Transformer 块4.2 位置编码 5. 训练GPT6. GPT 分析6.1 生成文本6.2 注意力分数 小结系列链接 0. 前言 注意力机制能够用于构建先进的文本…

ubuntu安装使用eigen(vscode)

1、eigen安装 安装命令如下&#xff1a; sudo apt-get update sudo apt-get install libeigen3-dev 默认安装路径为&#xff1a; /usr/include/eigen3 安装版本查询命令&#xff1a; pkg-config --modversion eigen3 2、CMakeLists.txt cmake_minimum_required(VERSION 3.…

21、电源管理入门之芯片设计中的电源管理

目录 1. 关于PCSA和SCP 2. 关于PSCI和SCMI 3. 关于芯片SoC设计中的一些要点 参考: 这里以ARM为例来进行说明,我们在做驱动软件的时候,就需要跟硬件SoC里面的IP打交道,通过操作寄存器来实现硬件功能。之前的文章:ARM SCP入门-AP与SCP通信中3和4章节已经进行了简单介绍,…

[MYSQL数据库]--表的增删查改和字段类型

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、表的增…

LeetCode203:移除链表元素

题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 解题思想 使用虚拟头节点 代码 struct ListNode {int val;ListNode* next;ListNode() :val(0), next(nullptr) {};ListNode(i…

使用IDEA远程Debug调试

文章目录 背景配置IDEA设置启动脚本改造 细节细节1&#xff1a;停在本地断点&#xff0c;关闭程序后会继续执行吗?细节2&#xff1a;jar包代码和本地不一致会怎么样&#xff1f;细节3&#xff1a;日志打印在哪里&#xff1f;细节4&#xff1a;调试时其他人会不会卡住&#xff…

spring-data-elasticsearch官方文档解读(部分)

Spring Data Elasticsearch 这里主要学习的是4.4.16版本的文档 1. 版本 下表显示了 Spring Data 发行版系列使用的 Elasticsearch 版本和其中包含的 Spring Data Elasticsearch 版本&#xff0c;以及引用该特定 Spring Data 发行版系列的 Spring Boot 版本。给出的 Elastics…

【APP逆向】酒仙网预约茅台程序,包含逆向过程详解

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏:爬虫实战,零基础、进阶教学 景天的主页:景天科技苑 文章目录 酒仙网预约抢购茅台1.抓包分析,账户名和密码登录2.短信登录3.登录+茅台预约 密码登录酒仙网预约抢购茅台 目标:账号登…

MVO-CNN-LSTM多输入时序预测|多元宇宙优化算法-卷积-长短期神经网络时序预测(Matlab)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&a…

mysql题库详解

1、如何创建和删除数据库&#xff1f; 创建数据库 CREATE DATABASE 数据库名; 删除数据库 drop database 数据库名; 2、MyISAM与InnoDB的区别&#xff1f; 1&#xff09;事务&#xff1a;MyISAM 不支持事务 InnoDB 支持 2&#xff09;行锁/表锁&#xff1a;MyISAM 支持表级锁…

力扣---最小栈

设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int get…

【Redis】RedisTemplate序列化传输数据

使用自定义的序列化器 使用RedisTemplate默认的序列化器发送数据&#xff0c;会将key全都当成Object处理&#xff0c;从而按照对象的方式转成json格式发送到服务器&#xff0c;这样会导致两个问题。一是不方便阅读&#xff0c;二是会大大浪费内存。因此&#xff0c;建议自定义…

js 添加、删除DOM元素

1. js添加、删除DOM元素 1.1. 添加DOM元素 1.1.1. appendChild()方法 该方法添加的元素位于父元素的末尾&#xff0c;使用方法&#xff1a; parentNode.appenChild(NewNode) // parentNode是需要添加元素的容器&#xff0c;NewNode是新添加的元素   创建一个li元素并添加到…

阿里云-零基础入门推荐系统 【多路召回】

文章目录 赛题介绍评价方式理解赛题理解多路召回 代码实战导包读取数据读取文章的基本属性读取文章的Embedding数据调用定义函数获取用户-文章-时间函数获取文章-用户-时间函数获取历史和最后一次点击获取文章属性特征获取用户历史点击的文章信息获取点击次数最多的topk个文章定…

【数据库】软件测试之MySQL数据库面试总结

有表如下&#xff1a; Student 学生表 SC 成绩表 Course 课程表 Teacher 老师表 每个学生可以学习多门课程&#xff0c;每一个课程都有得分&#xff0c;每一门课程都有老师来教&#xff0c;一个老师可以教多个学生 1、查询姓‘朱’的学生名单 select * from Student whe…