OpenCV入門 (5) - Androidでの利用
AndroidでOpenCVを利用する方法を説明します。
・OpenCV 4.1.1
・Android Studio 3.5
・Java
前回
1. OpenCVフレームワークのダウンロード
以下のサイトの「OpenCV - 4.1.1」の「Android」をクリックします。解凍すると、「OpenCV-android-sdk」が取得できます。
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を追加できませんでした。
成功すると以下のよう「opencv」モジュールがプロジェクトに追加されます。
(5)「bundle.gradle(Mudule: app)」と「bundle.gradle(Mudule: opencv)」のcompileSdkVersionをあわせる。
compileSdkVersion 28
(6)メニュー「File → Project Structure → Dependencies」で「app」を選択し、「+ → Module dependency → opencv」を選択。
成功すると、以下のように「app」からの参照先に「opencv」モジュールが追加されます。
(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」を追加。
(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) 実行。
成功すると、次のようにグレースケールで表示されます。
次回
この記事が気に入ったらサポートをしてみませんか?