Android StudioのOpenCV


140

Android StudioのアプリでOpenCVライブラリを使用したい。ここにある指示に従いましが、エラーになります

「デフォルト」という名前の設定が見つかりません

何が悪いのでしょうか?

Android Studio 1.0とGradle 2.2.1を使用しています。


1
これで、Androidスタジオでモジュールをインポートできるようになり、手順がはるかに簡単になります。あなたはこの試みることができるstackoverflow.com/a/27356635/1180117
キラン

ありがとうございます。答えとして書けば受け入れてもらえる。
Bartosz Bialecki 14

@BartoszBialecki @Kiran、ステップ4に進みましたが、nativeディレクトリの下にsdk ディレクトリが見つかりません。何か不足していますか?
Romantic Electron

1
@RomanticElectronは、Android SDKではなく、OpenCVライブラリのSDKからnatvieディレクトリを追加する必要があります。
Bartosz Bialecki

@BartoszBialeckiありがとう
Romantic Electron

回答:


312

Android StudioでAndroid OpenCV SDKを使用するための以下の手順。これはthis(1)SO回答の簡略版です。

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

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

  • include 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固有ではありません。このライブラリ、OpenCVの新しいバージョンと同期しなくなる可能性があります。

1
2番目のステップの後でエラーが発生しjavadocsます。ディレクトリを削除しますか?android sdk 14サポートするデバイスをターゲットにしていますが、インストールも求められますandroid sdk 15
Romantic Electron

1
@RomanticElectron希望OpenCV4Android 2.4.10をリンクsourceforge.net/projects/opencvlibrary/files/opencv-android/…からダウンロードしましたが、そのJavaデスクトップバージョンではありませんか?
キラン、2015年

2
わかりました。sdk私がシステムのインストールディレクトリについて話しているときに、Android Open CV SDK.Ok が付属するディレクトリについて話していると思いました。手順6を完了しました。どこに含めstatic{ System.loadLibrary("opencv_java"); }ますか?
Romantic Electron

5
@RomanticElectron static {System.loadLibrary( "opencv_java");をどこに含めますか?}?「ありがとうございます」とおっしゃっていますが、間にメッセージがないようです。次に、それは必要ないと言います。もう少し説明してもらえますか?ありがとう。
プントフィッソ

8
持つ人のためandroid-14のステップ2でモジュールをインポートした後、エラーを、手動で編集する必要がbuild.gradleOpenCVのディレクトリにプロジェクト内のステップ3に示すように
paradite

144

OpenCV v3.1.0をAndroid Studio v1.4.1統合します。手順の詳細と、これが何であるかを示すタイプのスクリーンショットが含まれています。

クレジットのほとんどは、opencv.orgでの説明のために、Kiran、Kool、1インチ、およびSteveLilesに提供されています。AndroidStudioのインターフェイスは、このタイプの統合に対応できるほど安定していると思うので、この答えを追加します。 。また、私はプロジェクトのためにこれらの指示をとにかく書かなければなりません。

経験豊富なAS開発者は、この知識の一部を見つけるでしょう。この回答は、Android Studioの使用経験が少ない人を対象としています。

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

    • それを「cvtest1」と呼んでください
    • フォームファクター: API 19、Android 4.4(KitKat)
    • MainActivityという名前の空白のアクティビティ

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

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

  3. Android v3.1.0用のOpenCVパッケージをダウンロードし、どこかの一時ディレクトリに解凍します。(ことを確認し、それは、JavaパッケージのためだけのOpenCV特にAndroid用パッケージではない。)私は、このディレクトリは「と呼ぶことにします解凍-dirの下に」解凍-dirはあなたが持っている必要があり、SDK /ネイティブ/ LIBSで始まるサブディレクトリでディレクトリを以下のようなものアーム ...、MIPS ...とx86の ...(上の「アーキテクチャ」のAndroid実行の各タイプごとに1つ)

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

    • ソースディレクトリ: {unzip-dir} / sdk / java
    • モジュール名:Androidスタジオでは、このフィールドにopenCVLibrary310が自動的に入力されます(正確な名前は重要ではないかもしれませんが、これを使用します)。
    • 次へをクリックします。3つのチェックボックスと、jar、ライブラリ、インポートオプションに関する質問の画面が表示されます。3つすべてをチェックする必要があります。完了をクリックします。

      Android Studioがモジュールのインポートを開始すると、インポートされなかったもの(主にjavadocファイル)とその他の情報のリストを含むimport-summary.txtファイルが表示されます。 ここに画像の説明を入力してください

      しかし、あなたはまた、エラーメッセージが言ってもらう...ハッシュ文字列「アンドロイド-14」でターゲットを見つけることができませんでした。これは、ダウンロードしたOpenCV zipファイル内のbuild.gradleファイルが、Android Studioバージョン1.4.1にはデフォルトではないAndroid APIバージョン14を使用してコンパイルするように指示しているために発生します。 ここに画像の説明を入力してください

  5. プロジェクト構造ダイアログを開きますMenu:/ File / Project_Structure)。「app」モジュールを選択し、「依存関係」タブをクリックして、モジュールの依存関係として:openCVLibrary310を追加します。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 / OpenCVLibrary310ディレクトリが作成されましたが、プロジェクトビューからは表示されません。

