web-dev-qa-db-ja.com

Android StudioでのOpenCV

私は自分のアプリでOpenCVライブラリをAndroid Studioで使いたいのです。ここで見つけた指示 に従ってください しかし、エラーが発生します

'default'という名前の設定が見つかりません

何が悪いの?

私はAndroid Studio 1.0とgradle 2.2.1を使っています。

132

以下の手順は、Android StudioでAndroid OpenCV SDKを使用するためのものです。これは( 1 )SO answerの簡易版です。

  1. Android用最新のOpenCV SDKを OpenCV.org からダウンロードし、Zipファイルを解凍します。
  2. OpenCVをAndroid Studioにインポートします ファイル - >新規 - >インポートモジュール から、解凍したopencvアーカイブの sdk/Java フォルダーを選択します。
  3. インポートされたOpenCVモジュールの下のbuild.gradle を更新して、プロジェクトのbuild.gradleと一致するように4つのフィールドを更新します。
  4. [アプリケーション] - > [モジュール設定] によってモジュール依存関係を追加し、[ 依存関係 ]タブを選択します。下部の + アイコンをクリックし、 Module Dependency を選択して、インポートされたOpenCVモジュールを選択します。
    • Android Studio v1.2.2の場合、モジュール設定にアクセスするには:プロジェクトビューで、依存モジュールを右クリックします - > モジュール設定を開く
  5. libs フォルダを sdk/native の下の app/src/main の下のAndroid Studioにコピーします。
  6. Android Studioでは、コピーした libs ディレクトリの名前を jniLibs に変更すれば完了です。

ステップ(6)は、Android Studioが古いlibsフォルダではなくapp/src/main/jniLibs内のネイティブライブラリを想定しているためです。 Android OpenCVに不慣れな方は、以下の手順をお見逃しなく

  • static{ System.loadLibrary("opencv_Java"); }をインクルードしてください(注:このステップのOpenCVバージョン3では、代わりにライブラリーopencv_Java3をロードしてください。)
  • ステップ(5)で、x86のようなプラットフォームライブラリを無視する場合は、デバイス/エミュレータがそのプラットフォーム上にないことを確認してください。

OpenCVはC/C++で書かれています。 Javaラッパーは

  1. Android OpenCV SDK - OpenCV.orgはAndroid Javaラッパーを維持していました。これをお勧めします。
  2. OpenCV Java - OpenCV.orgは自動生成されたデスクトップJavaラッパーを維持していました。
  3. JavaCV - 独立系開発者によって管理されている人気のあるJavaラッパー。 Android固有ではありません。このライブラリ may OpenCVのより新しいバージョンと同期が取れなくなります。
295
Kiran

OpenCV v3.1.0をAndroid Studio v1.4.1に統合する方法、詳細な説明、およびこれが必要なタイプのスクリーンショット。

クレジットの大部分は、説明のためにopencv.orgでKiran、Kool、1 "、そしてSteveLilesに行きます。AndroidStudioのインターフェースはこのタイプの統合のもので動作するのに十分安定していると私は信じています私のプロジェクトのためにも私はとにかくこれらの指示を書かなければなりません。

