【问题标题】:ARKit and Vision frameworks for Object Recognition用于对象识别的 ARKit 和 Vision 框架
【发布时间】:2018-02-08 01:09:42
【问题描述】:

我非常想要一些关于将 Apple 的新 Vision API 与 ARKit 结合起来以实现对象识别的指导。这不需要跟踪移动的物体,只需识别它在 3d 空间中的稳定状态,AR 体验就会做出相应的反应。

我知道 VuforiaWikitude 等服务可以提供这种体验,但我想仅使用原生 Apple API 进行尝试。

【问题讨论】:

    标签: swift scenekit augmented-reality arkit apple-vision


    【解决方案1】:

    我对这个网站比较陌生,所以我还不能发表评论。

    iOS 11.3 中的 ARKit 1.5 包括 Image Recognition

    还支持运行Vision with ARKit

    我不完全确定您的要求,但这些可能会有所帮助。

    【讨论】:

    • “Using Vision with ARKit”示例并非真正特定于 Xcode 9.3 / iOS 11.3 — 其中的大部分内容都可以在 Xcode/iOS 的发布版本中完成。
    【解决方案2】:
    • 要识别(多个)对象,包括它们的坐标(在 ARKit 中使用),您需要训练一个对象检测器(不是分类器!)

    • 要将其顺利导出到 CoreML 模型中,构建/训练它的最简单方法是 CreateML 和 TuriCreate(稍微不那么容易)。

    • 要将 3D 对象添加到 AR 体验中的特定位置,您需要为其 ARAnchor 找到“worldTransform”(您需要对其进行子类化)。

    • 要找到“worldTransform”,您需要在 ARFrame 上以 2D 方式识别对象的位置触发“hitTest()”。

    好吧,这可能是一个停下来的好地方,因为您的问题相当高级。

    【讨论】:

      【解决方案3】:

      您不一定需要在项目中使用 Vision 框架本身,因为 ARKit 已经具有此功能。您只需要激活一个detectionObjects 实例属性,即可在 iOS 12 中直接使用:

      var detectionObjects: Set<ARReferenceObject> { get set }
      

      让我们看看 Apple 文档是怎么说的:

      使用此属性为 ARKit 选择已知的 3D 对象,以便在用户环境中查找并作为 ARObjectAnchor 呈现以用于您的 AR 体验。

      这是一个工作代码(就这么简单):

      import ARKit
      
      class ViewController: UIViewController {
      
          @IBOutlet var sceneView: ARSCNView!
          let config = ARWorldTrackingConfiguration()
      
          override func viewDidLoad() {
              super.viewDidLoad()
      
              sceneView.delegate = self
      
              // add reference objects into Resources in your project
              guard let objects = ARReferenceObject.referenceObjects(inGroupNamed: "Resources", 
                                                                           bundle: nil) 
              else { 
                  fatalError("No reference here!") 
                  return
              }
      
              config.detectionObjects = objects
              sceneView.session.run(config)
          }
      }
      

      当然,插入一个带有 renderer() 方法的扩展:

      extension ViewController: ARSCNViewDelegate {
      
          func renderer(_ renderer: SCNSceneRenderer,
                       didAdd node: SCNNode,
                        for anchor: ARAnchor) {
      
              if let _ = anchor as? ARObjectAnchor {         // Special Type of anchor
      
                  let sphereNode =  SCNNode(geometry: SCNSphere(radius: 0.05))
                  sphereNode.geometry?.firstMaterial?.diffuse.contents = UIColor.green
                  node.addChildNode(sphereNode)
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-05-09
        • 2017-12-14
        • 2021-09-23
        • 2020-07-06
        • 2021-12-01
        • 2015-09-16
        • 2018-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多