欢迎访问我的GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

本篇概览

  • 作为一名java程序员,如果想在Ubuntu16桌面版上使用OpenCV4的服务,可以下载自己所需版本的OpenCV源码,然后自己动手编译java库和so库,这样就可以在java程序中使用了
  • 本文详细记录OpenCV4的下载和编译过程,然后写一个java程序验证是否可以成功调用OpenCV4的库,总的来说分为以下几步:
  1. 安装必要应用
  2. 配置java环境
  3. 配置ANT环境
  4. 下载源码
  5. 编译前的配置
  6. 编译
  7. 安装
  8. 验证
  • 注意:本文的操作全部以非root账号执行

环境和版本

  1. 操作系统:16.04.7 LTS(桌面版)
  2. java:1.8.0_311
  3. ANT:1.9.16
  4. OpenCV:4.1.1
  • 接下来开始操作,我这里是个新装的纯净版Ubuntu16

安装应用

  • 执行以下命令安装所有应用,如果有个别提示失败的可以多试几次:
  1. sudo apt-get install -y unzip build-essential curl cmake cmake-gui git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

配置java环境

  • 下载JDK8,解压后是名为jdk1.8.0_311的文件夹,将该文件夹移动到这个目录下面:/usr/lib/jvm/

  • 打开文件~/.bashrc,添加以下内容:

  1. export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_311
  2. export JRE_HOME=${JAVA_HOME}/jre
  3. export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
  4. export PATH=${JAVA_HOME}/bin:$PATH

配置ANT

  1. export ANT_HOME=/usr/local/apache-ant-1.9.16
  2. export PATH=$ANT_HOME/bin:$PATH
  • 执行命令source ~/.bashrc

  • 检查java和ANT安装是否完成:

  1. will@hp:~$ java -version
  2. java version "1.8.0_311"
  3. Java(TM) SE Runtime Environment (build 1.8.0_311-b11)
  4. Java HotSpot(TM) 64-Bit Server VM (build 25.311-b11, mixed mode)
  5. will@hp:~$ ant -version
  6. Apache Ant(TM) version 1.9.16 compiled on July 10 2021

下载源码

  • 执行以下命令即可:
  1. curl -fL -o opencv-4.1.1.zip https://codeload.github.com/opencv/opencv/zip/4.1.1; \
  2. unzip opencv-4.1.1.zip; \
  3. rm -rf opencv-4.1.1.zip; \
  4. mkdir opencv-4.1.1/build; \
  5. mkdir opencv-4.1.1/build/install

编译前的配置

  • 进入目录opencv-4.1.1/build/
  • 执行cmake,生成配置信息:
  1. cmake -D CMAKE_BUILD_TYPE=Release -D BUILD_SHARED_LIBS=OFF -D CMAKE_INSTALL_PREFIX=./install ..
  • 要注意的是,上面的-D BUILD_SHARED_LIBS=OFF参数十分重要!没有该参数时生成的libopencv_java411.so大小只有1532128,有了该参数libopencv_java411.so大小是78169672
  • 上述命令执行完毕后,请检查控制台输出的信息,如下图所示,"java"必须出现在To be build的栏目中,否则正式编译时不会编译java相关的库:

  • 以下是部分配置成功的输出信息,用于参考:
  1. -- Python (for build): /usr/bin/python2.7
  2. --
  3. -- Java:
  4. -- ant: /usr/local/apache-ant-1.9.16/bin/ant (ver 1.9.16)
  5. -- JNI: /usr/lib/jvm/jdk1.8.0_311/include /usr/lib/jvm/jdk1.8.0_311/include/linux /usr/lib/jvm/jdk1.8.0_311/include
  6. -- Java wrappers: YES
  7. -- Java tests: YES
  8. --
  9. -- Install to: /home/will/temp/202110/30/003/opencv-4.1.1/build/install
  10. -- -----------------------------------------------------------------
  11. --
  12. -- Configuring done
  13. -- Generating done
  14. -- Build files have been written to: /home/will/temp/202110/30/003/opencv-4.1.1/build

编译

  • opencv-4.1.1/build/目录执行以下命令即可开始编译源码,参数-j6表示六个线程并行编译(我的电脑是6核CPU,您请酌情处理):
  1. make -j6
  • CPU迅速上涨了:

  • 我这里大约10分钟不到,完成编译

安装

  • 在执行cmake命令的时候,已经用CMAKE_INSTALL_PREFIX=./install参数指定了安装目录在opencv-4.1.1/build/install,现在执行安装命令就会将OpenCV的库安装到这个目录下

  • 执行安装命令make install,如果控制台没有error相关的信息,就算安装成功了

  • 进入install目录看看,里面有四个目录:

  1. bin include lib share
  • 进入目录opencv-4.1.1/build/install/share/java/opencv4,里面已经生成了我们需要的jar和so库:
  1. opencv4/
  2. ├── libopencv_java411.so
  3. └── opencv-411.jar