経験豊富なA.S.開発者は、このような方法論のいくつかを見つけるでしょう。この回答は、Android Studioの経験が少ない人を対象としています。

  1. プロジェクトウィザードを使用して新しいAndroid Studioプロジェクトを作成します(メニュー:/ファイル/新規プロジェクト)。

    • それを「cvtest1」と呼びます
    • フォームファクタ:API 19、Android 4.4(KitKat)
    • 空白のアクティビティ named MainActivity

      このプロジェクトが格納されているcvtest1ディレクトリが必要です。 (Android Studioのタイトルバーには、プロジェクトを開いたときのcvtest1の場所が表示されます)

  2. アプリが正しく動作することを確認してください。 「Hello World」というテキストのようなものを変更して、ビルド/テストサイクルが問題ないことを確認します。 (私はAPI 19デバイスのエミュレータでテストしています)。

  3. Android v3.1.0用のOpenCVパッケージをダウンロードして、一時ディレクトリのどこかに解凍します。 (これは、OpenCV for Javaパッケージだけではなく、Android専用のパッケージであることを確認してください。)このディレクトリを「nzip-dir」と呼びます。nzip-dirarm...、mips...、x86などで始まるサブディレクトリを含むsdk/native/libsディレクトリ。 ..(Androidが動作する「アーキテクチャ」の種類ごとに1つ)

  4. Android StudioからOpenCVをプロジェクトとしてプロジェクトにインポートします。Menu:/ File/New/Import_Module

    • ソースディレクトリ:{unzip-dir}/sdk/Java
    • モジュール名:Android studioは自動的にこのフィールドにopenCVLibrary31を記入します(正確な名前はおそらく問題になりませんが、これを使用します)。
    • nextをクリックしてください。あなたは3つのチェックボックスとjarファイル、ライブラリとインポートオプションについての質問でスクリーンを得る。 3つすべてをチェックする必要があります。 完了をクリックしてください。

      Android Studioがモジュールのインポートを開始し、インポートされなかったもの(主にjavadocファイル)とその他の情報のリストを含むimport-summary.txtファイルが表示されます。 enter image description here

      しかし、ハッシュ文字列 'Android-14'のターゲットが見つかりませんでした...というエラーメッセージも表示されます。これは、ダウンロードしたOpenCV Zipファイルのbuild.gradleファイルがAndroid APIバージョン14を使用してコンパイルするように指示しているために発生します。デフォルトでは、Android Studio v1.4.1には含まれていません。 enter image description here

  5. プロジェクト構造ダイアログ(メニュー:/ファイル/プロジェクト構造)を開きます。 「app」モジュールを選択し、Dependenciesタブをクリックして、モジュールの依存関係として:openCVLibrary31を追加します。 Add/Module_Dependencyを選択すると、追加できるモジュールの一覧に表示されます。依存関係として表示されるようになりましたが、イベントログにcannot-find-Android-14エラーが表示されることがあります。

  6. アプリモジュールのbuild.gradleファイルを調べます。 Androidプロジェクトには複数のbuild.gradleファイルがあります。必要なものはcvtest1/appディレクトリにあり、プロジェクトビューから見るとbuild.gradle(Module:app)のように見えます。これら4つのフィールドの値に注意してください。

    • compileSDKVersion(私の言うとおり23)
    • buildToolsVersion(私の言う23.0.2)
    • minSdkVersion(私の言う19)
    • targetSdkVersion(私の言うとおり23)
  7. プロジェクトにcvtest1/OpenCVLibrary31ディレクトリが追加されましたが、プロジェクトビューからは表示されません。

enter image description here

他のツール(ファイルマネージャなど)を使用して、このディレクトリに移動してください。プロジェクトビューをAndroidからProject Filesに切り替えることもできます。このスクリーンショットに示すように、このディレクトリを見つけることができます。 enter image description here

内部に別のbuild.gradleファイルがあります(上記のスクリーンショットで強調表示されています)。このファイルを手順6の4つの値で更新します。

  1. プロジェクトを再同期してから、クリーンアップまたは再構築します。 (Menu:/ Build/Clean_Project)それはエラーなしできれいになりそして構築されるべきでありそして:openCVLibrary31への多くの参照を:Messages _スクリーンに見るべきです。

    enter image description here

    この時点で、モジュールはappのように、プロジェクト階層でopenCVLibrary310として表示されます。 (その小さなドロップダウンメニューで、私はプロジェクトビューからAndroidビューに切り替えました)。また、 "Gradle Scripts"の下に追加のbuild.gradleファイルが表示されるはずですが、Android Studioのインターフェイスには少し問題があり、すぐにうまくいかないことがあります。だから、再同期、クリーニング、そしてAndroid Studioを再起動してみてください。

    このスクリーンショットのように、openCVLibrary310モジュールとJavaの下にあるすべてのOpenCV関数が表示されます。

    enter image description here

  2. {unzip-dir}/sdk/native/libsディレクトリ(およびその下のすべてのもの)をAndroidプロジェクトにコピーし、cvtest1/OpenCVLibrary310/src/main /に移動して、名前を変更します。 libsからjniLibsへのコピー。これでcvtest1/OpenCVLibrary310/src/main/jniLibsディレクトリができました。プロジェクトを再同期すると、このディレクトリがプロジェクトビューのopenCVLibrary310の下に表示されます。

    enter image description here

  3. OnCreateメソッドのMainActivity.Javaに移動して、次のコードを追加します。

    if (!OpenCVLoader.initDebug()) {
        Log.e(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), not working.");
    } else {
        Log.d(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), working.");
    }
    

    その後、アプリケーションを実行してください。 Androidモニターには、このような行が表示されます。 enter image description here (エラーメッセージのある行があるのはわかりません)

  4. それでは実際にopenCVコードを使ってみましょう。以下の例では、Androidエミュレータのcvtest1アプリケーションのキャッシュディレクトリに.jpgファイルをコピーしました。以下のコードはこのイメージをロードし、canny Edge検出アルゴリズムを実行してから同じディレクトリ内の.pngファイルに結果を書き戻します。

    このコードを前のステップのコードのすぐ下に置き、自分のファイル/ディレクトリに合うように変更します。

    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);
    
  5. アプリケーションを実行してください。あなたのエミュレータは白黒の "Edge"イメージを作成するべきです。 Androidデバイスモニターを使用して出力を取得したり、それを表示するアクティビティを記述したりできます。

