centos安装opencv并在springboot中使用

使用conda安装opencv,并在docker运行的容器中使用,这里以运行则springboot应用的容器为例

步骤一:安装

在conda中安装

# 安装依赖
conda install numpy matplotlib

# 安装opencv
conda install -c conda-forge opencv
# 或者制定版本
conda install -c conda-forge opencv=4.5.3

使用编译方式安装

前提:

OpenCV: OpenCV installation overview

安装好cmake3 、gcc11,java-1.8.0-openjdk-devel ,ant其余配置项

cmake3和gcc通过编译安装

gcc
wget https://ftp.gnu.org/gnu/gcc/gcc-11.1.0/gcc-11.1.0.tar.xz
tar -xf gcc-11.1.0.tar.xz
cd gcc-11.1.0

# 配置和构建
./configure
make -j$(nproc)

# 安装
sudo make install

# 检查安装后版本
gcc --version

问题 如果在./configure时出现

/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory

 那么 执行 ./configure --disable-multilib

其余依赖 
# 安装必要的图像和视频库
sudo yum install libjpeg-turbo-devel libpng-devel libtiff-devel
sudo yum install libavc1394-devel libdc1394-devel libv4l-devel

# 安装 Java(如果需要 Java 支持)
sudo yum install java-1.8.0-openjdk-devel

#可选

# 安装 GTK(用于构建 OpenCV 的 GUI 模块)
sudo yum install gtk2-devel

# 安装 Eigen(线性代数库)
sudo yum install eigen3-devel

# 安装 TBB(Intel 线程构建块)
sudo yum install tbb-devel

# 安装 GStreamer(用于视频处理)
sudo yum install gstreamer-devel gstreamer-plugins-base-devel

# 安装 ffmpeg(用于视频处理)
sudo yum install ffmpeg-devel

# 安装 Python 3 和相关开发包
sudo yum install python3 python3-devel python3-pip
安装opencv:
# 1 官网下载对应版本
wget https://github.com/opencv/opencv/archive/refs/tags/4.8.1.tar.gz
# 2 解压
tar -zxvf 4.8.1.tar.gz
# 3 进入目录,创建build文件夹
mkdir build 
cd build
# 4 cmake
cmake -DBUILD_opencv_java=ON -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
# 5 make 
make
make install
# 6 更新库缓存
sudo ldconfig

注意:

cmake后一定要有日志打印,代表有java调用部分,否则无法通过java调用opencv

问题:

cmake 时 出现: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found

原因是gcc版本低,导致没有GLIBCXX_3.4.20,可以升级gcc版本,选择11版本

其余安装方式

直接使用docker制作好的镜像

由于后续需要提供给java调用,并且是在容器中进行,那么过于依赖物理机环境,后续换物理机使用时将会很麻烦,可以将需要的环境安装在容器中,并且制作一个基础镜像

比如可以这样操作

1. 下载一个已经安装好opencv的镜像

2.在启动镜像,在镜像中安装jre

3.将容器打包成一个新的镜像,这样就包含了opencv,并且也包含jre了

# 1.下载opencv镜像
#   在docker hub中选择一个
#   这里选择了opencvcourses/opencv-docke,包含opencv4.2
docker pull opencvcourses/opencv-docker:latest

# 2.创建容器并进入
docker run -it opencvcourses/opencv-docker

# 3.查看opencv版本
opencv_version
打印4.20

# 4.更新
apt-get update

# 5.安装 OpenJDK 8 JRE
apt-get install -y openjdk-8-jre

# 6.验证
java -version

步骤二:验证

在python环境中,查看版本信息,安装完成应该打印对应版本

python

import cv2
print(cv2.__version__)

如果安装的opencv没有支持python模块,那么可以直接去lib中查找是否有opencv-xxx.jar和libopencv_javaxxx.so[xxx是版本号]

步骤三:在springboot中使用

安装步骤中我选择了在物理机上进行编译安装,后续将物理机上的opencv通过容器卷加载到容器中供java使用

具体步骤如下:

  1. 在docker compose文件位置或者任意其他位置创建一个文件夹 opencv_so,用于保存opencv的执行文件
  2. 将/usr/lib64目录下所有关于opencv的文件拷贝到新建文件夹中
    cp -r *opencv* /home/opencv_so/
  3. 将/usr/lib64/目录下所有libpng,libtiff,libIlmImf,libjbig,libImath,libHalf,libIex,libIexMath,libIlmThread文件拷贝到opencv_so中,命令参照2
  4. 构建镜像时,创建opencv的执行位置,并设置环境变量LD_LIBRARY_PATH
    
    
    # opencv 目录
    ENV OPENCV_DIR /usr/local/opencv
    RUN mkdir -p $OPENCV_DIR
    
    # 设置 Java 库路径以便找到 OpenCV 的本地库文件
    ENV LD_LIBRARY_PATH $OPENCV_DIR/lib64:$LD_LIBRARY_PATH
    
    
    
  5. 容器卷加载,在docker compose 文件中,制定容器卷加载位置
    # 将创建的opencv_so挂载到容器/usr/local/opencv/lib64下
    - /home/opencv_so:/usr/local/opencv/lib64

