如何使用 opencv c++ 和 android studio ndk 将图像读入 Mat 对象?
How to read an image into a Mat object using opencv c++ and android studio ndk?
我已经搜索了几个小时,但似乎找不到我的问题的答案。我在 android ndk(c++) 中编写了以下代码行,并且我正在使用所需的 opencv 库来完成任务。
void opening_images(){
Mat image ;
sillyString = "I have changed";
String imagePath = "//drawable//ring.png";
image = imread(imagePath,IMREAD_COLOR);
if(image.empty()){
sillyString = "Image not loaded";
}
else {
sillyString = "Image loaded";
}
}
我已经在 Qt 中使用 opencv 测试了这段代码,它在 android studio returns "Image not loaded" 字符串中的程序 fine.At 工作。我认为存在的主要问题是,我不完全理解如何使用文件路径这一事实?在 android 工作室中,我在 res/drawable/ring.png 下包含了一张图片。我可以使用应用程序的 java 端查看此图像。
问题1:指定的imagePath="//drawable//ring.png"是否正确访问ring.png文件?
问题 2:允许 ndk 访问 res 文件夹是否需要任何权限?
问题3:是否有类似的方法可以将图像分配给Mat对象?
任何帮助将不胜感激。
编辑:
如果您看一下 BitmapFactory decode resource works - 您会发现从可绘制对象获取位图仍然需要解压缩压缩图像。
因此请回答您的问题 1:不,这不是访问 ring.png 的正确方法,您必须将资源下载到您的设备或将其解压缩到 byteArray 并使用 imdecode
而不是 imread
另一种在 NDK 中使用保存图像的方法如下,
比drawable文件夹,可以保存在assets文件夹中。这也有助于轻松访问多个图像。
然后BitmapFactory.decodeStream
帮助将其作为位图,Utils.bitmapToMat
用于将位图图像转换为Mat 文件。
然后这个Mat文件,你可以传递给NDK并使用OpenCV C++处理它。
谢谢
因为这是我第一次使用 Android Studio,所以有很多东西要学。我花了一些时间,但这是我发布的问题的答案。
问题一:指定的imagePath="//drawable//ring.png"是否正确访问ring.png文件?
这绝对不是访问图像以进行图像处理时使用的正确路径 etc.The 可绘制文件夹仍可用于更新 ex。通过将图像视图的 src 设置为图像的图像视图
imageView.setImageResource(R.drawable.ring);
在处理图像和 Mat 对象时,我发现最好使用 Android 调试桥将文件复制到设备的 SD 卡。 link 将为您提供安装 adb https://www.howtogeek.com/125769/how-to-install-and-use-abd-the-android-debug-bridge-utility/
的必要步骤
当图像完成复制到 SD 卡时。可以使用内置的 Java 函数 Environment.getExternalStorageDirectory()
找到文件路径。看起来像 /storage/emulated/0/YOUR_file
它取决于用于将文件复制到的位置。
有用提示:为设备下载 ES 文件资源管理器,以帮助浏览外部或内部存储。
问题2:ndk访问res文件夹需要什么权限吗?
我使用的方法不需要任何权限。但是目前NDK端不能直接从SD卡读取图片,图片必须从Java端通过assets或者将读取到 Mat 对象(Java 侧)的图像地址 传递。
Read and write permission is needed in order to access the SD card. This must be set in the manifest.xml and must be correctly implemented in the code. There are many great tutorials on YouTube.
问题3:有没有类似的方法可以将图像赋值给Mat对象?
这个问题现在看来是多余的,给猫剥皮的方法很多。
简而言之,我认为在使用 Opencv4Android 时更容易坚持 Java 并且某种形式的图像处理是 needed.To 让你开始 [=62] =] 这是我的代码中的一小段。
Mat image;
String imageInSD = Environment.getExternalStorageDirectory()+"/Pictures/Data/Birds/"(ImageFolders[i])+"/"+String.valueOf(id)+".png";
image = Imgcodecs.imread(imageInSD,Imgcodecs.IMREAD_COLOR);
祝你好运!!
我已经搜索了几个小时,但似乎找不到我的问题的答案。我在 android ndk(c++) 中编写了以下代码行,并且我正在使用所需的 opencv 库来完成任务。
void opening_images(){
Mat image ;
sillyString = "I have changed";
String imagePath = "//drawable//ring.png";
image = imread(imagePath,IMREAD_COLOR);
if(image.empty()){
sillyString = "Image not loaded";
}
else {
sillyString = "Image loaded";
}
}
我已经在 Qt 中使用 opencv 测试了这段代码,它在 android studio returns "Image not loaded" 字符串中的程序 fine.At 工作。我认为存在的主要问题是,我不完全理解如何使用文件路径这一事实?在 android 工作室中,我在 res/drawable/ring.png 下包含了一张图片。我可以使用应用程序的 java 端查看此图像。
问题1:指定的imagePath="//drawable//ring.png"是否正确访问ring.png文件? 问题 2:允许 ndk 访问 res 文件夹是否需要任何权限? 问题3:是否有类似的方法可以将图像分配给Mat对象?
任何帮助将不胜感激。
编辑:
如果您看一下 BitmapFactory decode resource works - 您会发现从可绘制对象获取位图仍然需要解压缩压缩图像。
因此请回答您的问题 1:不,这不是访问 ring.png 的正确方法,您必须将资源下载到您的设备或将其解压缩到 byteArray 并使用 imdecode
而不是 imread
另一种在 NDK 中使用保存图像的方法如下,
比drawable文件夹,可以保存在assets文件夹中。这也有助于轻松访问多个图像。
然后BitmapFactory.decodeStream
帮助将其作为位图,Utils.bitmapToMat
用于将位图图像转换为Mat 文件。
然后这个Mat文件,你可以传递给NDK并使用OpenCV C++处理它。
谢谢
因为这是我第一次使用 Android Studio,所以有很多东西要学。我花了一些时间,但这是我发布的问题的答案。
问题一:指定的imagePath="//drawable//ring.png"是否正确访问ring.png文件?
这绝对不是访问图像以进行图像处理时使用的正确路径 etc.The 可绘制文件夹仍可用于更新 ex。通过将图像视图的 src 设置为图像的图像视图
imageView.setImageResource(R.drawable.ring);
在处理图像和 Mat 对象时,我发现最好使用 Android 调试桥将文件复制到设备的 SD 卡。 link 将为您提供安装 adb https://www.howtogeek.com/125769/how-to-install-and-use-abd-the-android-debug-bridge-utility/
的必要步骤当图像完成复制到 SD 卡时。可以使用内置的 Java 函数 Environment.getExternalStorageDirectory()
找到文件路径。看起来像 /storage/emulated/0/YOUR_file
它取决于用于将文件复制到的位置。
有用提示:为设备下载 ES 文件资源管理器,以帮助浏览外部或内部存储。
问题2:ndk访问res文件夹需要什么权限吗? 我使用的方法不需要任何权限。但是目前NDK端不能直接从SD卡读取图片,图片必须从Java端通过assets或者将读取到 Mat 对象(Java 侧)的图像地址 传递。
Read and write permission is needed in order to access the SD card. This must be set in the manifest.xml and must be correctly implemented in the code. There are many great tutorials on YouTube.
问题3:有没有类似的方法可以将图像赋值给Mat对象? 这个问题现在看来是多余的,给猫剥皮的方法很多。
简而言之,我认为在使用 Opencv4Android 时更容易坚持 Java 并且某种形式的图像处理是 needed.To 让你开始 [=62] =] 这是我的代码中的一小段。
Mat image;
String imageInSD = Environment.getExternalStorageDirectory()+"/Pictures/Data/Birds/"(ImageFolders[i])+"/"+String.valueOf(id)+".png";
image = Imgcodecs.imread(imageInSD,Imgcodecs.IMREAD_COLOR);
祝你好运!!