Gotchas

  • ターゲットプラットフォームをKitKatより低くすると、一部のOpenCVライブラリ、特にorg.opencv.Android.Camera2Rendererおよびその他の関連クラスが機能しなくなります。おそらくこれを回避するには、適切なOpenCVの.Javaファイルを削除するだけです。
  • ターゲットプラットフォームをLollipop以上に上げると、絶対ファイルパスの使用が眉をひそめてしまうため、ファイルのロードの私の例ではうまくいかないかもしれません。そのため、ギャラリーまたは他の場所からファイルをロードするように例を変更する必要があるかもしれません。いろいろな例が浮かんでいます。
140
ssimm

上記の(すばらしい!)回答に含まれるすべての手順とスクリーンショットを読みたくないと思った人のために、これはAndroid studio 2.2.1でうまくいきました。

  1. 新しいプロジェクトを作成し、好きな名前を付けてデフォルトにします(minSdkVersion 15で結構です)。
  2. こちらからZipファイルをダウンロードしてください: https://sourceforge.net/projects/opencvlibrary/files/opencv-Android/ (私は3.1.0バージョンをダウンロードしましたしかし、もっと新しいバージョンがあるかもしれません。
  3. Zipファイルを解凍します。最適な場所はワークスペースフォルダですが、実際には関係ありません。
  4. Android Studio内で、File->New-> Import Moduleをクリックして\path_to_your_unzipped_file\OpenCV-Android-sdk\sdk\Javaに移動し、Okを押してから、すべてのデフォルトダイアログを受け入れます。
  5. gradleモジュールのappファイルで、これをdependenciesブロックに追加します。

    dependencies {
        compile project(':openCVLibraryXYZ')
        //rest of code
    }
    

XYZはダウンロードした正確なバージョンです。たとえば、私の場合は次のようになります。

    dependencies {
        compile project(':openCVLibrary320')
        //rest of code
    }
36
yshahak

Android Studio 3.4 + OpenCV 4.1

  1. here (現在の最新バージョンは4.1.0)から最新のOpenCV Zipファイルをダウンロードし、ワークスペースまたは別のフォルダーに解凍します。

  2. 通常、新しいAndroid St​​udioプロジェクトを作成します。 File->New->Import Moduleをクリックし、/path_to_unzipped_files/OpenCV-Android-sdk/sdk/Javaに移動し、モジュール名をopencvに設定し、Nextをクリックして、画面のすべてのオプションをオフにします。

  3. Projectファイルビューモードを有効にします(デフォルトモードはAndroidです)。 opencv/build.gradleファイルでapply plugin: 'com.Android.application'apply plugin: 'com.Android.library'に変更し、application ID "org.opencv"で置き換えます

    minSdkVersion 21
    targetSdkVersion 28
    

    app/build.gradleの値による)。プロジェクトをGradleファイルと同期します。

  4. app/build.gradleファイルの依存関係ブロックにこの文字列を追加します

    dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
    
  5. Androidファイルビューモードを再度選択します。 appモジュールを右クリックして、New->Folder->JNI Folderに移動します。フォルダーの場所の変更を選択し、src/main/jniLibs/を設定します。

  6. もう一度Projectファイルビューモードを選択し、/path_to_unzipped_files/OpenCV-Android-sdk/sdk/native/libsからapp/src/main/jniLibsにすべてのフォルダーをコピーします。

  7. 再びAndroidファイルビューモードで、appモジュールを右クリックし、Link C++ Project with Gradleを選択します。ビルドシステムndk-buildOpenCV.mkファイル/path_to_unzipped_files/OpenCV-Android-sdk/sdk/native/jni/OpenCV.mkへのパスを選択します。

    path_to_unzipped_filesにはスペースを含めないでください。スペースを含めるとエラーが発生します!

OpenCVの初期化を確認するには、MainActivity onCreate()メソッドにToastメッセージを追加します。

Toast.makeText(MainActivity.this, String.valueOf(OpenCVLoader.initDebug()), Toast.LENGTH_LONG).show();

初期化が成功すると、Toastメッセージにtrueが表示されます。それ以外の場合は、falseが表示されます。

4
Plo_Koon

これは私にとってはうまくいき、gradle依存関係を追加するのと同じくらい簡単でした。

https://bintray.com/seesaa/maven/opencv#

https://github.com/seesaa/opencv-Android

1つ注意しなければならないのは、(AVD Managerが言うように)アームエミュレータとしてはハードウェアデバッグ装置を使用しなければならず、またこの記事にはx86またはx86_64のサポートが含まれていないことです。

それが構築され、提案されたテストのようです。

static {
    OpenCVLoader.initDebug();
}

私の目の前に見える大量の出力を吐き出します。

0
The Naumannator

JniLib cppの作成中に問題に直面している人は誰でも表示できます。

0
Aklesh Singh

AndroidスタジオとのOpencv統合

YouTubeビデオを同じようにしたい人は、最新バージョンのopencv(3.4.0)を試してみてください。私の運は、表示バージョン(2.4.9)には不十分でした( opencvリリース )。

0
Prakhar1001