見出し画像

OpenCV入門 (5) - Androidでの利用

AndroidでOpenCVを利用する方法を説明します。

・OpenCV 4.1.1
・Android Studio 3.5
・Java

前回

1. OpenCVフレームワークのダウンロード

以下のサイトの「OpenCV - 4.1.1」の「Android」をクリックします。解凍すると、「OpenCV-android-sdk」が取得できます。

OpenCV - Releases

2. Androidプロジェクトの作成

Androidプロジェクトを作成して、「OpenCV-android-sdk」をインポートします。

(1)Android Studioで新規プロジェクトを作成。

(2)メニュー「File → New → Import Module」を選択。

(3)「Source directory」に「OpenCV-android-sdk/sdk」フォルダ、「Module name」に「:opencv」を指定。

古め環境用の公式ドキュメントには「OpenCV-android-sdk/sdk/java」とありますが、それではDepencenciesでopencvを追加できませんでした。

画像1

成功すると以下のよう「opencv」モジュールがプロジェクトに追加されます。

画像2

(5)「bundle.gradle(Mudule: app)」と「bundle.gradle(Mudule: opencv)」のcompileSdkVersionをあわせる。

compileSdkVersion 28

(6)メニュー「File → Project Structure → Dependencies」で「app」を選択し、「+ → Module dependency → opencv」を選択。

画像3

成功すると、以下のように「app」からの参照先に「opencv」モジュールが追加されます。

画像4

(7)「<プロジェクト名>/app/src/main/」に「jniLibs」フォルダを新規作成。

(8)「OpenCV-android-sdk/sdk/native/libs」の中身を作成した「jniLibs」フォルダにコピー。

3. OpenCVフレームワークの参照確認

OpenCVフレームワークが参照できるようになったか確認するには、「OpenCVLoader.initDebug()」を使います。

   @Override
   protected void onCreate(Bundle bundle) {
       super.onCreate(bundle);
       setContentView(R.layout.activity_main);

       if (OpenCVLoader.initDebug()) {
           android.util.Log.d("debug", "OpenCV>>>>Success");
       } else {
           android.util.Log.d("debug", "OpenCV>>>>Failed");
       }
   }

4. OpenCVの動作確認

OpenCVの動作確認としてグレースケール変換を行います。

(1)Androidプロジェクトにリソース「sample.jpg」を追加。

画像5

(2)レイアウトファイルにImageViewを追加。
(3)「AppDelegate.java」を次のように編集。

package net.npaka.helloopencv;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

import org.opencv.android.OpenCVLoader;

//AppDelegate
public class AppDelegate extends Activity {
   //UI
   private ViewController viewController;

   //アプリ起動時に呼ばれる
   @Override
   public void onCreate(Bundle bundle) {
       super.onCreate(bundle);
       requestWindowFeature(Window.FEATURE_NO_TITLE);

       //OpenCVの初期化
       if (OpenCVLoader.initDebug()) {
           //ViewControllerの生成
           viewController = new ViewController(this);
           setContentView(viewController);
       }
   }
}

(4)「ViewController.java」を次のように編集。

package net.npaka.helloopencv;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;

import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

//ViewController
public class ViewController extends FrameLayout {
   private ImageView imageView;

   //コンストラクタ
   public ViewController(Activity activity) {
       super(activity);

       //レイアウト
       this.setLayoutParams(new FrameLayout.LayoutParams(
           FrameLayout.LayoutParams.MATCH_PARENT,
           FrameLayout.LayoutParams.MATCH_PARENT));
       LayoutInflater inflater = (LayoutInflater)activity.
           getSystemService(Context.LAYOUT_INFLATER_SERVICE);
       View view = inflater.inflate(R.layout.main, null);
       addView(view);

       //UI
       this.imageView = this.findViewById(R.id.image_view);

       //RGB→Gray
       Resources r = getResources();
       Bitmap bmp = BitmapFactory.decodeResource(r, R.drawable.sample);
       ViewController.this.imageView.setImageBitmap(rgb2gray(bmp));
   }

   //RGB→Gray
   private Bitmap rgb2gray(Bitmap image) {
       Mat img_Mat = new Mat();
       Utils.bitmapToMat(image, img_Mat);
       Imgproc.cvtColor(img_Mat, img_Mat, Imgproc.COLOR_BGR2GRAY);
       Bitmap result = image.copy(Bitmap.Config.ARGB_8888, true);
       Utils.matToBitmap(img_Mat, result);
       return result;
   }
}

(5) 実行。
成功すると、次のようにグレースケールで表示されます。

画像6

次回


この記事が気に入ったらサポートをしてみませんか?