我们无法让 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 的工作应用程序。尽管我们无法清楚地确定根本原因。导致有效解决方案的步骤如下:
- 使用构建脚本
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 链接期间仍然遇到错误。)
- 从 GitHub 上的当前 master 构建 OpenCV(提交
17233c687e2d51010dab2587f2532a460ccdb4b6
,v3.4.0 之后的内容)结果证明可以工作并且不会破坏 Wikitude:https://github.com/opencv/opencv - 使用适用于 iOS 的可下载 OpenCV 框架 (v3.4.0) 在 native 链接期间导致了同样的问题。
长话短说
从 GitHub 上的源代码构建 OpenCV,至少提交 17233c687e2d51010dab2587f2532a460ccdb4b6
结果证明不会破坏 Wikitude。
我们将查看下一个 OpenCV 版本的可下载 iOS 框架,看看它是否有效并返回使用它,而不是自己构建 OpenCV。
关于android - Wikitude 如何在同样使用 OpenCV 的项目中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48707772/