web-dev-qa-db-ja.com

OpenCVを使用した長いorg.opencv.core.Mat.n_Mat()エラーの実装は見つかりませんでした

adaptiveThresholdにOpenCVを使用しています。 OpenCVを使用した画像処理のコードは次のとおりです。

imageMat=new Mat();
Utils.bitmapToMat(bmp, imageMat);
Imgproc.cvtColor(imageMat, imageMat, Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur(imageMat, imageMat, new Size(3, 3), 0);
Imgproc.adaptiveThreshold(imageMat, imageMat, 255,Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 5, 4);

しかし、Matの宣言中にエラーが発生します。

No implementation found for long org.opencv.core.Mat.n_Mat() (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__)
        at org.opencv.core.Mat.n_Mat(Native Method)
        at org.opencv.core.Mat.<init>(Mat.Java:24)
        at com.example.pial_pc.instantbookreview.ImageCapture$3.onPictureTaken(ImageCapture.Java:105)

私はOpenCVが初めてなので、エラーを明確に理解していません。このコードが属するJavaクラス全体は here です。

エラーを解消するにはどうすればよいですか?

28
Pial Kanti

エラーを正常に除去し、この行の実行中にアプリがクラッシュしませんimageMat=new Mat();

エラーの理由は、OpenCV4Androidライブラリをロードする前にAndroidが "onCreate"メソッドを呼び出すためです。 OpenCVManagerを使用したOpenCVの非同期初期化を使用しました。以前にBaseLoaderCallbackを作成しましたonCreateメソッド。その中で私はnew Mat()のように宣言しました:

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

次に、onResume()で、現在のアプリケーションパッケージ内からOpenCVライブラリがロードおよび初期化されているかどうかを確認しました。コードは次のとおりです。

public void onResume()
{
    super.onResume();
    if (!OpenCVLoader.initDebug()) {
        Log.d("OpenCV", "Internal OpenCV library not found. Using OpenCV Manager for initialization");
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
    } else {
        Log.d("OpenCV", "OpenCV library found inside package. Using it!");
        mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    }
}

そして、私のエラーはなくなりました。完全に更新されたJavaクラスは こちら です。

参照リンク:

  1. OpenCVの非同期初期化Android OpenCVManagerを使用
  2. Tutorial1Activity.Java
43
Pial Kanti

この行をonCreateメソッドに追加し、openCvManagerがインストールされていることを確認します。これはうまくいきました。

OpenCVLoader.initDebug();

7

アクティビティでopenCVライブラリを初期化し、onCreate()メソッドの前にこのコードを追加します

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

このlibをプロジェクトに追加します。 https://github.com/hschott/Camdroid

7
user7176550

たぶん、あなたはopenCVライブラリを含めることを忘れています。

含める

static { 
     System.loadLibrary("opencv_Java");
}

openCVバージョン3の場合、代わりに以下を追加する必要があります。

static { 
     System.loadLibrary("opencv_Java3");
}

がんばろう :)

1