web-dev-qa-db-fra.com

Comment exécuter du code OpenCV sans OpenCv Manager

J'utilise OpenCV4Android version 2.4.10 et je teste mon code sur le Samsung Galayx GT-I9300. le problème que j’ai, c’est que je dois télécharger Opencv Manager à partir du Play Store pour que mon code opencv fonctionne, sinon l’application ne pourrait pas démarrer . Je me suis référé à certains postes "comme indiqué ici Comment intégrer OpenCV Manager dans Android App "pour savoir comment puis-je exécuter le code opncv sur Android sans avoir à télécharger OpenCV manager Malheureusement, l'application ne démarre pas tant que OpenCV Manager n'est pas installé.

j'ai essayé le suivant

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

mais cela ne résout pas le problème ..___ S'il vous plaît, laissez-moi savoir comment exécuter du code Opencv sur Android sans télécharger Opencv Manager?

Mettre à jour:

utilisation de initAsync:

souhaitez-vous s'il vous plaît fournir un exemple comment utiliser "initAsync ()" dans la version de production de l'application? parce que j'ai essayé de le faire, mais bien sûr, je ne peux pas l'utiliser dans le bloc statique car la signature de "intiAsync" est la suivante "OpenCVLoader.initAsync (OpenCVLoader.OPENCV_VERSION_2_4_10, this, mLoaderCallback);" et je ne peux pas utiliser "ce" mot-clé ni une référence au rappel "mLoaderCallback" à l'intérieur du bloc statique

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());
}
}
15
user2121

Comme vous voulez une procédure étape par étape, je commencerais donc par créer un projet SampleOpenCV à partir de rien et suggérerais également de suivre les étapes suivantes dans un nouveau projet. Une fois que cela fonctionne, vous pouvez essayer de migrer les modifications vers votre projet principal.

  1. Téléchargez le package OpenCV pour Android à partir de Opencv.org [ Lien de téléchargement direct V3.1 ]
  2. Décompressez le zip dans un emplacement de votre choix, ouvrez le projet SampleOpenCV dans Android Studio, puis Fichier -> Nouveau -> Module d'importation, ce qui ouvrirait une nouvelle fenêtre pour entrer le chemin du module, sélectionnez {unzipped_opencv}/sdk/Java , cela créerait un répertoire OpenCVLibrary310 sous SampleOpenCV.
  3. Ouvrez maintenant SampleOpenCV/OpenCVLibrary310/build.gradle et copiez les champs suivants à partir de SampleOpenCV/app/build.gradle: .____.
    • compileSdkVersion
    • buildToolsVersion
    • minSdkVersion
    • targetSdkVersion
  4. Maintenant, faites un clic droit sur votre projet SampleOpenCV et cliquez sur Paramètres du module ouvert, cherchez Modules >> app et sélectionnez Dépendances

 enter image description here

  1. Cliquez sur le signe + en haut à droite dans la fenêtre contextuelle, puis sélectionnez 3 dépendance du module. Maintenant, choisissez OpencvLibrary310. Fermez la fenêtre et laissez le gradle se synchroniser. 

  2. Copiez le dossier libs {unzipped_opencv}/sdk/native/libs dans Android Studio sous app/src/main et renommez-le en jniLibs (Remarquez le cas ici).

  3. Vous avez terminé.

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

NOTE: OpenCVLoader.initDebug() doit être utilisé à des fins de débogage uniquement lorsque vous développez localement sur votre ordinateur. Mais pour les besoins de la production où vous devez publier l'application sur Play Store, etc., vous devez utiliser OpenCVLoader.initAsync(). L'initialisation d'OpenCVLoader prend un certain temps en fonction du téléphone. Donc, si vous le chargez avec initDebug(), il sera exécuté dans le thread principal, ce qui bloquera l’UI pendant une fraction de temps. Il est donc conseillé de charger l’OpenCV en arrière-plan, ce qui peut être obtenu avec initAsync()

30
ZdaR

Partager à vous de mon chemin.

  1. Téléchargez opencv sdk pour Android à l’adresse: https://opencv.org/releases.html
  2. Décompressez opdv sdk
  3. Dans votre projet (ex ADVisionProject), ouvrez le fichier settings.gradle et ajoutez la configuration ci-dessous.

-

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

Exemple avec mon fichier settings.gradle

include ':app'

def opencvsdk = '/Volumes/Data/Projects/machine-learning/OpenCV-Android-sdk'
include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')
  1. Dans app/build.gradle, ajoutez le module opencv aux dépendances

-

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

}
  1. Ecrire des codes pour les tests. À propos du code ci-dessous, il lit les images dessinées en Mat et convertit les couleurs en mode gris, convertit les Mat en Bitmap et affiche les images Bitmap en 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. Essayez de construire apk et installer sur un appareil Android. Cela ne nécessite pas OpenCV Manager. Mais je me rends compte que la taille de l’APK est assez grande, environ 80 Mo au début.

 enter image description here

Testé avec opencv-3.4.1-Android-sdk et Android Studio 3.1.3

Nous avons un moyen d'intégrer SDK à votre projet. Vous devriez lire /sdk/build.gradle pour avoir plus d'options

3
Nhan Cao

La manière correcte de charger la bibliothèque native est la suivante:

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