验证

  • 终于,文件已经准备好了,接下来写一个java应用验证OpenCV库能否正常使用
  • 我这里用的是IDEA,新建一个java工程,名为opencv-demo
  • 依赖本地jar,设置方法如下:

  • 选中刚才生成的opencv-411.jar

  • 新建Main.java文件,如下所示,功能是新建窗口展示本地图片,请自行准备图片并修改为合适的位置:
  1. package com.company;
  2. import org.opencv.core.Core;
  3. import org.opencv.core.Mat;
  4. import static org.opencv.highgui.HighGui.*;
  5. import static org.opencv.imgcodecs.Imgcodecs.imread;
  6. public class Main {
  7. public static void main(String[] args) {
  8. System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
  9. Mat mat = imread("/home/will/temp/202110/30/pics/111.png");
  10. if(mat.empty()) {
  11. System.out.println("Image not exists!");
  12. return;
  13. }
  14. namedWindow("src", WINDOW_AUTOSIZE);
  15. imshow("src", mat);
  16. waitKey(0);
  17. // 这一句很重要,否则按下任意键后看不到窗口关闭的效果
  18. System.exit(0);
  19. }
  20. }
  • 最后,也是非常重要的一步,就是指定so库的位置,点击下图红框处:

  • 增加一个VM Options参数java.library.path,值就是刚才创建的libopencv_java411.so所在目录,如下图红框所示:

  • 设置完成后运行Main.java,得到结果如下,左侧就是显示本地图片的窗口:

  • 至此,OpenCV的java库和so库的生成和验证就完成了,如果您也是使用OpenCV的java程序员,希望本文能为您带来一些参考;

    https://github.com/zq2599/blog_demos

Ubuntu16桌面版编译OpenCV4的java库和so库的更多相关文章

  1. Ubuntu16桌面版编译和安装OpenCV4

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  2. (原)在anaconda3+ubuntu16.04中编译Pose flow中的deepmatching动态库

    转载请注明出处: https://www.cnblogs.com/darkknightzh/p/11285239.html 参考网址: https://github.com/YuliangXiu/Po ...

  3. Ubuntu16.04下编译OpenCV2.4.13静态库(.a文件)

    Ubuntu16.04下编译OpenCV2.4.13静态库(.a文件) https://blog.csdn.net/woainishifu/article/details/79712110 我们在做项 ...

  4. Ubuntu 16 桌面版使用笔记

    版本:16.04.2-Ubuntu 软件安装 常用软件 sudo apt-get install curl wget htop git vim 搜狗输入法 wget http://cdn2.ime.s ...

  5. Github桌面版使用方式(MAC)

    Github是一个流行的代码管理网站,同时也是全球最大的同性交友网站(滑稽).Github网页上你可以自由地托管自己的项目,也可以fork别人的项目过来玩耍,非常之方便,今天笔者就来介绍一下githu ...

  6. 细说Java主流日志工具库

    概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...

  7. 无IDE时编译和运行Java

    最近 Java subreddit 出现了一篇”在没有IDE的情况下编译Java包” 的帖子,这个帖子抛出了这么一个问题,“是否存在一个命令可以编译一组处于同一文件夹下独立包内的java文件的方法(这 ...

  8. [JAVA] 一个可以编辑、编译、运行Java简单文件的记事本java实现

    本来是Java课做一个仿windows记事本的实验,后来突然脑子一热,结果就给它加了一个编译运行Java文件的功能. 本工程总共大约3000行代码,基本上把所学的java界面.文件.控件的功能都包含在 ...

  9. 通过DOS、SHELL批处理命令加载Lib并编译和打包Java项目(或者运行项目)

    有些时候,需要通过DOS批处理来编译整个项目的JAVA文件:并且编译后还要对Class文件进行打包成jar文件...这还不是最烦的,最烦的是,编译和打包的时候需要依赖其他多个jar文件,困难就这么来了 ...

随机推荐

  1. Linux centos 安装Docker

    安装docker需要centos7 内核3.1以上 基本上centos7以上的都支持, 然后先更新到最新 sudo yum update 然后直接安装 sudo yum install docker ...

  2. 搭建ELK日志平台(单机)

    系统版本:Ubuntu 16.04.7 LTS 软件架构:Filebeat+Kafka+Logstash+Elasticsearch+Kibana+Nginx 软件版本:Filebeat-7.16.0 ...

  3. SP8374 PARKET1 - PARKET 题解

    Content 有一个 \(l\times w\) 大小的网格,其四周均被染成了红色,其余部分是棕色,已知红色网格与棕色网格的数量,求 \(l\) 与 \(w\) 的值. Solution 接下来给各 ...

  4. C# 将PDF转为线性化PDF

    线性化PDF文件是PDF文件的一种特殊格式,可以通过Internet更快地进行查看.线性化的PDF,在页面数量很多的情况下,更能突出表现出快速浏览的优势.下面是通过后端.NET程序实现将PDF文件转为 ...

  5. SpringBoot 设置服务一启动就执行、初始化数据

    定义一个类实现ApplicationRunner接口,然后Override这个ApplicationRunner接口的run方法 @Component public class TaskRunner ...

  6. c++内存分布之纯虚函数

    关于 本文演示环境:VS2017+32位程序. 纯虚函数是一种特殊的虚函数.可以预测到:虚函数的结论同样适用纯虚函数,但是纯虚函数是一种特殊的存在,还是看看实际结果. 代码写的不够规范: 因为任何带虚 ...

  7. 【LeetCode】1095. 山脉数组中查找目标值 Find in Mountain Array

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 二分查找 日期 题目地址:https://leetco ...

  8. 【LeetCode】945. Minimum Increment to Make Array Unique 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力求解,TLE 一次遍历 日期 题目地址:http ...

  9. 【LeetCode】240. Search a 2D Matrix II 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  10. 【Netty技术专题】「原理分析系列」Netty强大特性之ByteBuf零拷贝技术原理分析

    零拷贝Zero-Copy 我们先来看下它的定义: "Zero-copy" describes computer operations in which the CPU does n ...