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环境中,查看版本信息,安装完成应该打印对应版本

pythonimport 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>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装android studio

记录一下安装android studio的过程&#xff1a; 1.首先安装android studio到某一文件夹后&#xff0c;在C盘用户目录下可以看到.android文件夹。C:\Users\22515\AppData\Local\Google目录下也会出现AndroidStudio2022.2文件夹。&#xff08;注意&#xff1a;用户名&#xff0c…

一种缩小数据之间差距的算法

先上代码&#xff1a; /** * 缩小数据之间的差距&#xff0c;但是大小关系不变的方法* param {Array} features */function minMaxData(data) {for (let i 0; i < data.length; i) {const f data[i];const x f[1];const yf[2];//此处5根据实际情况设置const y2 Math.pow(…

LeedCode刷题---二分查找类问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、二分查找 题目链接&#xff1a;二分查找 题目描述 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一…

开源学习项目推荐

文章目录 koodo-reader凤凰架构学习项目NPS 内网穿透客户端 koodo-reader 项目地址&#xff1a;https://github.com/koodo-reader/koodo-reader 介绍&#xff1a;一个开源的阅读器&#xff0c;阅读pdf也有目录&#xff0c;作为epub阅读器和pdf阅读器看资料挺好 凤凰架构 项…

torch.gather(...)

