我想使用 Xcode 创建一个 ARKit 应用程序。我希望它在不按下按钮的情况下识别通用矩形,并且随后该矩形执行特定功能。
怎么做?
我想使用 Xcode 创建一个 ARKit 应用程序。我希望它在不按下按钮的情况下识别通用矩形,并且随后该矩形执行特定功能。
怎么做?
您不需要ARKit
识别矩形,只需Vision
.
如果要识别通用矩形,请使用VNDetectRectanglesRequest
.
正如您所写的那样,您需要在项目中使用Vision
或CoreML
框架以及 ARKit。此外,您必须创建一个预训练的机器学习模型(.mlmodel
文件)来对输入数据进行分类以识别您的通用矩形。
要创建学习模型,请使用以下资源之一:TensorFlow、Turi、Caffe或Keras。
使用.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 项目(示例代码):
希望这可以帮助。