LoginSignup
6
8

More than 3 years have passed since last update.

AndroidでOpenCVを使ってみる

Posted at

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()
    }

実行結果

6
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8