验证时使用的springboot程序

在springboot中使用opencv需要将物理机安装的opencv jar文件下载到编写程序的电脑上,通过maven加载到项目中

具体操作为

# opencv-java.jar为具体物理机安装的 opencv jar
mvn install:install-file -Dfile=opencv-java.jar -DgroupId=org.opencv -DartifactId=opencv-java -Dversion=3.4.1 -Dpackaging=jar

# maven中引入

<dependency>
   <groupId>org.opencv</groupId>
   <artifactId>opencv</artifactId>
   <version>4.6.0</version>
</dependency>

测试内容

# 在需要使用opencv的类中
static {
        // 加载 OpenCV 本地库文件
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}

# 具体使用,这里创建一个opencv中的Mat类,如果创建成功,说明能正常调用opencv
Mat imread = new Mat();
System.out.println("mat create ok");

 

问题:不要将物理机的lib目录直接挂载到容器中

原因:

基础镜像和物理机系统环境版本等可能不一致,直接挂载可能出现错误

建议将opencv相关的问价挂载即可

问题:java.lang.UnsatisfiedLinkError: /usr/local/opencv/lib64/libopencv_java460.so: libjpeg.so.62: cannot open shared object file: No such file or directory

原因:

挂载的目录中没有libjpeg.so.62

需要将物理机的libjpeg.so.62放到opencv_so中

问题:java.lang.NoClassDefFoundError: org/opencv/core/Mat

原因1:

我遇到的原因定位时 libopencv_java460.so没有正常加载,即java程序加载的so文件位置错误

需要制定环境变量,将其正确文件放入环境变量

原因2:

java程序打包jar后,没有opencv-xxx.jar

可以检查:

jar tf remarkback.jar | grep opencv

如果出现opencv相关的内容说明正常,如果没有要么在运行程序时加载外部jar,或者在打包时加入

maven配置如下:【增加repackage】

 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

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

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

相关文章

记一次java for循环改造多线程的操作

背景 今天在开发质量平台时需要获取某些数据&#xff0c;要请求公司某个工程的OpenAPI接口A。此接口为返回通用数据的接口&#xff0c;且接口本身的RT都在2&#xff5e;3秒之间。使用该接口&#xff0c;需要进行两次循环获取&#xff0c;然后对返回数据进行处理组装&#xff0…

【NI-RIO入门】扫描模式

于NI KB摘录 所有CompactRIO设备都可以访问CompactRIO扫描引擎和LabVIEW FPGA。 CompactRIO 904x 系列是第一个引入 DAQmx 功能的产品线。 扫描引擎&#xff08;IO 变量&#xff09; – 主要为迁移和初始开发而设计。控制循环频率高达 1 kHz1&#xff0c;性能控制器上的频率更…

kill编译异常处理

当kill编译时出现如下警告 Build target Target 1 linking... *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_LCD_SHOWCHAR?LCD1602 *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_LCD_SHOWSTRING?LCD…

代码随想录第三十五天(一刷C语言)|整数拆分不同的二叉搜索树

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、整数拆分 思路&#xff1a;参考carl文档。 1、确定dp数组以及下标的含义&#xff1a;分拆数字i&#xff0c;可以得到的最大乘积为dp[i]。 2、确定递推公式&#xff1a;从1遍历j&#…

Nginx location+Nginx rewrite(重写)(新版)

Nginx locationNginx rewrite(重写) Nginx locationNginx rewrite(重写)一、location1、常用的Nginx 正则表达式2、location的类型3、location 的匹配规则4、location 优先级5、location 示例说明5.1只修改网页路径5.2修改nginx配置文件和网页路径5.3一般前缀5.4正则匹配5.5前缀…

C# WPF上位机开发(usb设备访问)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前很多嵌入式设备都支持usb访问&#xff0c;特别是很多mcu都支持高速usb访问。和232、485下个比较&#xff0c;usb的访问速度和它们基本不在一个…

miRMaker

Introduction 除了miRNA表达数据&#xff0c;各种miRNA相关的知识也强有力地支持了对miRNA功能相互作用的理解。 那些具有许多共同调控靶基因或疾病的miRNAs可能具有相似的功能 一些方法通过考虑实验验证的miRNA-靶标关系来评估miRNA相互作用&#xff0c;评估miRNA功能相互作…

