【发布时间】:2019-05-09 01:20:18
【问题描述】:
我想使用 Xcode 创建一个 ARKit 应用程序。我希望它在不按下按钮的情况下识别通用矩形,并且随后该矩形执行特定功能。
怎么做?
【问题讨论】:
标签: swift machine-learning augmented-reality arkit apple-vision
我想使用 Xcode 创建一个 ARKit 应用程序。我希望它在不按下按钮的情况下识别通用矩形,并且随后该矩形执行特定功能。
怎么做?
【问题讨论】:
标签: swift machine-learning augmented-reality arkit apple-vision
识别矩形不需要ARKit,只需要Vision。
如果要识别通用矩形,请使用VNDetectRectanglesRequest。
【讨论】:
正如您所写的,您需要在项目中使用 Vision 或 CoreML 框架以及 ARKit。您还必须创建一个预训练的机器学习模型(.mlmodel 文件)来对输入数据进行分类以识别您的通用矩形。
要创建学习模型,请使用以下资源之一:TensorFlow、Turi、Caffe 或 Keras。
使用带有分类标签的.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
希望这会有所帮助。
【讨论】: