ARKit 可以将特定表面检测为平面吗?

Posted

技术标签:

【中文标题】ARKit 可以将特定表面检测为平面吗?【英文标题】:Can ARKit detect specific surfaces as planes? 【发布时间】:2017-12-01 04:07:11 【问题描述】:

使用 ios 11 和 iOS 12 以及 ARKit,我们目前能够检测水平表面上的平面,并且我们还可以在表面上可视化该平面。

我想知道我们是否可以通过某种图像文件声明我们想要检测平面的特定表面? (可能会忽略 ARKit 从其他表面检测到的所有其他平面)

如果这不可能,那么我们是否可以捕获检测到的平面(通过图像),然后我们可以通过识别该特定表面的CoreML 模型对其进行处理?

【问题讨论】:

为了分析场景中检测到的结果,我们似乎得到了一个“ARHitTestResult”对象列表。但我不明白我们可以如何从中雕刻出一个形象。 developer.apple.com/documentation/arkit/arhittestresult 【参考方案1】:

ARKit 目前不支持这种东西。您确实可以将检测到的平面捕获为图像,如果您能够通过核心 ML 进行实时匹配,我相信很多人都会感兴趣!

你应该:

获取平面角的 3D 位置 使用sceneView.projectPoint在框架中找到它们的二维位置 从currentFrame.capturedImage 中提取帧 对图像进行仿射变换,使其与您的平面一起被重新投影到一个矩形中 进行一些 ML/图像处理以检测匹配项

请记住,ARKit 矩形检测通常不能很好地对齐,并且只能具有整个平面的一部分。

最后,不幸的是,ARKit 公开的特征点没有用,因为它们不包含任何用于跨帧匹配特征点的特征,Apple 也没有说明他们使用什么算法来计算特征点。

【讨论】:

我认为苹果有一个带有二维码提取的演示应用程序,其中执行仿射变换形成二维角,但我不记得我在哪里看到它。 @Guig sceneView.projectPoint 用于平面上的节点位置,为投影视图坐标提供不规则形状。有什么帮助吗?【参考方案2】:

这里是查找水平表面的小演示代码。在#Swift5 Github

【讨论】:

以上是关于ARKit 可以将特定表面检测为平面吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ARKit 中检测垂直平面?

结合 CoreML 对象检测和 ARKit 2D 图像检测

对象检测 ARKit 与 CoreML

向 ARKit 添加自定义视图

如何使用 ARKit 检测触摸并显示新的 SCNPlane?

ARKit 和视觉框架——检测墙壁边缘