1. Abstract 对于 pytorch 中的函数 torch.gather(input, # (Tensor) the source tensordim, # (int) the axis along which to indexindex, # (LongTensor) the indices of elements to gather*,sparse_gradFalse,outNone ) → Tensor有点绕&#xff0c;很多博客画各…

elastic:nested实现对满足条件的数组元素聚合查询

0. 引言 某些业务场景下&#xff0c;我们要对数组元素进行聚合查询&#xff0c;就需要用到nested数据类型&#xff0c;但部分场景是针对数组中指定的元素进行聚合&#xff0c;于是就需要对数组元素进行限定&#xff0c;今天来看看这种场景如何实现。 1. 数据准备 首先我们准…

【ECMAScript笔记一】初识JavaScript、变量的使用、数据类型包括哪些?

文章目录 1 初识JavaScript1.1 JS是什么1.2 JS的作用1.3 浏览器怎么执行JS1.4 编译性语言和解释型语言1.5 JS的组成1.6 JS的三种书写位置1.7 JS的注释1.8 JS的输入输出语句 2 变量2.1 变量的使用2.2 使用变量的注意点2.3 变量命名规范 3 数据类型3.1 简单数据类型3.1.1 数字型 …

6.s081操作系统Lab4: trap

文章目录 chapter 4概览4.1 CPU trap流程使用寄存器如果cpu想处理1个trap 4.2 用户态引发的trap4.2.1 uservec4.2.2 usertrap4.2.3 usertrapret和userretusertrapretuserret Lab4Backtrace (moderate)Alarm (hard) chapter 4 概览 trap的场景&#xff1a;系统调用&#xff0c…

2024年手把手教CleanMyMac X v4.14.6破解版安装激活图文教程

小编给您带来CleanMyMac X v4.14.6中文破解版&#xff0c;CleanMyMac X破解版是应用在MacOS上的一款Mac系统清理优化工具&#xff0c;使用cleanmymac x 中文破解版只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。 CleanMyMac…

redis各种数据类型的应用场景

String应用场景 单值缓存 SET key value GET key 对象缓存 SET user:1 value(json格式数据)MSET user:1:name zhuge user:1:balance 1888 MGET user:1:name user:1:balance 分布式锁 SETNX product:10001 true //返回1代表获取锁成功 …

使用案例总结Vlookup函数的30种用法

1 基础用法 =VLOOKUP(A12,B$1:D$8,3,0) 2 批量查找 =VLOOKUP(A11:A13,A2:C8,3,0) 3 模糊查找 =VLOOKUP("*"&D2&"*",A:B,2,0) 4 模糊查找2 =VLOOKUP(D10&"??",A:B,2,0) 5 模糊查找3 =

pycharm通过ssh连接远程服务器的docker容器进行运行和调试代码

pycharm连接远程服务器的docker容器通常有两种方法&#xff1a; 第一种&#xff1a;pycharm通过ssh连接已在运行中的docker容器 第二种&#xff1a;pycharm连接docker镜像&#xff0c;pycharm运行代码再自动创建容器 第一种方法比较通用简单&#xff0c;作者比较推崇。 条件…

特氟龙材质PFA、FEP、PTFE三种氟塑料试剂瓶区别

PFA、FEP、PTFE三种材质&#xff0c;都具有良好的耐化学性和耐热性。适合用于微量分析&#xff0c;痕量分析&#xff0c;超痕量分析ICP-MS/OES/AAS分析等实验。PFA、FEP、PTFE是三种常见的氟塑料材料&#xff0c;它们在石油化工、机械、半导体电子等领域得到广泛应用。虽然它们…

展示一段比较简单的人工智能自动做模型的程序

人工智能是一种模拟或模仿人类智能的技术。它通过使计算机系统具有一定的认知能力和学习能力&#xff0c;使其能够自动完成一系列复杂的任务。人工智能可以在各个领域应用&#xff0c;包括图像识别、语音识别、自然语言处理、机器学习等。人工智能还可以用于解决各种问题&#…

Docker 的基本概念、优势、及在程序开发中的应用

Docker 是一种容器化平台,它通过使用容器化技术,将应用程序及其依赖性打包到一个独立的、可移植的容器中,从而实现应用程序的快速部署、可靠性和可扩展性。 下面是 Docker 的一些基本概念和优势: 容器:Docker 使用容器化技术,将应用程序及其依赖性打包到一个可移植的容器…

CUDA C:线程、线程块与线程格

相关阅读 CUDA Chttps://blog.csdn.net/weixin_45791458/category_12530616.html?spm1001.2014.3001.5482 第一百篇博客&#xff0c;写点不一样的。 当核函数在主机端被调用时&#xff0c;它会被转移到设备端执行&#xff0c;此时设备会根据核函数的调用格式产生对应的线程(…

docker在线安装minio

1、下载最新minio docker pull minio/minio 2、在宿主机创建 /usr/local/data/miniodocker/config 和 /usr/local/data/miniodocker/data,执行docker命令 docker run -p 9000:9000 -p 9090:9090 --name minio -d --restartalways -e MINIO_ACCESS_KEYminio -e MINIO_SECRET_K…

力扣225. 用队列实现栈【附进阶版】

文章目录 力扣225. 用队列实现栈示例思路及其实现两个队列模拟栈一个队列模拟栈 力扣225. 用队列实现栈 示例 思路及其实现 两个队列模拟栈 队列是先进先出的规则&#xff0c;把一个队列中的数据导入另一个队列中&#xff0c;数据的顺序并没有变&#xff0c;并没有变成先进后…

引领半导体划片机行业,实现钛酸锶基片切割的卓越效能

在当今快速发展的半导体行业中&#xff0c;博捷芯以其卓越的技术实力和精准的行业应用&#xff0c;脱颖而出&#xff0c;再次引领行业潮流。这次&#xff0c;他们将先进的BJX3356划片机技术应用于钛酸锶基片的切割&#xff0c;为半导体制造行业的进一步发展提供了强大的技术支持…

基于知识库的接口自动化测试——结果模型化方法与装置的分析

一、背景 随着自动化测试的设计理念不断完善、新的技术不断应用&#xff0c;自动化测试资产的积累代价和维护成本不断降低&#xff0c;自动化测试资产的数量持续增长。同时&#xff0c;随着DevOps的普及&#xff0c;应用研发过程越来越敏捷&#xff0c;自动化测试能力逐步从测…