ここに画像の説明を入力してください

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

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

  1. プロジェクトを再同期してから、クリーン/再構築します。(メニュー:/ Build / Clean_Project)エラーなしでクリーンアップおよびビルドされ、0:Messages画面に:openCVLibrary310への多くの参照が表示されます。

    ここに画像の説明を入力してください

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

    次のスクリーンショットのように、javaですべてのOpenCV関数を含むopenCVLibrary310モジュールが表示されます。

    ここに画像の説明を入力してください

  2. コピー{解凍-DIR} / SDK /ネイティブ/ LIBSに、あなたのAndroidプロジェクトにディレクトリ(およびその下のすべてのものを)cvtest1 / OpenCVLibrary310 / srcに/メイン/、その後から、あなたのコピーの名前を変更LIBSjniLibs。これで、cvtest1 / OpenCVLibrary310 / src / main / jniLibsディレクトリが作成されました。プロジェクトを再同期すると、このディレクトリがopenCVLibrary310の下のプロジェクトビューに表示されます

    ここに画像の説明を入力してください

  3. 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モニターに次のような行が表示されるはずです ここに画像の説明を入力してください (エラーメッセージのある行がなぜ存在するのかわかりません)。

  4. 次に、実際にいくつかのopenCVコードを使用してみます。以下の例では、Androidエミュレーターのcvtest1アプリケーションのキャッシュディレクトリに.jpgファイルをコピーしました。以下のコードは、この画像を読み込み、キャニーエッジ検出アルゴリズムを実行して、結果を同じディレクトリの.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. アプリケーションを実行します。エミュレータは、白黒の「エッジ」イメージを作成する必要があります。Androidデバイスモニターを使用して、出力を取得したり、アクティビティを書き込んで表示したりできます。

落とし穴

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

2
2月16日の編集:jniLibsがメインアプリディレクトリではなくopenCVLibrary310ディレクトリに配置されました。どちらも機能しますが、opencvの部分に保持する方が私にはきれいに思えます。プラスより多くのスクリーンショットや「落とし穴」の部分。
ssimm

一部のインポート文が欠落していると思いますが、それ以外は非常に良い仕事です!+1
AllanNørgaard2016年

1
私はあなたの答えを追ったが失敗した。1私はエラーが発生しましたOpenCV error: Cannot load info library for OpenCV 2 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/www.deven.com.opencv-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libopencv_java3.soあなたが書いたように、私がこれらのエラーについて少しずつ実行しました。
Devendra Singh 2016

2
@DevendraSingh私はあなたが得たのと同じエラーを受け取りましたが、私はステップ9を見逃していたことに気づきました
aasu

2
AndroidスタジオでopencvをC ++でコーディングしたい場合はどうなりますか?
user8663682

37

上記の(素晴らしい!)回答のすべての手順とスクリーンショットで逃げ出したいと思ったすべての人にとって、これは次のようにしてうまくいきました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\javaOK ]をクリックして、すべてのデフォルトダイアログを受け入れます。
  5. モジュールのgradleファイルで、appこれを依存関係ブロックに追加します。

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

ここで、XYZはダウンロードする正確なバージョンです。たとえば、私の場合:

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

1
素晴らしくシンプルなthnx ;-)バージョン3.2.0でも動作します。
ブラカルニア2017年

2
ありがとう、それは確かに簡単な解決策です。私から一点。新しいOpenCVモジュールをコンパイルできませんでした。ここでの回答は、この問題を解決するのに役立ちました。stackoverflow.com
a /

@blacharniaの発言に追加するには、クレードルの依存関係セクションで、310ではなく 'compile project(':openCVLibrary320 ')'を使用していることを確認してください
Abraham Philip

おそらくより一般的には、上記のコメントに追加するには、「compile project( ':openCVLibraryXYZ')」を使用します。ここで、XYZは「ドット」なしのopenCV Android SDKのバージョン番号です。これはバージョン3.4.0でも機能します-> ie 「compile project( ':openCVLibrary340')」を使用
Mick

@ミックありがとう、私はあなたの提案に従って答えを編集しました。
yshahak

9

Android Studio 3.4 + OpenCV 4.1

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

  2. 通常どおり、新しいAndroid Studioプロジェクトを作成します。をクリックして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。[Build System ndk-buildand path to OpenCV.mkfile]を選択します/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();

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


上記では、「アプリケーションID "org.opencv"を.....に置き換えます」と言いましたが、「with」の後には何もありません。明確にしていただけますか?「applicationIdエントリを削除し、次のように2つのエントリを追加する」と言いますか
Dale

@Daleはい、application ID "org.opencv"文字列を2つの文字列に置き換えます:minSdkVersion 21and targetSdkVersion 28(app / build.gradleファイルの値によると)
Plo_Koon

私はあなたが説明したようにすべてのステップに従いました。しかし、エラーE / artの取得:dlopen( "/ data / app / com.example.objectsegmentation-1 / lib / arm64 / libopencv_java4.so"、RTLD_LAZY)failed:dlopen failed:library "libc ++ _ shared.so" not found
Masthan


0

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

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

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

1つの注意点は、ハードウェアデバッグデバイスを使用する必要があったということです(AVD Managerによると)アームエミュレーターの動作が遅すぎたためです。また、レポのREADMEで説明されているように、このバージョンにはx86またはx86_64のサポートが含まれていません。

それは構築され、推奨されるテストのようです:

static {
    OpenCVLoader.initDebug();
}

私には正しいように見えるたくさんの出力を吐き出します。


これはAndroid Studioの新しいプロジェクトからのものです。何もインポートせず、何もダウンロードしませんでした。gradle依存関係を追加して同期します。
Naumdev 2018

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.