2016-08-21 1 views
2

Je suis coincé en essayant de charger une image placée dans le dossier des actifs avec OpenCV 3.0 dans Android. J'ai lu beaucoup de réponses ici, mais je ne peux pas comprendre ce que je fais mal. "My image.jpg" est placé directement dans le dossier assets créé par Android Studio. Ceci est le code que j'utilise. J'ai vérifié et la bibliothèque a été chargée correctement.Charger des images avec OpenCV à partir du dossier des actifs dans Android

 Mat imgOr = Imgcodecs.imread("file:///android_asset/myimage.jpg"); 
     int height = imgOr.height(); 
     int width = imgOr.width(); 
     String h = Integer.toString(height); 
     String w = Integer.toString(width); 

     if (imgOr.dataAddr() == 0) { 
      // If dataAddr() is different from zero, the image has been loaded 
      // correctly 
      Log.d(TAG, "WRONG UPLOAD"); 
     } 

     Log.d(h, "height"); 
     Log.d(w, "width"); 

Lorsque je tente de lancer mon application, voici ce que je reçois:

08-21 18:13:32.084 23501-23501/com.example.android D/MyActivity: WRONG UPLOAD 
08-21 18:13:32.085 23501-23501/com.example.android D/0: height 
08-21 18:13:32.085 23501-23501/com.example.android D/0: width 

Il semble que l'image n'a pas de dimension. Je suppose que parce qu'il n'a pas été chargé correctement. J'ai aussi essayé de le charger en le plaçant dans le dossier drawable, mais ça ne marche pas de toute façon et je préférerais utiliser les assets. Quelqu'un peut m'aider s'il vous plaît et me dire comment trouver le bon chemin de l'image?

Merci

Répondre

1

Problème: imread a besoin chemin absolu et vos biens sont à l'intérieur d'un apk, et C++ sous-jacente des classes ne peut pas lire à partir de là. Option 1: chargez l'image dans le Mat sans utiliser le fichier imread du dossier drawable.

   InputStream stream = null; 
       Uri uri = Uri.parse("android.resource://com.example.aaaaa.circulos/drawable/bbb_2"); 
       try { 
        stream = getContentResolver().openInputStream(uri); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } 

       BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); 
       bmpFactoryOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; 

       Bitmap bmp = BitmapFactory.decodeStream(stream, null, bmpFactoryOptions); 
       Mat ImageMat = new Mat(); 
       Utils.bitmapToMat(bmp, ImageMat); 

Option 2: copie l'image dans le cache et charge depuis le chemin absolu.

File file = new File(context.getCacheDir() + "/" + filename); 
if (!file.exists()) 
try { 

InputStream is = context.getAssets().open(filename); 
int size = is.available(); 
byte[] buffer = new byte[size]; 
is.read(buffer); 
is.close(); 

FileOutputStream fos = new FileOutputStream(file); 

fos.write(buffer); 
fos.close(); 
} catch (Exception e) { 
throw new RuntimeException(e); 
} 

if (file.exists()) { 
image = cvLoadImage(file.getAbsolutePath(), type); 
} 
+0

J'ai utilisé le dossier drawable comme vous l'avez suggéré et maintenant cela fonctionne. Merci! – andraga91