ラズパイにJava OpenCV 環境セットアップ

この記事の概要

  1. JavaCV for Raspberry Piをインストール
  2. ラズパイ用OpenCVのセットアップ → 失敗、C言語,Pythonでのインストールだった。
  3. Mac用OpenCVのセットアップ※古いです。

イントロダクション for JavaCV

下の方に記述している、書くOpenCVのインストールに関して、インストールは結局C言語とPythonでの利用時のインストールになっていました。
どうやら「JavaCV」がインストールするべきものだったようです。
上記のリンクを参考に実行すると下のようなコマンドをたたきます。

jarファイルのダウンロードはこちらからできるようです。

ここから jar をダウンロードすることができます: https://drive.google.com/folderview?id=0B0lFIImWo61bc3pTTHdZN3NmNkE&usp=sharing

すべてのコンパイラ ツールとビデオ ライブラリを取得

下のコマンドをたたき、必要なツールをインストールする

sudo apt-get update
sudo apt-get install build-essential cmake pkg-config libpng12-0 libpng12-dev libpng++-dev libpng3 \n
libpnglite-dev libpngwriter0-dev libpngwriter0c2 zlib1g-dbg zlib1g zlib1g-dev pngtools libtiff4-dev \n
libtiff4 libtiffxx0c2 libtiff-tools libjpeg8 libjpeg8-dev libjpeg8-dbg libjpeg-progs ffmpeg libavcodec-dev \n
libavcodec52 libavformat52 libavformat-dev libgstreamer0.10-0-dbg libgstreamer0.10-0  libgstreamer0.10-dev \n
libxine1-ffmpeg  libxine-dev libxine1-bin libunicap2 libunicap2-dev libdc1394-22-dev libdc1394-22 libdc1394-utils \n
swig libv4l-0 libv4l-dev

システム内のSOファイルをリンクする

sudo ldconfig

JavaCVのソースを取得

git clone https://github.com/bytedeco/javacv.git

OpenCVと接続するためのC++のソースを取得

git clone https://github.com/bytedeco/javacpp.git

JavaCVのソースをコンパイルする

cd javacv
mvn clean install -Dplatform.name=linux-arm

イントロダクション for Raspberry Pi

OpenCVをラズパイにインストールして、定点観測をやりたいと思いました。
そんなわけで、早速セットアップを行いたいと思います。セットアップする項目としては以下の通りです。

  • GUI作成用のJavaFXのインストール
  • OpenCVのインストール
  • ハローOpenCV プログラムの実行確認

JavaFXのインストール

ラズパイにJavaFXをインストールします。OpenCVのチュートリアルでは、JavaFXを使用していました。
コーディング喪服勝っていますが、下のような感じで動きました。(Eclipse使用)

そんなわけで、今度はラズパイにJavaFXを準備したいと思っております。

JavaFXのセットアップ in RPi

参考にするサイトは、こちらのオラクルのサイトです。
上記の記事は、「JavaFXはJava11に同梱されているので、Java11をインストールしてね」という内容でした。

Javaのインストール

下のコマンドでインストールできます。

$ cd /home/pi 
$ wget https://download.bell-sw.com/java/13/bellsoft-jdk13-linux-arm32-vfp-hflt.deb 
$ sudo apt-get install ./bellsoft-jdk13-linux-arm32-vfp-hflt.deb 

下のコマンドは、各コマンドの設定を変更するものです。※インストールは上で終わり
インストールしたJavaのバージョンを11に切り替えます。

$ sudo update-alternatives --config javac
$ sudo update-alternatives --config java

インストールができたら、下のコマンドで確認します。

$ java --version 
openjdk version "13-BellSoft" 2019-09-17 
OpenJDK Runtime Environment (build 13-BellSoft+33) 
OpenJDK Server VM (build 13-BellSoft+33, mixed mode)

OpenCVのインストール(for Linux)

ラズパイはLinuxです。なのでこちらのチュートリアルにある内容のLinuxの部分を読み進めます。

必要なものをインストールする

次のものが必要になります。参照先は次の\リンク先に記述しています。

Antはsnapをインストールしてからになるので次のようにコマンドをたたきます。

sudo apt update
sudo apt install snapd
sudo reboot
sudo snap install ant --classic

CMakeのインストール

> sudo apt-get -y install cmake
> which cmake
/usr/bin/cmake
> cmake --version
cmake version 2.8.12.2

