Ubuntu16桌面版編譯OpenCV4的java庫和so庫

程式設計師欣宸發表於2022-01-18

歡迎訪問我的GitHub

https://github.com/zq2599/blog_demos

內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等;

本篇概覽

  • 作為一名java程式設計師,如果想在Ubuntu16桌面版上使用OpenCV4的服務,可以下載自己所需版本的OpenCV原始碼,然後自己動手編譯java庫和so庫,這樣就可以在java程式中使用了
  • 本文詳細記錄OpenCV4的下載和編譯過程,然後寫一個java程式驗證是否可以成功呼叫OpenCV4的庫,總的來說分為以下幾步:
  • 安裝必要應用
  • 配置java環境
  • 配置ANT環境
  • 下載原始碼
  • 編譯前的配置
  • 編譯
  • 安裝
  • 驗證
  • 注意:<font color="red">本文的操作全部以非root賬號執行</font>

環境和版本

  1. 作業系統:16.04.7 LTS(桌面版)
  2. java:1.8.0_311
  3. ANT:1.9.16
  4. OpenCV:4.1.1
  • 接下來開始操作,我這裡是個新裝的純淨版Ubuntu16

安裝應用

  • 執行以下命令安裝所有應用,如果有個別提示失敗的可以多試幾次:
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,解壓後是名為<font color="blue">jdk1.8.0_311</font>的資料夾,將該資料夾移動到這個目錄下面:<font color="red">/usr/lib/jvm/</font>
  • 開啟檔案<font color="blue">~/.bashrc</font>,新增以下內容:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_311
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

配置ANT

  • 下載ANT,地址是:https://dlcdn.apache.org//ant...
  • 解壓後是名為<font color="blue">apache-ant-1.9.16</font>的資料夾,將該資料夾移動到這個目錄下面:<font color="red">/usr/local/</font>
  • 開啟檔案<font color="blue">~/.bashrc</font>,新增以下內容:
export ANT_HOME=/usr/local/apache-ant-1.9.16
export PATH=$ANT_HOME/bin:$PATH
  • 執行命令<font color="blue">source ~/.bashrc</font>
  • 檢查java和ANT安裝是否完成:
will@hp:~$ java -version
java version "1.8.0_311"
Java(TM) SE Runtime Environment (build 1.8.0_311-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.311-b11, mixed mode)
will@hp:~$ ant -version
Apache Ant(TM) version 1.9.16 compiled on July 10 2021

下載原始碼

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

編譯前的配置

  • 進入目錄<font color="blue">opencv-4.1.1/build/</font>
  • 執行cmake,生成配置資訊:
cmake -D CMAKE_BUILD_TYPE=Release -D BUILD_SHARED_LIBS=OFF -D CMAKE_INSTALL_PREFIX=./install ..
  • 要注意的是,上面的<font color="blue">-D BUILD_SHARED_LIBS=OFF</font>引數十分重要!沒有該引數時生成的libopencv_java411.so大小隻有1532128,有了該引數libopencv_java411.so大小是78169672
  • 上述命令執行完畢後,請檢查控制檯輸出的資訊,如下圖所示,"java"必須出現在<font color="blue">To be build</font>的欄目中,否則正式編譯時不會編譯java相關的庫:

在這裡插入圖片描述

  • 以下是部分配置成功的輸出資訊,用於參考:
--   Python (for build):            /usr/bin/python2.7
-- 
--   Java:                          
--     ant:                         /usr/local/apache-ant-1.9.16/bin/ant (ver 1.9.16)
--     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
--     Java wrappers:               YES
--     Java tests:                  YES
-- 
--   Install to:                    /home/will/temp/202110/30/003/opencv-4.1.1/build/install
-- -----------------------------------------------------------------
-- 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/will/temp/202110/30/003/opencv-4.1.1/build

編譯

  • 在<font color="blue">opencv-4.1.1/build/</font>目錄執行以下命令即可開始編譯原始碼,引數<font color="red">-j6</font>表示六個執行緒並行編譯(我的電腦是6核CPU,您請酌情處理):
make -j6
  • CPU迅速上漲了:

在這裡插入圖片描述

  • 我這裡大約10分鐘不到,完成編譯

安裝

  • 在執行cmake命令的時候,已經用<font color="blue">CMAKE_INSTALL_PREFIX=./install</font>引數指定了安裝目錄在<font color="red">opencv-4.1.1/build/install</font>,現在執行安裝命令就會將OpenCV的庫安裝到這個目錄下
  • 執行安裝命令<font color="blue">make install</font>,如果控制檯沒有<font color="red">error</font>相關的資訊,就算安裝成功了
  • 進入install目錄看看,裡面有四個目錄:
bin  include  lib  share
  • 進入目錄<font color="red">opencv-4.1.1/build/install/share/java/opencv4</font>,裡面已經生成了我們需要的jar和so庫:
opencv4/
├── libopencv_java411.so
└── opencv-411.jar

驗證

  • 終於,檔案已經準備好了,接下來寫一個java應用驗證OpenCV庫能否正常使用
  • 我這裡用的是IDEA,新建一個java工程,名為<font color="blue">opencv-demo</font>
  • 依賴本地jar,設定方法如下:

在這裡插入圖片描述

  • 選中剛才生成的opencv-411.jar

在這裡插入圖片描述

  • 新建Main.java檔案,如下所示,功能是新建視窗展示本地圖片,請自行準備圖片並修改為合適的位置:
package com.company;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import static org.opencv.highgui.HighGui.*;
import static org.opencv.imgcodecs.Imgcodecs.imread;

public class Main {

    public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

        Mat mat = imread("/home/will/temp/202110/30/pics/111.png");

        if(mat.empty()) {
            System.out.println("Image not exists!");
            return;
        }

        namedWindow("src", WINDOW_AUTOSIZE);
        imshow("src", mat);

        waitKey(0);
        
        // 這一句很重要,否則按下任意鍵後看不到視窗關閉的效果
        System.exit(0);
    }
}
  • 最後,也是非常重要的一步,就是指定so庫的位置,點選下圖紅框處:

在這裡插入圖片描述

  • 增加一個VM Options引數java.library.path,值就是剛才建立的libopencv_java411.so所在目錄,如下圖紅框所示:

在這裡插入圖片描述

  • 設定完成後執行Main.java,得到結果如下,左側就是顯示本地圖片的視窗:

在這裡插入圖片描述

  • 至此,OpenCV的java庫和so庫的生成和驗證就完成了,如果您也是使用OpenCV的java程式設計師,希望本文能為您帶來一些參考;
    https://github.com/zq2599/blog_demos

相關文章