軽量IDE Geanyをインストールする

イントロダクション

ラズパイとWindowsにOpenCVをインストールして、次のような形で開発がしたいと思い環境構築をすることにしました。

  1. WindowsでOpenCVの実装をする
  2. ラズパイでOpenCVを起動する

そして、ラズパイではIntellJなどの開発ツールが遅いので「Geany」という開発ツールを使用することにしました。使用しているラズパイは32ビットです。

ラズパイへのインストール

Raspberry Pi OSにはデフォルトでインストールされているようです。追加で下のコマンドをたたきます。

apt-get install geany-plugins

これで、プロジェクトを設定して起動することができます。

そして、Gitからクローンします。

Windowsへのインストール

Geanyのサイトでダウンロードできます。
ダウンローするのはインストーラー(*.msi)なので、クリック一発でインストールできます。
そして、プラグインも同様にGenyサイトからダウンロードできます。

ダウンロードして実行したら下のような形でセットアップします。

Mavenプロジェクトの設定

  1. Mavenをインストールする
    こちらのApacheサイトからダウンロードします。ダウンロードしたら、適当な場所に解凍してその場所を環境変数の「PATH」に追加します。

  2. JAVA_HOMEを設定する
    環境変数に「JAVA_HOME」を追加します。その時に、「bin」まで設定しないようにしましょう。

これで、Mavenを使用できます。Linux上では、コマンドで実行しますのでWindowsでも困んで実行できるようにしておくと後が楽です。

実際に筆者は、下記でOpenCVでのハローワールドを実行したのですが、大分苦労しました。結局のところはCLASSPATH変数を定義するとパッケージ指定でのコマンド実行ができなくなるので、CPオプションで実行するのが良いという結論に至りました。

実行

Geanyでコンパイルのコマンドを設定します。

上部のメニュー、ビルド→ビルドの設定で下のような画面を開きます。タブは「ビルド」を選択します。

文字 意味
%f メニュー項目が選択されたときにエディタで選択されたファイルのファイル名に置き換えられます。
%e 同じファイル名で置き換えられますが、最後の拡張子は付きません。
%d メニュー項目が選択されたときにエディタで選択されたファイルのディレクトリの絶対パスに置き換えられます。
%p 現在開いているプロジェクトのベース ディレクトリの絶対パスに置き換えられます。

コンパイル

javacコマンドに次のパラメータを設定します。CPオプションで「JARファイル、ライブラリ」のパスを設定します。

javac -cp "C:\OpenCV\opencv\build\java\opencv-480.jar;C:\OpenCV\opencv\build\java\x86" "%f"

実行

javaコマンドに以下のパラメータを設定します。CPオプションでJARファイル、-DでシステムプロパティにOpenCVのDLL(もしくはSO)ファイル

ちなみに、CPオプションの一番初めにある「.」はカレントディレクトリを示します。なのでコマンドを実行するときの現在位置もクラスパスに追加する形で実行します。

java -cp ".;C:\OpenCV\opencv\build\java\opencv-480.jar" -Djava.library.path="C:\OpenCV\opencv\build\java\x64" "src.main.java.cam.HelloCV"

コマンドからの実行結果です。ちなみに、こまんどぷろんぷとでは、「promt $$」とコマンドをたたいているので、パスがコマンドプロンプトに表示されていません。

ラズパイでJavaFXの開発環境を整える

イントロダクション

ラズパイでJavaCVを使った定点観測アプリを作成したいと思っております。
そんなわけで、次のような要件で、開発環境を整えたいと思っております。

  • ラズパイでソースをGitからPULLして、コンパイル、実行する
  • ウィンドウズでプログラムの作成とテスト
  • Gitにソースをコミット

ラズパイで開発環境を整える

まずは、ラズパイでJavaCVプログラムが動かせることを確認しないといけません。なので、JavaCV版のハローワールドを実行します。

まずは、開発ツールとしてGeanyを使用します。

UnsupportedClassVersionError

ラズパイで、Javaのハローワールドを実行してみました。Geanyでのプログラム実行が初めてだったので。。。
すると下のようなエラーがでました。

Error: LinkageError occurred while loading main class Test1
    java.lang.UnsupportedClassVersionError: Test1 has been compiled by a more recent version of the Java Runtime (class file version 57.0), this version of the Java Runtime only recognizes class file versions up to 55.0

原因を調べてみると、次のような結果が出ました。

  • 使用しているjavaコマンドのバージョン:Java11
  • 使用しているjavacコマンドのバージョン:Java13

なるほど。。。次のコマンドで、バージョンを変更しました。
【Javaコマンドのバージョン】

