Use OpenCV to load images from the assets folder in Android

I'm having trouble trying to use opencv 3.0 in Android to load images placed in asset folders. I've read a lot of answers here, but I can't figure out what I'm doing wrong

"My image. JPG" is directly placed in the asset folder created by Android studio. This is the code I am using. I have checked and the library has been loaded correctly

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

When I try to run my application, this is what I get:

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

The image seems to have no size. I guess it's because it's not loaded correctly. I also try to load it and put it in the drawable folder, but it doesn't work properly anyway. I prefer to use one of the assets. Anyone can help me and tell me how to find the correct image path?

thank you

resolvent:

Problem: imread requires an absolute path, and your asset is in APK, and the underlying C class cannot read from here

Option 1: load the image into mat without using the read in the paintable folder

                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: copy the picture to the cache and load it from the absolute path

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

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>