TL;DR
Android StudioでOpenCV SDKを使ったアプリの作り方.
環境
- OpenCV 4.2.0
- Android Studio 3.5.3
- macOS Catalina 10.15.3
- kotlin
事前準備
-
新規プロジェクト作成
Android Studioで空のアプリを作成しておく. -
OpenCVのダウンロード
OpenCVのリリースサイト からandroid版のSDKをダウンロードし適当な場所に解凍しておく.
今回は opencv-4.2.0-android-sdk.zip を使用.
実装
OpenCVの取り込み
- OpenCVを組み込みたいプロジェクトをAndroid Studioで開く.
- メニューの
File
->New
->Import Module
を選択. - 事前に解凍して置いた OpenCV SDK の
sdk
フォルダを指定してインポート.
Module nameはデフォルトだとsdk
になるのでopencv-sdk
とかにしてもよいかも.
モジュールの依存関係を追加
アプリ側の build.gradle
の dependencies に sdk を追加.
build.gradle
dependencies {
implementation project(path: ':sdk')
...
カメラパーミッションを追加
アプリの AndroidManifest.xml
にカメラパーミッションを追加.
AndroidManifest.xml
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
Activity
/Fragment
にもパーミッション取得の処理を書いておく.
画面レイアウト作成
ActivityのレイアウトXMLにカメラビューを追加.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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">
<org.opencv.android.JavaCameraView
android:id="@+id/camera_view"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:show_fps="true" />
</androidx.constraintlayout.widget.ConstraintLayout>
コードを書く
Activityにコードを追加.
setCameraPermissionGranted()
を忘れないように注意.
MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
OpenCVLoader.initDebug() // ← OpenCVライブラリ読込
initCamera()
}
fun initCamera() {
// リスナ設定
camera_view.setCvCameraViewListener(object : CameraBridgeViewBase.CvCameraViewListener2 {
override fun onCameraViewStarted(width: Int, height: Int) { }
override fun onCameraViewStopped() { }
override fun onCameraFrame(inputFrame: CameraBridgeViewBase.CvCameraViewFrame?): Mat {
// このメソッド内で画像処理. 今回はポジネガ反転.
val mat = requireNotNull(inputFrame).rgba()
Core.bitwise_not(mat, mat)
return mat
}
})
// プレビューを有効にする
camera_view.setCameraPermissionGranted()
camera_view.enableView()
}