【问题标题】:How to read an image into a Mat object using opencv c++ and android studio ndk?如何使用 opencv c++ 和 android studio ndk 将图像读入 Mat 对象?
【发布时间】:2019-02-08 07:53:30
【问题描述】:

我已经搜索了几个小时,但似乎无法找到我的问题的答案。我在 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 中的程序返回“图像未加载”字符串。我认为目前的主要问题是,我不完全了解如何使用文件路径这一事实?在 android studio 中,我在 res/drawable/ring.png 下包含了一张图片。我可以使用应用程序的 java 端查看此图像。

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

任何帮助将不胜感激。

编辑:

【问题讨论】:

  • 为什么路径中有双斜杠?
  • 当我在 Qt 中编码时,我读到 C++ 路径必须被转义。因此我在 android ndk 中使用了相同的实现。
  • 转义符号是反斜杠(\),而不是正斜杠(/)——需要特殊处理的是前者,而不是后者...
  • 谢谢,你说得对。我用 c++ 代码对其进行了测试,只有一个斜杠有效。但是它并没有解决android中的问题。
  • 是的,我知道,但似乎仍然值得一提。现在,那条路径应该是绝对的吗?如在根目录中,有一个名为“drawable”的子目录,其中包含文件“ring.png”?您可以将其作为文件打开(例如fstream)并从中读取吗?

标签: c++ opencv android-ndk opencv4android


【解决方案1】:

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

问题一:指定的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 文件资源管理器,以帮助浏览外部或内部存储。

问题 2:ndk 访问 res 文件夹是否需要任何权限? 我使用的方法不需要任何权限。但是目前NDK端不能直接从SD卡中读取图片,图片必须从Java端通过assets或者传递图片地址 被读入 Mat 对象(Java 端)。

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

问题 3:有没有类似的方法可以将图像分配给 Mat 对象? 这个问题现在看来是多余的,剥猫皮的方法有很多

简而言之,我认为在使用 Opencv4Android 时更容易坚持 Java 端,并且需要某种形式的图像处理。为了让您开始使用 java,这里是我的代码中的一个小 sn-p。

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

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

祝你好运!

【讨论】:

    【解决方案2】:

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

    除了drawable文件夹,你可以把它保存在assets文件夹中。这也有助于轻松访问多个图像。

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

    然后这个 Mat 文件,你可以传递给 NDK 并使用 OpenCV C++ 处理它。

    谢谢

    【讨论】:

      【解决方案3】:

      如果您看一下 BitmapFactory decode resource works 的方式 - 您会发现从 drawable 获取位图仍然需要解压缩压缩图像。

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

      【讨论】:

        猜你喜欢
        • 2018-05-27
        • 1970-01-01
        • 2014-01-22
        • 2013-04-13
        • 1970-01-01
        • 2017-07-15
        • 1970-01-01
        • 2014-04-26
        相关资源
        最近更新 更多