【问题标题】:ARKit or RealityKit – How can we detect a real world object?ARKit 或 RealityKit——我们如何检测真实世界的物体?
【发布时间】:2020-11-07 06:42:23
【问题描述】:

我需要在 AR 中检测一个手提箱,然后估计它的大小。

我们如何在 iOS 中使用 ARKit 或 RealityKit 来实现它?

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 我对 AR 很陌生。我能够使用 ARAnchor 检测飞机。然后我想我也可以使用 ARObjectAnchor 检测现实世界的对象,但未能成功。

标签: swift augmented-reality scenekit arkit coreml


【解决方案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 图像。

      【讨论】:

      • 您的回答很有帮助,但我们似乎只能检测到我们已经扫描过的对象。是否有可能我扫描一个手提箱然后检测其他手提箱。我觉得不对?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 2020-12-26
      • 2020-09-21
      • 2020-06-27
      相关资源
      最近更新 更多