2

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

怎么做?

4

2 回答 2

1

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

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

于 2018-12-11T10:18:44.870 回答
0

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

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

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

这是关于“如何工作”主题的代码片段:

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 项目(示例代码):

识别实时捕捉中的对象

使用 Vision 和 Core ML 对图像进行分类

希望这可以帮助。

于 2018-12-07T10:48:30.117 回答