是否可以使用 CoreML 和 ARKit 获取 World 对象的 "SCNVector3" 位置?

Is it possible to get a "SCNVector3" position of a World object using CoreML and ARKit?

我正在研究一个基于 AR 的解决方案,我在其中使用 SceneKit 和 ARKit 渲染一些 3D 模型。我还集成了 CoreML 来识别对象并在场景中渲染相应的 3D 对象。

但是现在我只是在检测到对象时将其渲染在屏幕中央(仅适用于我拥有的对象列表)。是否可以获取真实世界对象的位置,以便我可以在对象上方显示一些叠加层?

也就是说,如果我扫描了一个水瓶,我应该可以得到水瓶的位置。它可以在水瓶中的任何地方,但不应该放在水瓶外面。这可能使用 SceneKit 吗?

您所要求的所有部分在理论上都是 可能的,但是 a) 对于几个部分,没有集成的 API 可以为您做事,并且 b) 您可能会报名参加 more difficult problem than you think

你的 Core ML 集成可能有一个图像分类器,因为大多数容易找到的 ML 模型都是这样做的。图像分类回答了一个问题:“这是什么图片?”

您要查找的内容至少涉及另外两个问题:

  1. “鉴于此图像已被分类为包含 (某些特定对象),该对象在 2D 图像中的什么位置?”
  2. “给定检测到的物体在 2D 视频图像中的位置,它在 ARKit 跟踪的 3D space 中的什么位置?”

问题1很有道理。在 ML 社区中有一些模型可以同时进行分类和检测(location/bounds 在图像中)。最著名的可能是 YOLO — here’s a blog post about using it with Core ML

问题2是“研究团队和五年”部分。你会在 YOLO 论文中注意到,它只为检测到的对象提供粗略的边界框——也就是说,它在 2D 图像 space 中工作,而不是进行 3D 场景重建。

要真正了解物体的形状,甚至是 3D 边界框,就需要将物体检测与场景重建相结合。例如,如果一个物体在 2D 图像中有一定的高度,那么您是在看一个高而占地面积小的 3D 物体,还是一个又长又低的物体,向远处退去?这种集成将需要拆开 ARKit 的内部工作原理,这是 Apple 以外的任何人都无法做到的,或者从头开始重新创建类似 ARKit 的东西。

不过,您可能会做出一些假设,以便从 2D 边界框获得非常粗略的 3D 形状估计。例如,如果您对盒子的下角进行 AR 命中测试,发现它们在水平面上,您可以猜测盒子的 2D 高度与对象的 3D 高度成正比,并且它的平面上的足迹与盒子的宽度成正比。您必须进行一些研究和测试,看看这样的假设是否成立,尤其是在您的应用程序涵盖的任何用例中。