sudo update-alternatives --config java

【Javacコマンドのバージョン】

sudo update-alternatives --config javac

JavaFXのインストール

ライブラリを配置するだけです。
GLUONサイトからJARファイルをダウンロードします。

ライブラリの読み込み

Linux では次のように動作します。

java -cp "Test.jar:lib/*" my.package.MainClass

区切り文字はセミコロンではなくコロンです。

ラズパイのGeanyでプロジェクト作成

デフォルトの状態では、プロジェクトが作成できないみたいなので、次のようにプラグインをインストールします。【Debia系OS】※Ubuntsuやラズパイ

sudo apt-get install geany-plugins

そして、プロジェクトの作成ができたら使用するライブラリをコンパイル時に追加するようにjavacコマンドを記述します。

javac -cp "ライブラリ(JARファイル)へのパス" "%e(クラス名を示す)"

とりあえずは、こんな感じです。

WindowsのGeanyでプロジェクトの作成

Windowsの場合はインストーラーがあるので、それぞれにインストーラーをダウンロードします。

これでGeanyのインストールは完了です。ラズパイには、初めからインストールされています。

ポイントはWindowsでもラズパイでも同じ開発ツール(IDE)を使用するというところです。

Mavenも使いましょう。

Mavenというビルドツールがあります。これを使うとコマンドでいろいろとできます。
例えば、ライブラリのインストールなどは、POMファイルに文言を追加して、再度ビルドすればPCにインストールできます。

そして、ラズパイ上でも同様に動きますので、プロジェクトの生成やプロジェクトのインストールなどできます。

プロジェクトの生成

Mavenプロジェクトのインストール

Windowsでのプロジェクトのインストール

Windows IOT with RPi ~ラズパイ x JavaでLチカをやってみる~

イントロダクション

ラズパイでJavaプログラミングをやりたいと思っていたのですが、なかなか着手できずにいましたが、昨日LANのインターフェースを買ってきました。

これで、Windowsと接続してIOTしたいなと思っている次第です。

Widnows IOT

はじめに、IOTというとArduino、ichigo-jam、Microbitなどもあるのですが、Javaプログラミングをやりたかったらラズパイになります。
容量的にラズパイクラスのPCでないと動かないためです。JavaMEも残念ながらArduinoなどではデータのサイズが足らない状態です。。。

Microsoftの「Windows Iot for Raspberry Pi」を参考にして学習していきます。

VNCセットアップを行う

次に、WindowsPCからラズパイにアクセスして作業がやりたいので、リモート接続(リモートデスクトップ)の設定を行います。

Windows PCに接続する動画があるのでそれを見ると早いです。

この動画を見ると、必要な機材から丁寧に説明してくれている。残念ながら英語で説明してくれている。。。
日本語版があるといいんだけど。。。

一時停止ながら聞いていくと、WindowsIotのスターターパックみたいなのも、あるようです。

ラズパイの接続

筆者は、自力でラズパイをインストールしたので、インストール済みのラズパイを接続しました。WindowsIotの場合はSDカードのインストールからやるようです。

調べてみると、リモート接続でVNCを使用するようです。セキュリティ的に「xrdp」を使用する方法は、できなくなったようです。※Raspberry DeskTop

VNC接続手順

ラズパイに、VCNの設定を行う。

  1. ラズパイのメニュー→設定→インターフェースを開く右上の「V2」があることを確認

  2. SSH、VNC、I2Cの3つを「ON」に設定します。OKボタンを押下

  3. V2というのが右上部に表示されるのでそれをクリックしてIPアドレスをメモなどで覚えておきます。

  4. WindowsでVNC Viewerをインストールします。
      WindowsにインストールしたVNCビューワーで表示します。

いろいろとインストールする

まずここで使用したいものは「Py4J」というライブラリです。これはJavaからGPIOを使うために必要になります。
同様に、作成したプロジェクトを管理、学習のためにチェックアウトしたい時に便利な「Maven」をインストールしたいと思います。

まずは、ラズパイのアップデートをしましょう。

sudo apt update

Py4Jのインストール

Py4Jのサイトを参考にします。

ネットワーク接続がうまくいかなかったので、とりあえず、手動インストールしました。

  1. ここからDEBファイルをダウンロード※上記のリンク先にあります。
  2. VNC Veiwerでファイルを送信
  3. 「sudo dpkg -i pi4j-1.2.deb」コマンドでインストール

WringPiをインストール

下のコマンドでインストールします。やることはGitからソースを取得してビルドする。ということです。