最新版が欲しい場合は、こちらのリンクからどうぞ

CMake GUIもインストール

※注意点

ここの操作で注意するべきは、次の通りです。

  1. インストールしているJDK、の場所を指定してやるというところです。
    筆者の場合は「/usr/lib/jvm/java-11-openjdk-armhf/」が、その場所なのでJAVAの項目を変更しています。※動画は変更していません。

  2. こちらのサイトを参考にしました。下のコマンドでインストールできます。
    Configureが完了したときには下のように画面が白くなっていることを確認する

    CMake-Guiのインストール

    > sudo apt-get -y install cmake-qt-gui
    > which cmake-gui
    /usr/bin/cmake-gui
    > cmake-gui --version
    cmake version 2.8.12.2

OpenCV(ライブラリ)のダウンロード

こちらのリンクにコマンドがあります。
ソースからビルドする方法です。結構時間がかかります。

# Install minimal prerequisites (Ubuntu 18.04 as reference)
sudo apt update && sudo apt install -y cmake g++ wget unzip
# Download and unpack sources
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.x.zip
unzip opencv.zip
# Create build directory
mkdir -p build && cd build
# Configure
cmake ../opencv-4.x
# Build
cmake --build .

上記でJARができない?

上の操作を行ったけど、肝心のJARが作成されませんでした。もう一度調べOpenCV4の方の手順を使用することにしました。
こちらのページになります。

手順

全部コマンドで実行します。下のコマンドをたたいていくだけです。

  1. OpenCVのZIPファイルをダウンロード
  2. ZIPファイルを解凍
  3. opemcv-4.xという名前のフォルダをopencvに変更
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.x.zip
unzip opencv.zip
mv opencv-4.x opencv

次はビルドするコマンドです。

  1. 出力用のフォルダbuildを作成
  2. cmakeコマンドを実行
  3. makeコマンドの実行、オプション「-j4」をつけ忘れないように注意
  4. make installの実行
mkdir -p build && cd build
cmake ../opencv
make -j4
make install

色々やってみたが、JARファイルが作成されませんでした。。。

ハローOpenCV

JavaでOpenCVが動くことを確認します。
これがハローワールドのもう一つの役目です。早速コードを書きます。

【前提】
上記で作成したライブラリをビルドパスに追加する。
コマンドで実行する場合は下のように行う「/opencv/build/lib」は上記でビルドしてできたJARファイルが配置されているディレクトリになる。

-Djava.library.path=/opencv/build/lib

そして、ハローワールドのコードです。

public class HelloCV {
        public static void main(String[] args){
                System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
                Mat mat = Mat.eye(3, 3, CvType.CV_8UC1);
                System.out.println("mat = " + mat.dump());
        }
}

実行方法

ズバリ、プロジェクト直下で次のコマンドを実行します。コマンドの内容としては次の通りです。

  • JavaCVのJARファイルを参照するようにCPオプションを指定する
    ※CLASSPTH変数を定義してやるとコマンドでHelloCVクラスの参照ができなくなる
  • -DオプションでDLLファイルのあるディレクトリを指定する
  • パッケージ名を含めたクラスの完全修飾名で起動するクラスを指定する
java -cp ".;C:\OpenCV\opencv\build\java\opencv-480.jar" -Djava.library.path="C:\OpenCV\opencv\build\java\x64" "src.main.java.cam.HelloCV"

IDE開発ツールの用意

デフォルトでインストールされているGeanyを使用します。
BlueJだとパッケージを開くたびにウィンドウを開くのである程度の大きさ、ファイル数になるとコーディングが大変なので、今回は使用しません。

インストール

こちらの本家サイトからダウンロード(Windows)

Linux、ラズパイなど

sudo apt-get install geany
sudo apt-get install geany-plugins

インントロダクション for MacOS

画像解析処理を行いたく思い「OpenCV」をセットアップします。

brewコマンドでインストールなどもできる様ですが、GitでPULLするのが一番早いと思いましたので、そのようにやります。

そもそも。。。

機械学習の理解をしようと色々と試みましたが、撃沈。。。(TensorFlow関連では基本的なこと、モデルの作成の理論までは理解できなかった)ので、OpenCVで機械学習を学ぼうとなりました。

OpenCVには色々な「アルゴリズムを使」うとか、ベクトル、パターン認識、特徴量の計算など「機械学習で必要になるであろう」事が記載されていました。

