OpenCV for AndroidをAndroid Studioに導入するメモ

# 実行環境
2016/07/07現在
- Mac OSX El Capitan(おそらくWindowsでも大丈夫です)
- Android Studio for Mac V2.1.1
- OpenCV 3.1

# OpenCVのダウンロード
[OpenCV公式サイト](http://opencv.org/downloads.html)から、OpenCV for Androidをクリックして次ページでしばらく待つとインストール開始。
<img width="242" alt="スクリーンショット 2016-07-07 14.14.07.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/75f512d6-21eb-54eb-3ca4-c01cac9c2348.jpeg">

# Android Studioで新規プロジェクトを作成
プロジェクト名は適当で構いません。プロジェクト名と保存場所を入力したら、Nextを押し、Phone and Tabletの項目のMinimum SDKのAPI Levelを覚えておいてください。(この場合だと23)

<img width="450" alt="スクリーンショット 2016-07-07 14.21.18.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/71866633-7c53-f76a-2e99-a729c077ba48.jpeg">

引き続きレイアウトをEmpty、メインクラスの名前を適当に入力したら、プロジェクト生成完了です。

# OpenCVモジュールの導入
プロジェクト生成が終了したら、「File > New > Import Module」を選択し、
<img width="503" alt="スクリーンショット 2016-07-07 14.26.50.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/6d237216-9bed-42ff-4bf8-f1524165cac1.jpeg">
次の画面のSource Directoryに「(OpenCVを展開した場所)/OpenCV-android-sdk/sdk/java」と入力。
私の場合は

```
Users/(ユーザ名)/Documents/OpenCV-android-sdk/sdk/java
```

となります。Module nameは適当で結構です。
次画面でFinishを押すと、モジュールの取り込みは完了です。

# OpenCVライブラリをプロジェクトに追加
ダウンロードしたOpenCVフォルダの中にある「sdk > native > libs」をコピーして、
<img width="500" alt="スクリーンショット 2016-07-07 14.43.38.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/269f1281-dc56-827a-25d7-fe66f33be400.jpeg">
Android Studioプロジェクトの「(プロジェクト名) > app > src > main」にペースト。そして、このフォルダの名前を「jniLibs」に変更します。
<img width="500" alt="スクリーンショット 2016-07-07 14.47.50.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/dcb97d6c-62b5-b73f-4578-15e4be31683b.jpeg">

<img width="237" alt="スクリーンショット 2016-07-07 14.48.19.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/baef212c-978a-a0d4-7377-7dcbe7c32d8d.jpeg">

# モジュールの依存関係を設定する
Android Studioの「File > Project Structure」を開き、左側にある「app」を選択した上で、右上の「Dependencies」タブを開きます。右カラム左下の「+」ボタンを押し、「Module dependency」を選択すると、先ほど取り込んだライブラリが表示されるので、それを選択して「OK」を押す。
<img width="500" alt="スクリーンショット 2016-07-07 14.54.58.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/2a6efb27-2fdc-d8e8-9555-7416d570b3ad.jpeg">

<img width="300" alt="スクリーンショット 2016-07-07 14.55.09.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/af618d80-d852-4819-72d4-96663ff74981.jpeg">

# エラーが出ます
前項目までで説明が終わっている記事が多いですが、大抵エラーが出てしまいます。
おそらく前項目を終えた後に、コンソールにこのようなエラーが表示されています。
<img width="676" alt="スクリーンショット 2016-07-07 14.57.22.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/1e2ca853-6d22-803e-b973-7e2ed81397cc.jpeg">
これを処理していきましょう。
プロジェクトフォルダの、OpenCVモジュールの中に入って、「build.gradle」ファイルを開いてください。
<img width="183" alt="スクリーンショット 2016-07-07 15.00.18.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/c9535c82-56c6-cae1-3275-603137bed8d8.jpeg">
おそらく中身がこのようになっているかと思います。
<img width="600" alt="スクリーンショット 2016-07-07 15.03.04.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/9928ac23-6ed3-03ef-4a07-9d76991ef6e5.jpeg">
一方で、appフォルダ内の「build.gradle」ファイルを見てみてください。
<img width="202" alt="スクリーンショット 2016-07-07 15.04.47.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/eddb7b2f-e3b6-da20-eef1-de50a635cb78.jpeg">

<img width="366" alt="スクリーンショット 2016-07-07 15.06.43.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/b2d5cda4-8d63-8815-4f60-6bed7e147d5e.jpeg">
こちらが現在Android Studioで実行しようとしているcompileSdkVersionとbuildToolsVersionなので、この2つの値をOpenCVファイルの方の「build.gradle」に写してください。
<img width="600" alt="スクリーンショット 2016-07-07 15.14.08.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/786f78a4-b13a-700b-fa67-4c349e42641f.jpeg">
minSdkVersionは一応14にしておきます。

そして最後に、はじめに指定したメインクラスを開き、
<img width="278" alt="スクリーンショット 2016-07-07 15.16.25.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/3dcd1735-e7ea-7839-0170-0033bb075630.jpeg">
上の黄色い警告の青文字「Try Again」を押すと、警告がすべて消えるはずです。
<img width="600" alt="スクリーンショット 2016-07-07 15.15.38.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/2f59aa67-109d-d478-894e-cf96aa13a4b5.jpeg">

# OpenCV動作確認
メインクラスのonCreate関数を以下のように編集し、実行してください。

```java:MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if(!OpenCVLoader.initDebug()){
        Log.i("OpenCV", "Failed");
    }else{
        Log.i("OpenCV", "successfully built !");
    }
}
```

コンソールに「OpenCV: successfully built !」が出力されれば導入完了です。
(ビルドに1、2分ほど時間がかかります...)
<img width="500" alt="スクリーンショット 2016-07-07 15.29.27.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/0bd3e335-c5c8-d53b-78f4-19f181f87f40.jpeg">

おつかれさまでした！

# 追記
Android実機ではOpenCV Managerのインストールが自動的にGoogle Playを介して行われるので正常に動作するのですが、エミュレーターで実行しようとするとエラーが発生しアプリが落ちます。
これはAndroid StudioのSDKに、OpenCVのAPKをインストールすることにより解決できます。

まず、Android StudioのSDKの場所を確認します。
「File > Project Structure...」をクリックし、「SDK Location」の項目で場所を確認できます。
(この場合は/Users/Kodai/Library/Android/sdkです。)
<img width="600" alt="スクリーンショット 2016-07-08 16.15.04.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/127402/0f53943d-84cb-01ba-91c3-19297e6d1603.jpeg">

ここで、ターミナル(Windowsはコマンドプロンプト)を起動し、Android StudioのSDKないにある「platform-tools」ディレクトリに移動します。(以下は私の環境の場合なので適宜調整してください)

> $ cd /Users/Kodai/Library/Android/sdk/platform-tools

次に、インストールしたOpenCVフォルダ内のAPKをインストールします。(こちらも適宜変更してください)

> $ adb install ~/Documents/hack_u/OpenCV-android-sdk/apk/OpenCV_3.1.0_Manager_3.10_x86.apk 

apkファイルは、実行するエミュレーターによって指定します。今回はAndroid Nexus 5x API 23 x86で実行していますので、このapkをインストールしました。

他にも以下の様な種類があります。

- OpenCV_3.1.0_Manager_3.10_arm64-v8a.apk
- OpenCV_3.1.0_Manager_3.10_armeabi-v7a.apk
- OpenCV_3.1.0_Manager_3.10_armeabi.apk
- OpenCV_3.1.0_Manager_3.10_mips.apk
- OpenCV_3.1.0_Manager_3.10_mips64.apk
- OpenCV_3.1.0_Manager_3.10_x86.apk
- OpenCV_3.1.0_Manager_3.10_x86_64.apk

以上の工程を経て実行すると、エラーなく実行できます。