android - Wikitude 如何在同样使用 OpenCV 的项目中使用?

标签 android ios opencv xamarin wikitude

我们无法让 Wikitude 在也使用 OpenCV 的 Xamarin 跨平台项目(Android 和 iOS)中工作。

设置

使用具有以下设置的 MvvmCross 的 Xamarin 跨平台项目:

  • 核心项目,PCL 提供 View 模型、业务逻辑和与平台无关的通用逻辑。
  • OpenCV.Droid,为 Android 部分提供 OpenCV 的绑定(bind)项目。
    • Android 库 (AAR),由适用于 Android 的官方 OpenCV SDK 创建。
  • OpenCV.iOS,绑定(bind)项目,使用 P/Invoke 向 iOS 部分提供 OpenCV。
    • 自己的静态库项目。
    • 包括来自官方 OpenCV SDK for iOS 的静态库,它只是一个 Apple 框架(结合了静态库和 header )。
    • 通过自己的 API 公开 OpenCV 功能,以最大限度地减少编码代码量。
  • UI.Droid,Android 平台项目,提供 View 和特定于平台的逻辑。
  • UI.iOS,iOS 平台项目,提供 View 和特定于平台的逻辑。

我们的 ARchitectWorld 使用对象跟踪,并且可以在适用于 Android 和 iOS 的 Xamarin 组件中包含的 Wikitude 示例中成功进行测试。

问题

在我们的 iOS 项目中启动 ARchitectWorld 时,世界被加载,我们收到 onLoaded - 创建 TargetCollectionResource 时的回调,以及 onTargetsLoaded - 创建 ObjectTracker 时的回调。到目前为止,Wikitude 的示例项目和我们的项目中的行为是相同的。

问题是,使用相同 WTO 文件的相同对象在我们的项目中未被识别,而它在示例项目中运行良好。

调查

当出现该问题时,我们简化了处理 ARchitectWorld 的 ViewController 中的逻辑,以排除我们代码中的问题。

然后,我们通过将 ARchitectWorld 添加到我们存储库历史记录中的不同提交来调查我们的项目,我们认为这些更改是关键更改并找到了提交,对象跟踪正在运行。

为了找到关键更改,我们使用了 git-bisect 并确定了引入问题的提交。通过该提交,我们的 OpenCV 绑定(bind)项目的静态库已更新,因为它缺少设备架构 - 它只有模拟器架构,基本上是 x86_64。

在那之后,我们假设 Wikitude 可能在内部使用 OpenCV,并且我们可能会遇到符号冲突,即使链接器没有提示重复符号。虽然,Wikitude 不使用 OpenCV,但搜索 Wikitude 和 OpenCV 的结合使用时,得到了一些没有解决方案的结果:

然后我们发现,Wikitude 和 OpenCV 都包含部分相同的第三方代码。

问题

在链接的帖子中,Wikitude 支持非常公开地回答,建议进行内部讨论并返回给 OP。尽管线程中没有进一步的答案,这表明要么没有答案,要么已经通过另一个 channel 交换了信息。

在其他帖子中,我们看到了将 OpenCV 与 Wikitude 结合使用的建议,方法是准备视觉数据并将其提供给输入插件。这表明,OpenCV 和 Wikitude 可以一起使用。

  • 在像我描述的那样的 Xamarin 项目中,能否以及如果如何实现这一目标?
  • 是否需要特定版本的 OpenCV? (我们目前使用的是 v3.3.1。)

也许社区也实现了这一点,我非常期待有关的答案。我们还联系了 Wikitude 支持,如果我们收到任何有助于回答问题的信息,我们将在这里反馈。

最佳答案

我们终于有了一个使用 Wikitude 和 OpenCV 的工作应用程序。尽管我们无法清楚地确定根本原因。导致有效解决方案的步骤如下:

  1. 使用构建脚本 build_framework.py--without 参数仅使用我们需要的模块从源代码构建 OpenCV,以减少可能的冲突。无论如何这是错误的,因为二进制文件在 native 链接期间被剥离并且没有出现错误。
    • 使用 v3.3.1 的可下载源代码(我们一直使用的 OpenCV 版本)执行此操作时,我们在编译 Xamarin 项目时在 native 链接期间遇到了符号问题。
    • 这导致了 OpenCV 中的一个问题,该问题最近已得到修复 (2018-01-10):https://github.com/opencv/opencv/issues/10565
      (我们没有使用 --dyanmic 进行构建,在编译 Xamarin 项目时在 native 链接期间仍然遇到错误。)
  2. 从 GitHub 上的当前 master 构建 OpenCV(提交 17233c687e2d51010dab2587f2532a460ccdb4b6,v3.4.0 之后的内容)结果证明可以工作并且不会破坏 Wikitude:https://github.com/opencv/opencv
  3. 使用适用于 iOS 的可下载 OpenCV 框架 (v3.4.0) 在 native 链接期间导致了同样的问题。

长话短说

从 GitHub 上的源代码构建 OpenCV,至少提交 17233c687e2d51010dab2587f2532a460ccdb4b6 结果证明不会破坏 Wikitude。

我们将查看下一个 OpenCV 版本的可下载 iOS 框架,看看它是否有效并返回使用它,而不是自己构建 OpenCV。

关于android - Wikitude 如何在同样使用 OpenCV 的项目中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48707772/

相关文章:

ios - 未调用完成处理程序 - iOS

opencv - 用opencv训练自己的物体检测器

c++ - 在 OpenCV 中使用 High Profile 从 High Profile mp4 文件编写 H.264 视频

android - 在 android 中的触摸监听器中弹跳球应用程序

Android:将图像保存到 Sqlite 数据库中

安卓运行时.getRuntime().exec

java - Android - 如何返回到之前的不同 Activity

ios - UITableView - 什么是 indexPath?

ios - CMDeviceMotion 的磁场属性不正确?

python - cv2 CascadeClassifier 参数