web-dev-qa-db-fra.com

Aucune implémentation trouvée pour une longue erreur org.opencv.core.Mat.n_Mat () à l'aide d'OpenCV

J'utilise OpenCV pour adaptiveThreshold. Mon code pour le traitement des images avec OpenCV est le suivant:

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);

Mais je reçois une erreur en déclarant Mat. Comme:

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)

En tant que nouveau dans OpenCV, je ne comprends pas très bien l'erreur. Toute la classe Java à laquelle appartient ce code est ici .

Que dois-je faire pour éliminer l'erreur?

20
Pial Kanti

J'ai réussi à éliminer l'erreur et mon application ne se bloque pas lors de l'exécution de cette ligne imageMat=new Mat(); 

La raison de cette erreur est qu'Android appelle la méthode "onCreate" avant de charger la bibliothèque OpenCV4Android. J'ai donc utilisé l'initialisation async d'OpenCV à l'aide de OpenCVManager. J'ai créé BaseLoaderCallback avant la méthode onCreate. Et à l'intérieur de cela j'ai déclaré new Mat () comme ceci:

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;
        }
    }
};

Ensuite, dans onResume (), j’ai vérifié si la bibliothèque OpenCV avait été chargée et initialisée à partir du package d’application en cours ou non. Les codes sont les suivants:

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);
    }
}

Et mon erreur est parti. Ma classe Java entièrement mise à jour est ici .

Liens de référence:

  1. Initialisation Async d'OpenCV sur Android avec OpenCVManager
  2. Tutorial1Activity.Java
37
Pial Kanti

Initialiser la bibliothèque openCV dans votre activité Ajouter ce code avant la méthode onCreate ()

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

ajoutez cette lib dans votre projet: https://github.com/hschott/Camdroid

6
user7176550

Peut-être oubliez-vous d'inclure la bibliothèque openCV.

Comprendre

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

pour OpenCV version 3, vous devriez plutôt ajouter:

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

Bonne chance :)

0
Siddharth Bhatheja