我希望能得到一些指引,如何将苹果的新Vision API与ARKit相结合,以实现对象识别。这不需要追踪移动对象,只需要稳定地在三维空间中识别它,使AR体验能够相应地做出反应。
我知道像 Vuforia 或 Wikitude 这样的服务已经提供了此类体验,但我想尝试仅使用本机的苹果API来实现它。
我希望能得到一些指引,如何将苹果的新Vision API与ARKit相结合,以实现对象识别。这不需要追踪移动对象,只需要稳定地在三维空间中识别它,使AR体验能够相应地做出反应。
我知道像 Vuforia 或 Wikitude 这样的服务已经提供了此类体验,但我想尝试仅使用本机的苹果API来实现它。
您不一定需要在项目中使用Vision框架,因为ARKit已经具备了此功能。您所需的只是激活一个detectionObjects实例属性,该属性可以直接在iOS 12上使用:
var detectionObjects: Set<ARReferenceObject> { get set }
让我们看看苹果文档对此的说明:
使用此属性选择已知的3D对象,以便ARKit在用户的环境中查找并呈现为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)
}
}
}
为了识别(多个)对象及其坐标(用于ARKit),您需要训练一个目标检测器(而不是分类器!)。
为了顺利地将其导出到CoreML模型中,最简单的构建/训练方法是CreateML和TuriCreate(稍微有点难度)。
要在AR体验中的特定位置添加3D对象,您需要找到其ARAnchor的“worldTransform”(您需要对其进行子类化)。
要找到“worldTransform”,您需要在2D中识别出对象的位置并在ARFrame上触发“hitTest()”。
好吧,这可能是一个停止的好地方,因为您的问题相当高级。