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 detectionobject recognition 功能,请使用 CoreML 或 Vision 框架,这些框架允许您使用预训练的 .mlmodel(您可以在 Apple Create ML 应用程序或 Xcode Playground 中创建它)内部最多 10K 图像。

【讨论】:

您的回答很有帮助,但我们似乎只能检测到我们已经扫描过的对象。是否有可能我扫描一个手提箱然后检测其他手提箱。我觉得不对?

以上是关于ARKit 或 RealityKit——我们如何检测真实世界的物体?的主要内容,如果未能解决你的问题,请参考以下文章

ARKit 无法识别参考图像

ARKit 平面检测 - “ARView”类型的值没有成员“会话”

如何使用设备指南针将对象或模型放置在统一 ARkit 中?

使用 ARKit 和 CoreML 从远距离检测物体

如何在运行时将 3D 内容加载到 RealityKit 应用程序中?

如何在realitykit中显示来自画廊的图像?