git clone https://github.com/WiringPi/WiringPi.git
cd WringPi
./build

インストールできたら、確認します。

gpio -v

pigpioのインストール

sudo apt-get install pigpio

Mavenのインストール

次のコマンドで一発インストール

 sudo apt install maven -y

Javaのインストール

Oracleのサイトに次の文章がありました。

ありがたいことに、BellSoftがLiberica JDKを提供しています。

というわけで、次の手順でインストールします。

  1. 上のリンク先からDEBファイルをダウンロード
  2. VNC Viewerでファイル送信
  3. インストールをします。
  4. Javaのバージョンを切り替える

Javaを動かす

そして、Javaに触ります。ラズパイには、BlueJというIDE(開発ツール)がデフォルトでインストールされています。そして、チュートリアルのプロジェクトも入っています。

入ってない場合

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

sudo apt-get install bluej

チュートリアル

詳細は、BlueJのチュートリアルサイトにありました。
プロジェクト名が「LEDチュートリアル」のようです。ここをクリックするとダウンロードできます。

ダウンロードしたら、VNC Vewerでファイルをラズパイに送信できます。

BlueJを起動して、Controllerクラスを実行するのには、Controllerクラスを右クリックして、「new」してやれば実行できます。

余談

プログラムの実行というとメインメソッドを探してしまうのですが、BlueJの場合は、コンストラクタを実行することができるので、メインメソッドを探さなくてもよさそうです。BlueJがSwingで動いているからかな?

しかしエラーが。。。

早速プロジェクトを実行してみたら、下のようなエラーが出た。

重大: Unable to load [libpi4j.so] using path: [/lib/raspberrypi/dynamic/libpi4j.so]

原因は、そのまんま「「libpi4j.so]が見つからない」というエラーでした。
なので、これをダウンロードしてプロジェクト直下に配置してやるのが解決策でした。手順は以下の通りです。

libpi4j.soを取得

Py4Jのページにパスの指定方法が書いてありました。Javaを起動するときに下のようにやります。

ライブラリ取得先

上記のページに記載がありました。

ネイティブ ライブラリの入手先
Pi4J ネイティブ ライブラリは、アーキテクチャ固有のファイルを抽出することで取得できます。libpi4j-xxx.soプラグイン JAR ファイルのリソースからファイルを取得します。

さらに、Pi4J ネイティブ ライブラリは、Maven リポジトリで独立したアーティファクトとして公開されます。 https://oss.sonatype.org/#nexus-search;quick~pi4j-library-pigpio

libpi4j.soを参照する

ダウンロードしてきたファイルをBlueJプロジェクトで参照しないといけません。参照する方法は次のような3パターンがあります。

パターン1

Javaコマンドの実行時にVM引数を渡してやる方法。

java --Dpi4j.library.path="system" ...
-or-
java --Dpi4j.library.path="local" ...
-or-
java --Dpi4j.library.path="/some/directory" ...

パターン2

プログラムでシステムプロパティを追加する方法

System.setProperty("pi4j.library.path", "/some/directory");
-or-
System.setProperty("pi4j.library.path", "system");
-or-
System.setProperty("pi4j.library.path", "local");

パターン3

実行しているBlueJプロジェクトのフォルダに直接配置。下の画像のように配置します。

JavaでLチカをやってみる

準備ができたので、今回の目的であるLチカに着手したいと思います。

コードの分析

Controllerクラスを解析します。ちなみに、ラズパイにもともと入っていたコードです。

READMEを読む

Project "LEDButton"
Authors: Fabio Hedayioglu, Ian Utting and Michael Kölling

飛ばします。

This project is part of the material for the tutorial for BlueJ on the Raspberry Pi.

このプロジェクトは、Raspberry Pi 上の BlueJ のチュートリアルの素材の一部です。

 It is Part of the first and second tutorial: GPIO: LED and GPIO: Button.

最初と 2 番目のチュートリアルの一部です: GPIO: LED および GPIO: ボタン。

This is a simple object to demonstrate the use of an LED and a Button
connected to the Raspberry Pi using GPIOs.

LED とボタンの使用法を示す簡単なオブジェクトです。
GPIO を使用して Raspberry Pi に接続します。

You can manipulate LEDs and Buttons and interact with them either interactively
or programatically, by editing the class Controller.

LED とボタンを操作し、インタラクティブに操作できます。
または、クラス コントローラーを編集してプログラム的に。

This project is designed in such a way to make the manipulation of LEDs and Buttons
very easy and straightfoward, making it accessible even to the novice programmer.

