ARKit 或 RealityKit——我们如何检测真实世界的物体?
Posted
技术标签:
【中文标题】ARKit 或 RealityKit——我们如何检测真实世界的物体?【英文标题】:ARKit or RealityKit – How can we detect a real world object? 【发布时间】:2020-11-07 06:42:23 【问题描述】:我需要在 AR 中检测一个手提箱,然后估计它的大小。
我们如何在 ios 中使用 ARKit 或 RealityKit 来实现它?
【问题讨论】:
到目前为止你尝试了什么? 我对 AR 很陌生。我能够使用 ARAnchor 检测飞机。然后我想我也可以使用 ARObjectAnchor 检测现实世界的对象,但未能成功。 【参考方案1】:我认为您正在寻找的可能是所谓的“对象语义化”,ARKit 以非常有限的方式支持它:ARMeshClassification
如果您在ARWorldTrackingConfiguration
上启用.sceneReconstruction
(在使用supportsSceneReconstruction(_:)
检查相应设备是否实际支持该功能之后)ARKit 能够对非常简单的对象进行分类,例如椅子、桌子和墙壁,但是(如据我所知)如果不提供供 ARKit 参考的资源,它将无法将手提箱识别为开箱即用的实际手提箱对象。
【讨论】:
【参考方案2】:如果您的目标是实时识别一般的行李箱(而不是某些特定的行李箱),那么 ARKit 将无法满足您的需求。
Apple 的CoreML 框架可用于构建手提箱识别应用程序。以下是一些 Apple 示例代码,演示了使用 Vision Framework(而不是 ARKit)进行对象识别:Recognizing Objects in Live Capture
对于如何从 CoreML 识别跳转到在二维或三个维度上识别和测量手提箱的边缘,我没有任何建议,但我想您不仅需要识别对象,还需要识别顶点(这也听起来像是机器学习任务)。一旦有了这些,您就可以将它们放置在 3D 空间中并测量它们之间的距离,从而计算出手提箱的高度、宽度和深度。
【讨论】:
【参考方案3】:要检测真实世界的对象,请使用以下代码,使用 ARKit
/SceneKit
类:
import ARKit
extension ViewController: ARSCNViewDelegate
func renderer(_ renderer: SCNSceneRenderer,
didAdd node: SCNNode,
for anchor: ARAnchor)
if let _ = anchor as? ARObjectAnchor
let sphereNode = SCNNode(geometry: SCNSphere(radius: 0.25))
node.addChildNode(sphereNode)
class ViewController: UIViewController
@IBOutlet var sceneView: ARSCNView!
let config = ARWorldTrackingConfiguration()
override func viewDidLoad()
super.viewDidLoad()
sceneView.delegate = self
guard let obj = ARReferenceObject.referenceObjects(inGroupNamed: "AR Resources",
bundle: nil)
else fatalError("See no reference object")
config.detectionObjects = obj
sceneView.session.run(config)
你需要把所有需要的reference objects放到Xcode的AR Resources
文件夹中。
在这种情况下,对象的大小是已知的。
后记
如果您需要针对不同手提箱的受控 object detection
或 object recognition
功能,请使用 CoreML 或 Vision 框架,这些框架允许您使用预训练的 .mlmodel
(您可以在 Apple Create ML
应用程序或 Xcode Playground 中创建它)内部最多 10K 图像。
【讨论】:
您的回答很有帮助,但我们似乎只能检测到我们已经扫描过的对象。是否有可能我扫描一个手提箱然后检测其他手提箱。我觉得不对?以上是关于ARKit 或 RealityKit——我们如何检测真实世界的物体?的主要内容,如果未能解决你的问题,请参考以下文章
ARKit 平面检测 - “ARView”类型的值没有成员“会话”