AndroidStudioにOpenCV4.1.0を導入する

## 経緯
駆け出しのチームで初めてAndroidStudioを導入したはいいものの
OpenCV導入に手こずったので、チームメイトへ向けてまとめました

## 内容
- AndroidStudioにOpenCV4.1.0(2019/04/16現在で最新の認識)を導入
- kotlinのコードでOpenCVが導入できているかチェック

## 動作環境
- Mac 10.13.6(High Sierra)
- AndroidStudio 3.3.2
- OpenCV 4.1.0

※AndroidStudioのインストール方法については割愛します。

## OpenCVのダウンロード
下記、どちらかのサイトからダウンロード

https://github.com/opencv/opencv/releases
-> こちらの場合は *opencv-4.1.0-android-sdk.zip* をダウンロード

https://opencv.org/releases.html
-> こちらの場合は *Android pack* をダウンロード

ダウンロードしたZipを解凍して、わかりやすい場所に置いておく
（私はデスクトップに置きました)

## AndroidStudio プロジェクトの作成
※すでに既存のプロジェクトがある方は、
 それを開いて次の項目[OpenCVをimpoer]の手順に進んでください

1. AndroidStudioを起動
2. *Start a new Android Studio project* を選択
3. Choose your projectで *Empty Activity* を選択してNext
4. Name、SaveLocationは自由に。Languageはお好みで（今回はkotlin)
5. APIレベルは最新の28に設定して、Finish


## OpenCVをimport

1. 画面上部のFileから、*New > Import Module...* 選択
![スクリーンショット 2019-04-16 10.42.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294581/fb2cc382-2e34-4c1b-13f2-a04b48af0e5d.png)

2. import画面で先ほど解凍したファイルのパスを入力
　　（右側のディレクトリボタンから参照でも可）
　　Module nameはお好みで、ひとまず「opencv」にしました。
![スクリーンショット 2019-04-16 10.45.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294581/807f686a-0174-8520-f2f9-6f8d43cb9a02.png)


※サイトによっては*/Users/user名/Desktop/OpenCV-android-sdk/sdk/java* となっていますが
 javaまで含むと上手く動かないので注意です。
 （原因が不明なので知見ある方教えてください。。。）

Buildが始まるのでちょっと待機です。エラーなく完了したらimportは完了です。
Project一覧に*opencv*がいるはずです

![スクリーンショット 2019-04-16 11.07.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294581/ad4b005f-dd98-625e-2227-a8a952fad03e.png)



## moduleの依存関係の追加(dependenciesの設定)

1. 画面上部のfileから、*Project Structure* を選択

![スクリーンショット 2019-04-16 10.56.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294581/aa00f4d0-1e4b-1469-f888-3a677f21c872.png)

2.appの、*dependencies*を選択
![スクリーンショット 2019-04-16 10.56.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294581/f9f7c38a-2e0f-8a1d-d79f-57242a874d7e.png)
3. 下の「＋」ボタンを押して、３の*Module dependency*を選択
4. そのまま*opencv*を選択してOK
5. 一覧の一番下に*opencv*が追加されれば依存関係の追加は完了です。
![スクリーンショット 2019-04-16 11.00.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294581/bdd856b0-1527-c69e-259c-c78f65409b2c.png)

## gradleの書き換え

1. 画面左のプロジェクト一覧から、GradleScriptsを開く。
　　build.gradle(Module:app)のファイルを開き、
   *compileSdkVersion*の横の数字を確認してください
　　（ここでは28）
![スクリーンショット 2019-04-16 11.09.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294581/991d5496-3608-8413-c306-389b7f680403.png)

2. 同じように、build.gradle(Module:opencv)のファイルを開き
　　*compileSdkVersion*の数字を確認し、手順１のappと異なるようであれば
　　appと同じになるように数字を直す
![スクリーンショット 2019-04-16 11.14.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294581/1e1878ef-d5af-832c-247c-c7ca682eb7a4.png)
↑ではcompileSdkVersinoが２６なので、これを28に書き換える



## jniLibsフォルダの作成

ここはFinder上での作業で大丈夫です。
1. 現在のプロジェクトがあるフォルダへ移動します
2. app/src/main/の下に、*jniLibs*という名前のフォルダを作成
3. 最初にダウンロードして解凍したフォルダを開き、
   OpenCV-android-sdk\sdk\native\libsの中身を全てjniLibsにコピー
![スクリーンショット 2019-04-16 11.30.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294581/313a47a3-599b-aaf4-704b-f2b63d508c99.png)


これでOpenCV使うことのできる環境は出来上がりました。
最後に、ちゃんとOpenCVが使えるかチェックしましょう。

## OpenCVが使えるか確認

こちらについては別の記事を参考にしています（ほぼ同じです）
https://qiita.com/yeb8jo/items/95b9ec32901b0b83b783

上記記事のコードでは残念ながら上手く動作しなかったので
少し書き換えをしています。
l15,16

```java:MainActivity.kt
package and.syun.com.kotlinwithopencv001

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView

import org.opencv.android.OpenCVLoader

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        val versionString :TextView = findViewById(R.id.text_view)
        versionString.text = openCVVersionString(OpenCVLoader.initDebug())
    }

    private fun openCVVersionString(arg: Boolean): String {
        when (arg) {
            true -> return "OpenCV Version: "+OpenCVLoader.OPENCV_VERSION
            false -> return "ERROR: OpenCV Load Failed"
        }
    }

}
```

上記コードだと、text_viewのみ赤文字になると思うので、
option + Enterでidsに追加してください
（入力画面が出るかと思いますが何も触らずにOKを押してください）



```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>
```
TextViewの中に*android:id="@+id/text_view"*を追加


実行結果
![スクリーンショット 2019-04-16 12.14.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294581/c2ecf494-0548-a4f0-d4ac-5747ee46ece8.png)



当方Pythonエンジニアのはずでしたが初めてのqiitaはAndroidでした。
世界の広さを感じます。最後まで読んでいただきありがとうございました。