このプロジェクトは、LED とボタンを操作するように設計されています。
非常に簡単かつ簡単なので、初心者プログラマーでもアクセスできます。

All the implementation details are isolated to the user, in order to make the
teaching and use of the LED and Button classes completely free from low level details.

すべての実装の詳細は、ユーザーに分離されます。
LED およびボタンのクラスの教育と使用には、低レベルの詳細は一切含まれません。

The LED and Button classes are flexible and can be used in general purpose projects.

LED クラスと Button クラスは柔軟性があり、汎用プロジェクトで使用できます。

コード内容

下のコードを読んでみると次のようにまとめられます。

  1. LEDは6ピンを使用、ボタンは7ピンを使用する。

つまり、GPIOの6番ピンでLED、ボタンは6番とチュートリアルにあるが、これは、今回使用しているラズパイ3とモデルが違うようなので、別途調べる。。。

こちらがそれのようだ。

/**
 * A controller for an LED at pin 6 and a Button at pin 7.
 * 
 * Creates an LED (called led) and a Button (called button) for you to control.
 * 
 * Class used for the BlueJ on Raspberry Pi turorial.
 * 
 */
public class Controller implements ButtonListener
{
   private LED led;
   private Button button;

   /**
    * Setup the Controller.
    */
   public Controller()
   {
       led = new LED(6);             // Create the LED at pin 6 controlled by this
       button = new Button(7);       // Create the Button at pin 7 controlled by this
       button.addListener(this);     // Make the button tell us when it has changed (See buttonChanged() below)
   }

   /**
    * Turn the led on.
    * (Exercise 1.2)
    * 
    */
   public void turnLEDOn()
   {
       //put your code here.
   }

   /**
    * Turn the led off.
    * (Exercise 1.2)
    * 
    */
   public void turnLEDOff()
   {
       //put your code here.
   }

   /**
    * Keep the LED on for a given period of time, then turn it off.
    * @param time the length of the flash in milliseconds (1/1000ths of a second).
    * (Exercise 1.3)
    * 
    */
   public void flash(int time)
   {
       //put your code here.
   }

   /**
    * Blink the LED a number of times, each time the LED is kept on for a given period.
    * (Exercise 1.4)
    * 
    */
   public void flashSOS()
   {
       // Put your code here
   }

   /**
    * To be called by the Button when it is pressed or released.
    * (Exercises 2.1, 2.2 and 2.3)
    * 
    */
   public void buttonChanged(boolean isPressed)
   {
       // Put your code here
   }

   /**
    * Returns the amount of time in milliseconds between the LED turning on and the button being pressed.
    * @return the reaction time in milliseconds.
    * (Exercise 2.4)
    * 
    */
   public int reactionTime()
   {
       // Replace the line below with your code
       return 0;
   }

   /*
    *  You don't need to change the methods below this point.
    *  They are just to help you with the examples on the web page.
    */

   /**
     * Cause the program to sleep for a short time.
     * @param milisec the number of milliseconds to sleep.
     * 
     */
    public void sleepMillisec(int millisec)
    {
        try
        {
            Thread.sleep(millisec);
        }
        catch ( InterruptedException e)
        {
        }
    }

   private static long startTime = System.currentTimeMillis();

   /**
    * The current time, measured in milliseconds since the program started.
    * @return integer with measured time in milliseconds.
    * 
    */
   public int timeNow()
   {
       return ((int) (System.currentTimeMillis() - startTime));
   }

}

実行

しかし、またエラーが。。。

6月 27, 2023 9:46:59 午前 com.pi4j.util.NativeLibraryLoader load
重大: Unable to load [libpi4j.so] using path: [/lib/raspberrypi/dynamic/libpi4j.so]
java.lang.UnsatisfiedLinkError: /tmp/libpi4j9090757756364282176.so: /tmp/libpi4j9090757756364282176.so: 間違った ELF クラスです: ELFCLASS32 (Possible cause: architecture word width mismatch)

ラズパイのOSが64ビットだった。。。32ビットしかないのでわ?

最終的に再インストール

再度インストールして、セットアップを行いました。再度トライ!
しかし、またまたエラー。。。これは、BlueJでLEDクラスをインスタンス化したときにエラーが出ました。

java.lang.UnsatisfiedLinkError: 'int com.pi4j.wiringpi.Gpio.wiringPiSetup()'

何ともならなかったので、とりあえずコマンドで実行してみました。

コマンドで実行したところ何とか動きました。しかしコマンドで動かしたいわけではないので。。。

改めてBlueJから起動したところLEDボタンが表示できました。

なぞだ。。。

ラズパイに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を日付順に並べる〜