必要な工程

  1. Eclipseのインストールなどのセットアップ
  2. OpenCVのインストール(ここから記載します)
  3. OpenCVのJARファイルとOpenCVのC言語資源(ソース) インストール
  4. OpenCVの起動確認

OpenCVのインストール(makeコマンドを使う)

コマンドを叩いていけばOKですので。。。

参考サイト :本家家元OpenCVのページです。

参考サイト2:JavaでのOpenCVのページ。Javaでやるのでこちらを参照。

 

以下のコマンドを実行します(gitはインストール済みの場合)

>git clone git://github.com/opencv/opencv.git

gitのインストール:このページを参照しました。

>brew install git

そして以下のコマンドと続きます(対象のバージョンは「3.4.3」

>cd opencv
>checkout 3.4.3
>mkdir build
>cd build
>cmake -DBUILD_SHARED_LIBS=OFF ..

そして処理が流れ始め。。。

javaフォルダができたかな?と思いきや。。。「ない」

そんな時は下のコマンドを叩く様です。

>export JAVA_HOME=/usr/lib/jvm/java-6-oracle
>cmake -DBUILD_SHARED_LIBS=OFF ..

「/usr/lib/jvm/java-6-oracle」の部分は自分のマシンで使用するJDKの場所を指定します。自分の場合は以下の様になります。

>export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/
>cmake -DBUILD_SHARED_LIBS=OFF ..
>make -8j

そして、ビルドの結果

javaフォルダがない。。。

と思ったらopencv/binの中にありました。

そんなわけで、以下のコマンドでファイルをビルドパスに繋げやすい様にファイルを移動します。

>cp ./bin/opencv-343.jar ~/Java/OpenCv/
>cp ./lib/libopencv_java343.dylib ~/Java/OpenCv/

リンク先のファイルが「libopencv_java343.dylib」とは違う様ですが、このファイルで良い様です。

Eclipseのプロジェクトを右クリック > Build Pathを選択

Native Libraryを選択して。。。

Native libraryにOpenCVを登録(設定)します。

そして、実行!撃破!!

ソースは下の様になりました。対象のライブラリ部品から定数で参照する値は名前が違う場合がある様です。。。なのでハードコーディング(笑)

import org.opencv.core.CvType;
import org.opencv.core.Mat;

/**
 * OpenCVの部品を実行するクラス。
 * 
 * @author takunoji
 *
 * 2018/11/11
 */
public class ReceiptCv {
    static {
        System.loadLibrary("opencv_java343");
    }
    public static void main(String[] args) {
        new ReceiptCv().helloCv();
    }

    public void helloCv() {
        Mat m = Mat.eye(3, 3, CvType.CV_8UC1);
        System.out.println("m = " + m.dump());
    }
}

そしてImShow(画像表示)→OpenCV3.Xではできません。

OpenCVの3.XからはHightGUIを使用しないようです。なのでJavaFXでイメージの表示を行います。「Java OpenCv Hello in Java〜OpenCv事始め〜

旧バージョンでのImShowメソッドの使用方法

JARファイルをGitから直接ダウンロードします。

Imshow.jarを直接ダウンロードします。

Downloadボタンをクリックしてダウンロードします。

BuildPathをJARファイルに通します。

プロジェクトを右クリック > BuildPath

「Add External Jar」でダウンロードしたファイルを追加します。

実際の作業

https://www.youtube.com/watch?v=ZlTZDoYCAS8

次は、画像の表示をするための準備を行います。

ImShowのメソッドが使えないのでJavaFXによる画像表示GUIを作成していきます。

参考サイトはこちらです。

ちなみにチュートリアルでは「シーンビルダー」をインストールして画面の土台を作っています、下のような感じです。

関連ページ一覧

<JavaFXの準備>

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~

<TensorFlow関連>

 家計簿アプリ作成

  1. Eclipse アプリ作成 Lv1〜家計簿を作る準備〜
  2. Eclipse アプリ作成 Lv2〜家計簿を作る土台作り〜
  3. Eclipse アプリ作成 Lv3〜3Dグラフ用Cube作り〜
  4. Eclipse アプリ作成 Lv4〜3Dグラフ用Cubeに高さを与える〜
  5. Eclipse アプリ作成 Lv5〜惨敗:CubeにTextureを貼る〜
  6. Eclipse アプリ作成 Lv7〜Cubeを日付順に並べる〜

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す