如何使用OpenCV C ++和Android Studio NDK将图像读取到Mat对象中?

时间:2018-09-03 09:16:19

标签: c++ opencv android-ndk opencv4android

我已经搜索了几个小时,但似乎找不到我的问题的答案。我已经在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";

    }
}

我已经使用opencv在Qt中测试了此代码,并且可以正常工作。目前,android studio中的程序返回“未加载图片”字符串。我认为目前存在的主要问题是我不完全了解如何使用文件路径这一事实?在android studio中,我在res / drawable / ring.png下包含了一张图片。我可以使用应用程序的Java端查看此图像。

问题1 :指定的imagePath =“ //drawable//ring.png”是否正确才能访问ring.png文件? 问题2:是否需要允许ndk访问res文件夹的任何权限? 问题3:是否有类似的方法将图像分配给Mat对象?

任何帮助将不胜感激。

编辑:

The directories

3 个答案:

答案 0 :(得分:1)

如果您查看BitmapFactory decode resource works的方式-您将看到从可绘制对象获取位图仍然需要解压缩压缩图像。

所以对您的q1的回答是:不,这不是访问ring.png的正确方法,您要么必须将资源下载到设备上,要么将其解压缩到byteArray并使用imdecode而不是imread

答案 1 :(得分:1)

下面是在NDK中使用保存的图像的另一种方法,

与可绘制文件夹相比,您可以将其保存在资产文件夹中。这样有助于轻松访问多个图像。

然后BitmapFactory.decodeStream有助于将其用作位图,而Utils.bitmapToMat用于将位图图片转换为 Mat 文件。

然后,此Mat文件可以传递给NDK并使用OpenCV C ++对其进行处理。

谢谢

答案 2 :(得分:0)

由于这是我第一次使用Android Studio,因此有很多东西要学习。我花了一段时间,但这是我发布的问题的答案。

问题1:指定的imagePath =“ //drawable//ring.png”是否正确才能访问ring.png文件?

这绝对不是用于图像处理等目的访问图像时使用的正确路径。drawable文件夹仍可用于更新ex。通过将图像视图的src设置为图像

 imageView.setImageResource(R.drawable.ring);

使用图像和Mat对象时,我发现最好使用Android调试桥将文件复制到设备的SD卡。该链接将为您提供安装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 File Explorer ,以帮助您浏览外部或内部存储。

问题2:是否需要允许ndk访问res文件夹的任何权限? 我使用的方法不需要任何权限。但是,在NDK端无法直接从SD卡读取图像的情况下,必须通过使用资产传递图像地址从Java端传递图像< / strong>读入Mat对象(Java端)。

  

需要具有读写权限才能访问SD卡。这必须在manifest.xml中设置,并且必须在代码中正确实现。 YouTube上有很多很棒的教程。

问题3:是否有类似的方法将图像分配给Mat对象? 现在,这个问题似乎很多余,有许多种方法给猫皮

简而言之,我认为使用Opencv4Android时更容易坚持Java方面,并且需要某种形式的图像处理。要开始使用Java,这里是我代码中的一小段。

Mat image;
String imageInSD = Environment.getExternalStorageDirectory()+"/Pictures/Data/Birds/"(ImageFolders[i])+"/"+String.valueOf(id)+".png";

image = Imgcodecs.imread(imageInSD,Imgcodecs.IMREAD_COLOR);

祝你好运!