web-dev-qa-db-ja.com

OpenCvマネージャーなしでOpenCVコードを実行する方法

OpenCV4Androidバージョン2.4.10を使用していますが、Samsung Galayx GT-I9300でコードをテストしています。私が抱えている問題は、Opencvコードを実行するためにPlayストアからOpencvマネージャーをダウンロードする必要があることです。そうしないと、アプリが起動しません。 「ここに示されているように、いくつかのポストを参照しました Android App "にOpenCV Managerを統合する方法Android OpenCVマネージャーをダウンロードする必要はありませんが、残念ながら、OpenCVマネージャーがインストールされていない限り、アプリは起動しません。

私は次のことを試しました

static {
    if (!OpenCVLoader.initDebug()) {
        // Handle initialization error
    }
}

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS:
            {
                Log.i(TAG, "OpenCV loaded successfully");
                mOpenCvCameraView.enableView();
            } break;
            default:
            {
                super.onManagerConnected(status);
            } break;
        }
    }
};
...
...
...

@Override
public void onResume() {
    super.onResume();
    Log.w(TAG, "onResume");

    if (!OpenCVLoader.initDebug()) {
        Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, getActivity(), mLoaderCallback);
    } else {
        Log.d(TAG, "OpenCV library found inside package. Using it!");
        mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    }
}

しかしそれは問題を解決しませんでした。 Android Opencv Managerをダウンロードせずにopencvコードを実行する方法を教えてください?

更新

initAsyncの使用:

アプリの製品版で「initAsync()」を使用する方法の例を提供していただけませんか? 「intiAsync」のシグネチャは次のとおりなので、静的ブロックで使用しようとしましたが、もちろんできません。静的ブロック内で「this」キーワードもコールバック「mLoaderCallback」への参照も使用できません

public class MainActivity extends AppCompatActivity {

static {
    //OpenCVLoader.initDebug();
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, this, mLoaderCallback); //this keyword and "mLoaderCallback" are not defined in this scope
}

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS: {
                Log.i("MainActivity", "OpenCV loaded successfully");
            }
            break;
            default: {
                super.onManagerConnected(status);
            }
            break;
        }
    }
};

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

    Mat m = new Mat(100, 100, CvType.CV_8UC4);
    Log.d("MainActivity", "m.width()" + m.width());
    Log.d("MainActivity", "m.height()" + m.height());
}
}
19
user2121

段階的な手順が必要な場合は、最初からSampleOpenCVプロジェクトを作成することから始め、新しいプロジェクトで次の手順を実行することをお勧めします。プロジェクトが機能し始めたら、変更をメインプロジェクトに移行してみてください。

  1. OpenCVパッケージをダウンロードAndroid from Opencv.org [ Direct Download Link V3.1 ]
  2. Zipを任意の場所に解凍し、SampleOpenCVプロジェクトをAndroid Studio、次に File-> New-> Import Module )で開きます。新しいポップアップを開いてモジュールパスを入力し、_{unzipped_opencv}/sdk/Java_を選択すると、SampleOpenCVの下に_OpenCVLibrary310_ディレクトリが作成されます。
  3. ここで_SampleOpenCV/OpenCVLibrary310/build.gradle_を開き、次のフィールドを_SampleOpenCV/app/build.gradle_からコピーします。
    • compileSdkVersion
    • buildToolsVersion
    • minSdkVersion
    • targetSdkVersion
  4. SampleOpenCVプロジェクトを右クリックして Open Module Settings をクリックし、_Modules >> app_を探して Dependencies を選択します

enter image description here

  1. 右上の+記号をクリックして、ポップアップウィンドウで 3 Module Dependency を選択します。ここで_OpencvLibrary310_を選択します。ポップアップを閉じて、gradleを同期させます。

  2. Libsフォルダー{unzipped_opencv}/sdk/native/libsをAndroid Studioをapp/src/mainの下にコピーし、名前をjniLibsに変更します(ここでケースを確認してください)。

  3. 完了です。

_public class MainActivity extends AppCompatActivity {
    static {
        OpenCVLoader.initDebug();
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Mat m = new Mat(100, 100, CvType.CV_8UC4);
    }
}
_

[〜#〜]注[〜#〜]OpenCVLoader.initDebug()は、ローカルで開発している場合と同様に、デバッグ目的でのみ使用する必要がありますあなたのマシンで。ただし、Playストアなどでアプリをリリースする必要がある本番環境では、OpenCVLoader.initAsync()を使用する必要があります。 OpenCVLoaderを実際に初期化するには、電話によっては時間がかかります。したがって、それをinitDebug()を使用してロードすると、メインスレッドで実行され、UIがわずかにブロックされる可能性があります。そのため、initAsync()を使用して実現できるOpenCVをバックグラウンドでロードすることをお勧めします

30
ZdaR

私の方法についてあなたに共有します。

  1. Androidでopencv sdkをダウンロード: https://opencv.org/releases.html
  2. Opencv sdkを解凍します
  3. プロジェクト(ADVisionProjectなど)で、settings.gradleファイルを開き、以下に構成を追加します

-

def opencvsdk = '<path_to_opencv_Android_sdk_rootdir>'
include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')

私のsettings.gradleファイルの例

include ':app'

def opencvsdk = '/Volumes/Data/Projects/machine-learning/OpenCV-Android-sdk'
include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')
  1. App/build.gradleで、opencvモジュールを依存関係に追加します

-

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
   ....
    implementation project(':opencv')

}
  1. テスト用のコードをいくつか記述します。以下のコードについては、ドローアブルイメージをマットに読み取り、カラーをグレーモードに変換し、マットをビットマップに変換し、ビットマップをImageViewに表示します。

-

import Android.graphics.Bitmap;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.widget.ImageView;

import org.opencv.Android.OpenCVLoader;
import org.opencv.Android.Utils;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;

import Java.io.IOException;

public class MainActivity extends AppCompatActivity {

    static {
        OpenCVLoader.initDebug();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageView imageView = findViewById(R.id.activity_main_iv_result);
        try {
            Mat img = Utils.loadResource(this, R.drawable.eye);
            Mat gryimg =  new Mat(img.size(),CvType.CV_8U);
            Imgproc.cvtColor(img, gryimg, Imgproc.COLOR_RGB2GRAY);
            Bitmap bm = Bitmap.createBitmap(gryimg.cols(), gryimg.rows(), Bitmap.Config.ARGB_8888);
            Utils.matToBitmap(gryimg, bm);
            imageView.setImageBitmap(bm);
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}
  1. ApkをビルドしてAndroidデバイスにインストールします。OpenCVマネージャーは必要ありません。しかし、apkのサイズはかなり大きく、最初は約80MBであることを認識しています。

enter image description here

Opencv-3.4.1-Android-sdkおよびAndroid Studio 3.1.3でテスト済み

SDKをプロジェクトに統合する方法がいくつかあります。より多くのオプションを取得するには/sdk/build.gradleを読んでください

3
Nhan Cao

ネイティブライブラリをロードする正しい方法は次のとおりです。

System.loadLibrary("opencv_Java3");
0
Adam Freeman