はじめに
こんにちは、今回は新規のプロジェクトにOpenCVを導入してみたので、
導入方法などをまとめようと思います。備忘録も含めています。
使用した環境
OpenCV-4.8.0(以下サイトからAndroidを選択)
言語:Kotlin
導入手順
OpenCVのimportおよび依存関係の追加
いきなり人任せですみませんが、以下のサイトを見てOpenCVをimportをして依存関係の追加までを実施する。
以下のサイトはわかりやすくOpenCVのインポートと依存関係の追加を記載されていました。
依存関係を追加するとdependenciesに以下が追加されます。
dependencies {
// opencv
// 依存関係の追加をするといかが追加されています。
implementation project(path: ':opencv')
}
プロジェクトに合わせてSDKバージョンを修正する
次はプロジェクトに合わせてOpenCV側のgradleを修正します。
compileSdk 33
defaultConfig {
minSdk 30
targetSdk 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
+ 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を追加しないといけないらしい
ということでnamespaceを追加します。
今回は'org.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バージョンをターゲットを同じにしろというエラーらしい
ということで以下を追加
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
+ kotlinOptions {
+ jvmTarget = "1.8"
+ }
buildFeaturesを追加
これでビルドできるだろうとビルドをすると出ましたエラー。。
まだ出るんかいと思いました。
ということで以下が出たエラーです。
パッケージorg.opencv.engineは存在しません
import org.opencv.engine.OpenCVEngineInterface;
^
エラー: シンボルを見つけられません
import org.opencv.BuildConfig;
^
インポートがうまくできていないエラーでした。
エラーを調べてみると出ました。原因は buildConfig
と Aidl
がデフォルトで false
になっているために読み取っていないらしいです。ということで以下を追加します。
+ buildFeatures {
+ buildConfig true
+ aidl true
+ }
上記対応後再度ビルドを実施するとうまくいきました!
よかった。。
動作確認をする
ということでOpenCVが使用できるか実際に動かしてみます。
再度以下のサイトを参考にします。
やることはOpenCVのバージョンを表示する対応になります。
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"
}
}
}
<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" />
ビルド後アプリが起動して「OpenCV Version: 4.8.0」と表示されれば成功です。
お疲れ様でした!
最後に
いかがでしたでしょうか?
エラーが結構出ましたが、なんとかなりました。
ということで、何か実装してみようかなと思います。また実装したら記事にしようと思います。
本記事が参考になると幸いです。
最後までご覧いただきありがとうございました。