Android
Android StudioにOpenCVを統合する
サーチ…
備考
Open CVライブラリは、Web上で検索エンジンを使用して見つけることができます。
ゴッチャ :
- あなたのターゲットプラットフォームをKitKat以下に下げると、OpenCVライブラリのいくつか、特にorg.opencv.android.Camera2Rendererおよび他の関連クラスに関連するクラスは機能しなくなります。この問題を回避するには、適切なOpenCV .javaファイルを削除するだけです。
- ターゲットプラットフォームをLollipop以上にした場合、絶対ファイルパスの使用に惑わされてしまったため、私のロード例ではファイルが読み込まれない可能性があります。だから、ギャラリーや他の場所からファイルをロードするためにサンプルを変更しなければならないかもしれません。周囲に浮かぶ数多くの例があります。
指示
AS v1.4.1でテストされましたが、新しいバージョンでも動作するはずです。
プロジェクトウィザードを使用して新しいAndroid Studioプロジェクトを作成します(メニュー:/ファイル/新規プロジェクト):
- それを " cvtest1 "
- フォームファクタ: API 19、Android 4.4(KitKat)
- MainActivityという空白アクティビティ
このプロジェクトが格納されているcvtest1ディレクトリが必要です。 (Androidスタジオのタイトルバーには、プロジェクトを開いたときのcvtest1の位置が表示されます)
あなたのアプリが正しく動作することを確認してください。 "Hello World"テキストのようなものを変更して、ビルド/テストサイクルが正常であることを確認してください。 (私はAPI 19デバイスのエミュレータでテストしています)。
Android v3.1.0用のOpenCVパッケージをダウンロードし、どこかの一時ディレクトリに解凍してください。 (これはJavaパッケージのための特別のAndroid用パッケージだけではなく、OpenCVのであることを確認してください。)私は、「 解凍-dirの 」 解凍-dirの下に、このディレクトリ呼ぶことにします、あなたがで始まるサブディレクトリとSDK /ネイティブ/ libsディレクトリを持つ必要がありますarm ...、 mips ...、 x86のようなもの...(Androidが走っている "アーキテクチャ"の各タイプごとに1つ)
Android StudioからプロジェクトとしてOpenCVをモジュールとしてインポート: Menu:/ File / New / Import_Module :
- ソースディレクトリ: {unzip-dir} / sdk / java
- モジュール名:Androidスタジオは自動的にこのフィールドをopenCVLibrary310で埋めます(正確な名前は関係ありませんが、これに伴います)。
- 次へをクリックします。 jar、ライブラリ、およびインポートオプションに関する3つのチェックボックスと質問がある画面が表示されます。 3つすべてをチェックする必要があります。 Finishをクリックします。
Android Studioからモジュールのインポートが開始され、 import-summary.txtファイルが表示されます。このファイルには、インポートされなかったもの(主にjavadocファイル)やその他の情報が一覧表示されます。
しかし、ハッシュ文字列 'android-14'を使ってターゲットを見つけることができなかったというエラーメッセージが表示されます 。これは、あなたがダウンロードしたOpenCV zipファイルのbuild.gradleファイルがアンドロイドAPIバージョン14を使用してコンパイルするように指示するためです。これは、デフォルトではAndroid Studio v1.4.1にはありません。
プロジェクト構造ダイアログを開きます ( メニュー:/ファイル/プロジェクト構造)。 「app」モジュールを選択し、「 Dependencies」タブをクリックして、モジュールの依存関係としてopenCVLibrary310を追加します。 Add / Module_Dependencyを選択すると、追加できるモジュールのリストに表示されます。これは依存関係として表示されますが、イベントログには数多くのcan not-find-android-14エラーが表示されます。
あなたのアプリケーションモジュールのbuild.gradleファイルを見てください。 Androidプロジェクトには複数のbuild.gradleファイルがあります。必要なものはcvtest1 / appディレクトリにあり、プロジェクトビューからはbuild.gradle(Module:app)のように見えます。これらの4つのフィールドの値に注意してください。
- compileSDKVersion(私の言う23)
- buildToolsVersion(私の言う23.0.2)
- minSdkVersion(私の言う19)
- targetSdkVersion(私の言う23)
プロジェクトにcvtest1 / OpenCVLibrary310ディレクトリが作成されましたが、プロジェクトビューからは表示されません。
他のツール(ファイルマネージャなど)を使用して、このディレクトリに移動します。プロジェクトビューをAndroidからProjectファイルに切り替えることもできます。このスクリーンショットに示すように、このディレクトリを見つけることができます:
内部には別のbuild.gradleファイル(上のスクリーンショットで強調表示されています)があります。このファイルを手順6の4つの値で更新します。
プロジェクトを再同期して、それをクリーニング/再構築します。 ( Menu:/ Build / Clean_Project )エラーを発生させずにクリーンアップしてビルドする必要があります。0:Messages画面のopenCVLibrary310への参照が多くあります。
この時点で、モジュールはアプリケーションのようにプロジェクト階層にopenCVLibrary310として表示されます。 (その小さなドロップダウンメニューでは、私はProject ViewからAndroid Viewに戻ったことに注意してください)。また、「Gradle Scripts」の下にbuild.gradleファイルが追加されているはずですが、Androidスタジオのインターフェースがちょっと不思議です。ですから、Android Studioの再同期、クリーニング、再起動までお試しください。
このスクリーンショットのように、javaの下にあるすべてのOpenCV関数を含むopenCVLibrary310モジュールが表示されます。
Androidプロジェクトに{unzip-dir} / sdk / native / libsディレクトリ(およびその下のすべて)をコピーして、 cvtest1 / OpenCVLibrary310 / src / main /にコピーし、あなたのコピーの名前をlibsからjniLibsに変更します。これで、 cvtest1 / OpenCVLibrary310 / src / main / jniLibsディレクトリが作成されます。プロジェクトを再同期すると、このディレクトリはプロジェクトビューのopenCVLibrary310に表示されます 。
MainActivity.javaのonCreateメソッドに移動し、次のコードを追加します。
if (!OpenCVLoader.initDebug()) {
Log.e(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), not working.");
} else {
Log.d(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), working.");
}
その後、アプリケーションを実行します。 Android Monitorでは、次のような行が表示されます。
(なぜ私はその行にエラーメッセージがあるのかわかりません)
- 実際にopenCVコードを実際に使用しようとします。下の例では、アンドロイドエミュレータのcvtest1アプリケーションのキャッシュディレクトリに.jpgファイルをコピーしました。以下のコードはこの画像を読み込み、エッジ検出アルゴリズムを実行し、その結果を同じディレクトリの.pngファイルに書き戻します。
Put this code just below the code from the previous step and alter it to match your own files/directories.
String inputFileName="simm_01";
String inputExtension = "jpg";
String inputDir = getCacheDir().getAbsolutePath(); // use the cache directory for i/o
String outputDir = getCacheDir().getAbsolutePath();
String outputExtension = "png";
String inputFilePath = inputDir + File.separator + inputFileName + "." + inputExtension;
Log.d (this.getClass().getSimpleName(), "loading " + inputFilePath + "...");
Mat image = Imgcodecs.imread(inputFilePath);
Log.d (this.getClass().getSimpleName(), "width of " + inputFileName + ": " + image.width());
// if width is 0 then it did not read your image.
// for the canny edge detection algorithm, play with these to see different results
int threshold1 = 70;
int threshold2 = 100;
Mat im_canny = new Mat(); // you have to initialize output image before giving it to the Canny method
Imgproc.Canny(image, im_canny, threshold1, threshold2);
String cannyFilename = outputDir + File.separator + inputFileName + "_canny-" + threshold1 + "-" + threshold2 + "." + outputExtension;
Log.d (this.getClass().getSimpleName(), "Writing " + cannyFilename);
Imgcodecs.imwrite(cannyFilename, im_canny);
- アプリケーションを実行します。あなたのエミュレータは、白黒の「エッジ」イメージを作成する必要があります。 Androidデバイスモニタを使用して出力を取得したり、アクティビティを書き込んで表示することができます。