当前位置:   article > 正文

centos安装opencv并在springboot中使用_centos 安装 opencv 配置环境变量 让springboot通过system.loadli

centos 安装 opencv 配置环境变量 让springboot通过system.loadlibrary(core.nati

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

步骤一:安装

在conda中安装

  1. # 安装依赖
  2. conda install numpy matplotlib
  3. # 安装opencv
  4. conda install -c conda-forge opencv
  5. # 或者制定版本
  6. 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
  1. wget https://ftp.gnu.org/gnu/gcc/gcc-11.1.0/gcc-11.1.0.tar.xz
  2. tar -xf gcc-11.1.0.tar.xz
  3. cd gcc-11.1.0
  4. # 配置和构建
  5. ./configure
  6. make -j$(nproc)
  7. # 安装
  8. sudo make install
  9. # 检查安装后版本
  10. gcc --version

问题 如果在./configure时出现

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

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

其余依赖 
  1. # 安装必要的图像和视频库
  2. sudo yum install libjpeg-turbo-devel libpng-devel libtiff-devel
  3. sudo yum install libavc1394-devel libdc1394-devel libv4l-devel
  4. # 安装 Java(如果需要 Java 支持)
  5. sudo yum install java-1.8.0-openjdk-devel
  6. #可选
  7. # 安装 GTK(用于构建 OpenCV 的 GUI 模块)
  8. sudo yum install gtk2-devel
  9. # 安装 Eigen(线性代数库)
  10. sudo yum install eigen3-devel
  11. # 安装 TBB(Intel 线程构建块)
  12. sudo yum install tbb-devel
  13. # 安装 GStreamer(用于视频处理)
  14. sudo yum install gstreamer-devel gstreamer-plugins-base-devel
  15. # 安装 ffmpeg(用于视频处理)
  16. sudo yum install ffmpeg-devel
  17. # 安装 Python 3 和相关开发包
  18. sudo yum install python3 python3-devel python3-pip
安装opencv
  1. # 1 官网下载对应版本
  2. wget https://github.com/opencv/opencv/archive/refs/tags/4.8.1.tar.gz
  3. # 2 解压
  4. tar -zxvf 4.8.1.tar.gz
  5. # 3 进入目录,创建build文件夹
  6. mkdir build
  7. cd build
  8. # 4 cmake
  9. cmake -DBUILD_opencv_java=ON -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
  10. # 5 make
  11. make
  12. make install
  13. # 6 更新库缓存
  14. 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. # 1.下载opencv镜像
  2. # 在docker hub中选择一个
  3. # 这里选择了opencvcourses/opencv-docke,包含opencv4.2
  4. docker pull opencvcourses/opencv-docker:latest
  5. # 2.创建容器并进入
  6. docker run -it opencvcourses/opencv-docker
  7. # 3.查看opencv版本
  8. opencv_version
  9. 打印4.20
  10. # 4.更新
  11. apt-get update
  12. # 5.安装 OpenJDK 8 JRE
  13. apt-get install -y openjdk-8-jre
  14. # 6.验证
  15. java -version

步骤二:验证

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

  1. python
  2. import cv2
  3. 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
    1. # opencv 目录
    2. ENV OPENCV_DIR /usr/local/opencv
    3. RUN mkdir -p $OPENCV_DIR
    4. # 设置 Java 库路径以便找到 OpenCV 的本地库文件
    5. ENV LD_LIBRARY_PATH $OPENCV_DIR/lib64:$LD_LIBRARY_PATH
  5. 容器卷加载,在docker compose 文件中,制定容器卷加载位置
    1. # 将创建的opencv_so挂载到容器/usr/local/opencv/lib64下
    2. - /home/opencv_so:/usr/local/opencv/lib64

验证时使用的springboot程序

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

具体操作为

  1. # opencv-java.jar为具体物理机安装的 opencv jar
  2. mvn install:install-file -Dfile=opencv-java.jar -DgroupId=org.opencv -DartifactId=opencv-java -Dversion=3.4.1 -Dpackaging=jar
  3. # maven中引入
  4. <dependency>
  5. <groupId>org.opencv</groupId>
  6. <artifactId>opencv</artifactId>
  7. <version>4.6.0</version>
  8. </dependency>

测试内容

  1. # 在需要使用opencv的类中
  2. static {
  3. // 加载 OpenCV 本地库文件
  4. System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
  5. }
  6. # 具体使用,这里创建一个opencv中的Mat类,如果创建成功,说明能正常调用opencv
  7. Mat imread = new Mat();
  8. 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】

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-maven-plugin</artifactId>
  6. <configuration>
  7. <excludes>
  8. <exclude>
  9. <groupId>org.projectlombok</groupId>
  10. <artifactId>lombok</artifactId>
  11. </exclude>
  12. </excludes>
  13. </configuration>
  14. <executions>
  15. <execution>
  16. <goals>
  17. <goal>repackage</goal>
  18. </goals>
  19. </execution>
  20. </executions>
  21. </plugin>
  22. </plugins>
  23. </build>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/623244
推荐阅读
相关标签
  

闽ICP备14008679号