【Android】OpenCV4.8.0の導入から実行まで

# はじめに
こんにちは、今回は新規のプロジェクトにOpenCVを導入してみたので、
導入方法などをまとめようと思います。備忘録も含めています。

# 使用した環境
OpenCV-4.8.0(以下サイトからAndroidを選択)

https://opencv.org/releases/

言語：Kotlin

# 導入手順
## OpenCVのimportおよび依存関係の追加
いきなり人任せですみませんが、以下のサイトを見てOpenCVをimportをして依存関係の追加までを実施する。
以下のサイトはわかりやすくOpenCVのインポートと依存関係の追加を記載されていました。

https://qiita.com/Khiroka/items/59d35f92963b31e1b633

依存関係を追加するとdependenciesに以下が追加されます。
```gradle:build.gradle(:app)
dependencies {
    // opencv
    // 依存関係の追加をするといかが追加されています。
    implementation project(path: ':opencv')
}
```

## プロジェクトに合わせてSDKバージョンを修正する
次はプロジェクトに合わせてOpenCV側のgradleを修正します。
```gradle:build.gradle(:app)
    compileSdk 33

    defaultConfig {
        minSdk 30
        targetSdk 33
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
```

```diff_gradle:build.gradle(:opencv)
+ compileSdkVersion 33
- compileSdkVersion 26
    defaultConfig {
        minSdkVersion 21
+       targetSdkVersion 33
-       targetSdkVersion 26
        versionCode openCVersionCode
        versionName openCVersionName

        externalNativeBuild {
            cmake {
                arguments "-DANDROID_STL=c++_shared"
                targets "opencv_jni_shared"
            }
        }
    }

```

## namespaceを追加する
上記のままSyncを行うと以下のエラーが出ます。
```
Namespace not specified. Please specify a namespace in the module's build.gradle file like so:

android {
    namespace 'com.example.namespace'
}
```
どうやらnamespaceを追加しないといけないらしい

https://developer.android.com/studio/build/configure-app-module?hl=ja

ということでnamespaceを追加します。
今回は'org.opencv'を追加
```diff_gradle:build.gradle(:opencv)
android {
+   namespace 'org.opencv'
    compileSdkVersion 33

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 33

        versionCode openCVersionCode
        versionName openCVersionName
```
ここまでやるとsyncが成功しました。
ただビルドをすると失敗しました。続きいきます！

## jvmTargetを追記
ビルドをすると以下のエラーが出た。。
```
Caused by: org.gradle.api.GradleException: 'compileDebugJavaWithJavac' task (current target is 1.8) and 'compileDebugKotlin' task (current target is 17) jvm target compatibility should be set to the same Java version.

```
Javaバージョンをターゲットを同じにしろというエラーらしい
ということで以下を追加
```diff_gradle:build.gradle(:opencv)
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

+    kotlinOptions {
+        jvmTarget = "1.8"
+    }
```

https://stackoverflow.com/questions/75480173/android-studio-build-error-compiledebugjavawithjavac-task-current-target-is-1

# buildFeaturesを追加
これでビルドできるだろうとビルドをすると出ましたエラー。。
まだ出るんかいと思いました。
ということで以下が出たエラーです。
```
パッケージorg.opencv.engineは存在しません
import org.opencv.engine.OpenCVEngineInterface;
                        ^

エラー: シンボルを見つけられません
import org.opencv.BuildConfig;
                 ^
```
インポートがうまくできていないエラーでした。
エラーを調べてみると出ました。原因は `buildConfig` と `Aidl` がデフォルトで `false` になっているために読み取っていないらしいです。ということで以下を追加します。

```diff_gradle:build.gradle(:opencv)
+    buildFeatures {
+        buildConfig true
+        aidl true
+    }
```

https://forum.opencv.org/t/opencv-4-8-0-cannot-resolve-symbol-opencv-engine-interface/14307

上記対応後再度ビルドを実施するとうまくいきました！
よかった。。

# 動作確認をする
ということでOpenCVが使用できるか実際に動かしてみます。
再度以下のサイトを参考にします。
やることはOpenCVのバージョンを表示する対応になります。

```kotlin:MainActivity.kt
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 = openCVVersionDisplay(OpenCVLoader.initDebug())
    }

    private fun openCVVersionDisplay(arg: Boolean): String {
        return when (arg) {
            true -> "OpenCV Version: " + OpenCVLoader.OPENCV_VERSION
            false -> "ERROR: OpenCV Load Failed"
        }
    }
}
```
```xml:activity_main.xml
    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
```

https://qiita.com/Khiroka/items/59d35f92963b31e1b633

ビルド後アプリが起動して「OpenCV Version: 4.8.0」と表示されれば成功です。
お疲れ様でした！

# 最後に
いかがでしたでしょうか？
エラーが結構出ましたが、なんとかなりました。
ということで、何か実装してみようかなと思います。また実装したら記事にしようと思います。
本記事が参考になると幸いです。
最後までご覧いただきありがとうございました。