【问题标题】:How to access cascade xml file from C++ dll in Android如何从 Android 中的 C++ dll 访问级联 xml 文件
【发布时间】:2018-09-28 13:29:48
【问题描述】:

我正在开发一个在 Unity 中使用 OpenCV C++ dll(.so 文件)的 android 应用程序。 C++ dll 访问级联文件以使用 OpenCV 函数。

*C++ DLL 端代码

cv::String face_cascade_name = "haarcascade_frontalface_alt.xml";
if (!face_cascade.load(face_cascade_name)) {
    printf("--(!)Error loading face cascade, please change face_cascade_name in source code.\n");
    return -1;
};

但是,如果我在 Unity 中构建一个 android 应用程序并将该应用程序安装在 Android 设备上,它无法加载 xml 文件。

如何在 Android apk 中访问 C++ DLL 中的级联 xml?

*如果我将 xml 放到 Unity 中的 assets/StreamingAssets 中,则 xml 文件存在于 myapp.apk/assets 文件夹中。

【问题讨论】:

  • 你的android系统上的xml文件在哪里?您的应用程序是否具有访问该文件(或文件系统)的 android 权限?
  • 如果我将 xml 放到 Unity 中的 assets/StreamingAssets 中,xml 文件存在于 myapp.apk/assets 文件夹中。(我附上了快照)但是我不知道如何访问压缩文件(= apk) 来自 C++ 端代码的 xml 文件。
  • 如果我没听错的话,您可以使用Application.streamingAssetsPath + "/" + filename 访问您的文件吗?
  • @Micka 我想知道如何从 C++ 代码访问 apk 中的 xml 文件(=apk 中的 so 文件)。

标签: android c++ opencv


【解决方案1】:

Android 是一种特殊情况,因为 StreamingAssets 文件夹已被 OpenCV 文件阅读器压缩且无法使用。您必须 1)将文件从 StreamingAssets 文件夹复制到持久数据路径(在统一手册中有关于如何复制和写入文件的文档),2)使用 Application.persistantDataPath 获取该文件的名称,例如:

string cascadeFileName = (Application.persistentDataPath + "/" + fileName);

【讨论】:

  • 警告:这适用于较新版本的 OpenCV 不同程度的成功;无论出于何种原因,教程提供的标准“Init”包装器无法识别我传递给它的级联文件的持久数据路径。 4.0.1 可以正常工作,4.5.3 没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
相关资源
最近更新 更多