JavaでOpenCV_Contrib(ArUco)を使う！(前編 - ビルド編)(OpenCV-3.4.4)

#はじめに(?)
研究でARマーカーを使ったほうがいい場面に出くわしたのでARマーカーを認識できるライブラリを探してArUcoというものに出会いました。この記事は、ArUcoライブラリを使えるようになるまでの方法について示しています。なお、Javaを使っているのは自分がC/C++/C#が使えないからです。

また、OpenCVをJavaで使うのはめっちゃ面倒だということを宣言しておきます。使っている人がものすごく少ないようで、。コード例や質問は英語でみても少ないです。
しかしながら、Pythonよりも実行速度が早いため、使い所は多くあると思っています。

##OpenCV
OpenCVとは、画像処理のオープンソースライブラリで、かなり広く使われています。
思いついたことはだいたい関数を組み合わせるとできるというぐらい幅広くカバーされています。

##OpenCV_Contrib
OpenCV_Contribとは、OpenCVにおいて最新の技術を中心としたものが補助としての扱いを受けているライブラリです。
また、本体を使うのみであればビルドは不必要です。[OpenCV.org](https://opencv.org/) (公式ページ)からダウンロードすれば入手できます。
しかし、OpenCV_Contribは補助的な扱いを受けているためか自分でビルドする必要があるようです。
このページではこのビルドの方法について

##ArUco
ARを行えるライブラリ。ARマーカーの生成、認識ができます。(コード等は次回、記載します。)

#準備
##ダウンロード
| ダウンロードするもの       |       説明 |
|------------------|-------------------|
| [OpenCVのプロジェクト・ソース](https://github.com/opencv/opencv/releases) | 必ずConribとバージョンを合わせてください。<br>自分はVersion: 3.4.4を使っています。 |
| [OpenCV_Contribのプロジェクト・ソース](https://github.com/opencv/opencv_contrib/releases) | 必ずConribとバージョンを合わせてください。<br>自分はVersion: 3.4.4を使っています。 |
| [CMake](https://cmake.org/download/) | 適当に。 |
| Visual Studio | 自分は、Visual Studio Community 2017を使いました。(C++コンパイラーとかは入れる必要があった気がします…) |
| [Python](https://www.python.org/downloads/) | Javaを使うときでも多分必要です。<br>自分はVersion: 3.7.1を使っています。 |
| [JDK](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) | 自分は、Java8u191を利用しています。 |
| [Ant](http://ant.apache.org/bindownload.cgi) | 自分は、Version: 1.10.5を利用しています。 |

##インストール
OpenCV, OpenCV_Contribのプロジェクト・ソースは展開してください。
CMake, Visual Studioは各自でインストールしてください。

###Java, Ant環境変数
これが意外と曲者？で、正しく設定しないとビルドできません。(私はここでハマりました)

| ダウンロードするもの       |       説明 |
|-----------------|------------------|
| `ANT_HOME` | 展開したAntのフォルダ。<br>(ex: `C:\SOFT_File\apache-ant-1.10.5`) |
| `JAVA_HOME` | Javaのインストールされているフォルダ。<br>(ex: `C:\Program Files\Java\jdk1.8.0_191`) |
| `Path` | 次の内容を**追加**してください。<br>`C:\Program Files\CMake\bin`,  `%ANT_HOME%\bin`, `%JAVA_HOME%\bin`<br>(ex: `C:\Program Files\CMake\bin;%ANT_HOME%\bin;%JAVA_HOME%\bin;` ) |

#CMakeの実行
ビルドをする前にCMakeでビルドの準備をしないといけないらしいので行います。

| 項目 | 値 |
|-----------------|------------------|
| `Where is the source code` | 展開したフォルダのパスを指定します。<br>(ex: `C:/SOFT_File/opencv-3.4.4`) |
| `Where to build the binaries` | 私は展開した本体ライブラリの下にbuildフォルダを作ってこのフォルダのパス指定しました。<br>(ex: `C:/SOFT_File/opencv-3.4.4/build`) |

これらを指定したら、「Configure」を押してください。
この時、コンパイラーを指定します。
今回はビルドでVisual Studioを使うので、Visual Studio(バージョンに合うもの)を指定しましょう。
(自分は「Visual Studio 2017 Win64」を選択しました)

すると、赤いものがば～っと出てくるが気にせず。
「Grouped」, 「Advanced」のチェックボックスを両方有効にします。

| 項目 | 値 |
|-----------------|------------------|
| `OPENCV_EXTRA_MODULES_PATH` | 展開したOpenCV_Contribの親フォルダの**下にあるmodules**を指定します。<br>(展開したOpenCV_Contribの親フォルダではないです) |

もう一度、Configureを押します。

「BUILD_SHARED_LIBS」のチェックボックスを無効にしてください。
(参考: http://answers.opencv.org/question/189941/java-cant-find-dependent-libraries/)

またもう一度、Configureを押してください。

「BUILD_FAT_JAVA_LIB」のチェックボックスを有効にしてください。

さらにもう一度、Configureを押してください。

この時、赤い物が出ていなければOKです。
出ていれば、修正をお願いします。

ここで、ログの出力を確認します。
特にJavaのところがちゃんと以下のようになっているか確認してください。(あくまで例ですが)

```
  Java:                          export all functions
    ant:                         C:/SOFT_File/apache-ant-1.10.5/bin/ant.bat (ver 1.10.5)
    JNI:                         C:/Program Files/Java/jdk1.8.0_191/include C:/Program Files/Java/jdk1.8.0_191/include/win32 C:/Program Files/Java/jdk1.8.0_191/include
    Java wrappers:               YES
    Java tests:                  YES
```
全文: https://pastebin.com/u2Qiy5EL

問題がなければ、
「Generate」を押してください。

完了しましたら、「Open Project」を押してください。
すると、Visual Studioが起動します。(次項へ)

#Visual Studioでビルドをする
いろいろ読み込みを行うため、しばらく待ちます。
真ん中のほうにある「Release」/「Debug」を「Release」にします。また隣のやつを「x64」にしてください。
上のメニューバーの 「Build」 → 「Batch Build」を押してください。
`ALL_BUILD`と`INSTALL`をともにチェックして、実行してください。

かなーり待つ(1hぐらい？)と、先程にCMakeで`Where to build the binaries`で指定したフォルダ(ex: `(OpenCVの展開フォルダ)/build/install`)に生成されているはずです。

![SC_java_2018-12-8_0-25-40_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/211361/653fb48b-57bb-3181-edb2-4a7e87c49a89.png)

生成されていない、またはこの記事に問題があれば、コメントをおねがいします。

#参考
・[Windows10でOpenCV3.4.1とopencv_contrib環境構築](http://tecsingularity.com/opencv/opencvcontrib/)
新しい内容で、画像も多く使われていておすすめ。

・[Building OpenCV Using MinGW on Windows - You, Myself and Community] (https://zami0xzami.wordpress.com/2016/03/16/building-opencv-using-mingw-on-windows/)
・[Building Java Wrapper For OpenCV - You, Myself and Community] (https://zami0xzami.wordpress.com/2016/03/16/building-java-wrapper-for-opencv/)
↑Java版として一番わかりやすかった。

・[OpenCVの環境構築（OpenCV 3.0／3.1） - Build Insider] (https://www.buildinsider.net/small/opencv/003)
・[初めてのOpenCV開発 ― CMakeを使ったOpenCVのカスタマイズ【OpenCV 3.1.0】 - Build Insider](https://www.buildinsider.net/small/opencv/008
)
・[Installing OpenCV for Java — OpenCV Java Tutorials 1.0 documentation]( https://opencv-java-tutorials.readthedocs.io/en/latest/01-installing-opencv-for-java.html)
・[OpenCV.org(公式ページ)](https://opencv.org/)
・[OpenCV - Wikipedia](https://ja.wikipedia.org/wiki/OpenCV)
・[Java版OpenCV入門](http://opencv.blog.jp/java/nyumon)

#次回
次回は、実際に軽いプログラムを動かしてみたいと思います。

→ [JavaでOpenCV_Contrib(ArUco)を使う！(後編 - プログラミング編)](https://qiita.com/smk7758/items/1ca1370f78cad1233d02)