使用 OpenCV 从 Android 中的资产文件夹加载图像
Load images with OpenCV from assets folder in Android
我无法尝试在 Android 中使用 OpenCV 3.0 加载放置在资产文件夹中的图像。我在这里阅读了很多答案,但我无法弄清楚我做错了什么。
"my image.jpg" 直接放在 Android Studio 创建的资产文件夹中。
这是我正在使用的代码。我已经检查过,库已正确加载。
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");
当我尝试 运行 我的应用程序时,我得到的是:
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
图片似乎没有尺寸。我猜是因为它没有正确加载。我也尝试加载它,将它放在可绘制文件夹中,但无论如何它都不起作用,我更愿意使用资产之一。
任何人都可以帮助我并告诉我如何找到正确的图像路径?
谢谢
问题:imread 需要绝对路径并且您的资源在 apk 中,底层 c++ 类 无法从那里读取。
选项 1:不使用 drawable 文件夹中的 imread 将图像加载到 Mat 中。
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);
选项 2:将图像复制到缓存并从绝对路径加载。
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);
}
我无法尝试在 Android 中使用 OpenCV 3.0 加载放置在资产文件夹中的图像。我在这里阅读了很多答案,但我无法弄清楚我做错了什么。
"my image.jpg" 直接放在 Android Studio 创建的资产文件夹中。 这是我正在使用的代码。我已经检查过,库已正确加载。
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");
当我尝试 运行 我的应用程序时,我得到的是:
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
图片似乎没有尺寸。我猜是因为它没有正确加载。我也尝试加载它,将它放在可绘制文件夹中,但无论如何它都不起作用,我更愿意使用资产之一。 任何人都可以帮助我并告诉我如何找到正确的图像路径?
谢谢
问题:imread 需要绝对路径并且您的资源在 apk 中,底层 c++ 类 无法从那里读取。
选项 1:不使用 drawable 文件夹中的 imread 将图像加载到 Mat 中。
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);
选项 2:将图像复制到缓存并从绝对路径加载。
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);
}