【问题标题】:Vision and ARKit frameworks in Xcode projectXcode 项目中的 Vision 和 ARKit 框架
【发布时间】:2019-05-09 01:20:18
【问题描述】:

我想使用 Xcode 创建一个 ARKit 应用程序。我希望它在不按下按钮的情况下识别通用矩形,并且随后该矩形执行特定功能。

怎么做?

【问题讨论】:

    标签: swift machine-learning augmented-reality arkit apple-vision


    【解决方案1】:

    识别矩形不需要ARKit,只需要Vision

    如果要识别通用矩形,请使用VNDetectRectanglesRequest

    【讨论】:

      【解决方案2】:

      正如您所写的,您需要在项目中使用 VisionCoreML 框架以及 ARKit。您还必须创建一个预训练的机器学习模型(.mlmodel 文件)来对输入数据进行分类以识别您的通用矩形。

      要创建学习模型,请使用以下资源之一:TensorFlowTuriCaffeKeras

      使用带有分类标签.mlmodel,Vision 请求以VNRecognizedObjectObservation 对象的形式返回结果,这些对象标识在捕获的场景中发现的对象。因此,如果图像的相应标签可通过 ARSKView 中的识别过程获得,则将创建一个 ARAnchor(并且可以将 SK/SCN 对象放置在此 ARAnchor 上)。

      这是关于“如何工作”主题的 sn-p 代码:

      import UIKit
      import ARKit
      import Vision
      import SpriteKit
      
      .................................................................
      
      // file – ARBridge.swift
      class ARBridge {
          static let shared = ARBridge()
          var anchorsToIdentifiers = [ARAnchor : String]()
      }
      
      .................................................................
      
      // file – Scene.swift
      DispatchQueue.global(qos: .background).async {
          do {
              let model = try VNCoreMLModel(for: Inceptionv3().model)
              let request = VNCoreMLRequest(model: model, completionHandler: { (request, error) in
      
                   DispatchQueue.main.async {
                       guard let results = request.results as? [VNClassificationObservation], let result = results.first else {
                           print ("No results.")
                           return
                       }
                       var translation = matrix_identity_float4x4
                       translation.columns.3.z = -0.75
                       let transform = simd_mul(currentFrame.camera.transform, translation)
                       let anchor = ARAnchor(transform: transform)
                       ARBridge.shared.anchorsToIdentifiers[anchor] = result.identifier
                       sceneView.session.add(anchor: anchor)
                   }
               }
               let handler = VNImageRequestHandler(cvPixelBuffer: currentFrame.capturedImage, options: [:])
               try handler.perform([request])
           } catch { 
               print(error) 
           }
      }
      
      .................................................................
      
      // file – ViewController.swift
      func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? {
          guard let identifier = ARBridge.shared.anchorsToIdentifiers[anchor] else {
              return nil
          }
          let labelNode = SKLabelNode(text: identifier)
          labelNode.horizontalAlignmentMode = .center
          labelNode.verticalAlignmentMode = .center
          labelNode.fontName = UIFont.boldSystemFont(ofSize: 24).fontName
          return labelNode
      }
      

      您可以下载两个由 Vision 工程师编写的 Apple 项目(示例代码):

      Recognizing Objects in Live Capture

      Classifying Images with Vision and Core ML

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2021-09-23
        • 2018-02-08
        • 2014-04-23
        • 2013-05-02
        • 2017-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多