自清洗过滤器工作原理尺寸选型参数,内部结构,压差开关如何调节

​ 1&#xff1a;全自动自清洗过滤器设备介绍 全自动反冲洗过滤器是水净化过程中不可缺少的处理手段&#xff0c;用于拦截水中的各种杂质&#xff0c;以净化水质或保护系统中其他设备的正常工作。普通网式过滤器因其结构简单、过滤效果好、阻力小而广泛应用于水源过滤、工业循…

【Android Studio】各个版本下载地址

下载地址&#xff1a; https://developer.android.com/studio/archive?hlzh-cn

如何用 Cargo 管理 Rust 工程系列 丁

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/PP9b5cSNd-7IqgNovcrB0A 优化输出 前面已经对 cargo package 工程编译输出了好多遍&#xff0c;发现编译结果打印的信息都包含了这个 unoptimize…

c语言:[输出函数]与[输入函数]|要点简述

一、【输出函数】 printf() 与 puts()的不同点 1、printf()函数 printf()支持单个字符%c的输出&#xff0c;以及字符串%s的输出。 (1)如果是以%c的形式输出&#xff0c;是一个字符一个字符的输出。因此&#xff0c;要用一个循环语句&#xff0c;把字符逐个输出。 (2)而用%…

Unity与Android交互通信系列(2)

在上一篇文章中&#xff0c;我们介绍了Unity和Android交互通信的原理及在Unity中直接调用Java代码的方式&#xff0c;但没有给出代码示例&#xff0c;下面通过实际例子演示上篇文章中AndroidJavaClass、AndroidJavaObject两个类的基本用法&#xff0c;由于交互通信涉及到两端&a…

查看知乎数学公式Tex源码的方法

首先使用F12打开开发者工具&#xff0c;再使用元素选择器选中要查看的公式。 在源码对应位置附近可以看到一个类型为 math/tex 的 script&#xff0c;如果没找到可以展开目录查找。

网络时间服务器

本章主要介绍网络时间服务器。 使用chrony配置时间服务器 配置chrony客户端向服务器同步时间 1 时间同步的必要性 一些服务对时间要求非常严格&#xff0c;例如&#xff0c;图所示的由三台服务器搭建的ceph集群。 这三台服务器的时间必须保持一致&#xff0c;如果不一致&#…

若依打包将vue放到.jar里面部署

1.vue静态文件&#xff0c;以及单页面 ruoyi-admin\src\main\resources\static \ruoyi-admin\src\main\resources\templates 2.后台开放白名单 "/cms", "/cms#/login" 3. mvc访问vue页面入口&#xff0c;接口 package com.ruoyi.web.controller.syst…

08_CSS定位与综合案例开发

day08_CSS定位与&综合案例开发 Objective&#xff08;本课目标&#xff09; 理解什么是定位能说出为什么要用定位 1. 为什么使用定位 标准流在最底层 (海底) ------- 浮动的盒子在中间层 (海面) ------- 定位的盒子 在 最上层 &#xff08;天空&#xff09; 小黄色块在…

软件测试面试八股文,最常见的7个高频面试题(附答案,建议收藏)

问题1&#xff1a;请自我介绍下&#xff1f; 核心要素&#xff1a;个人技能优势工作背景经验亮点 参考回答&#xff1a; 第一种&#xff1a;基本信息离职理由 面试官您好&#xff0c;我叫张三&#xff0c;来自番茄市&#xff0c;在软件测试⾏业有 3 年的⼯作经验。做过 Web…

算法——动态规划(DP,Dynamic Programming)

一、基础概念 DP的思想&#xff1a; 把问题分成子问题&#xff0c;前面子问题的解决结果被后面的子问题使用DP与分治法的区别&#xff1a; 分治法把问题分成独立的子问题&#xff0c;各个子问题能独立解决 自顶向下DP前面子问题的解决结果被后面的子问题使用&#xff0c;子问题…

3090K MOSFET N通道沟槽功率 PWM应用

3090K 采用沟槽技术&#xff0c;提供活x氧(导通)&#xff0c;低栅J电荷和栅J电压低至4.5V的工作。3090K 设备适用于各种应用。 3090K 特性&#xff1a; ● VDS 30V,ID 86A RDS(ON) < 5 mΩ VGS 10V RDS(ON) < 9.5mΩ VGS 4.5V ● 高功率和电流处理能力 ● 获得无…

【性能测试】基础知识篇-压力模型

常见压力模式 并发模式&#xff08;即虚拟用户模式&#xff09;和RPS模式&#xff08;即Requests Per Second&#xff0c;每秒请求数&#xff0c;吞吐量模式&#xff09;。 本文介绍这两种压力模式的区别&#xff0c;以便根据自身业务场景选择更合适的压力模式。 并发模式 …