关于ZAKER 融媒体解决方案 合作 加入

ARKit 从入门到精通 ( 6 ) -- 二维图像识别

CocoaChina 11-19

关注微信公众号:AR 开发者社区(国内领先的 AR 开发者交流学习社区和 AR 内容平台)

在 iOS 11.3 或更高版本中,开发者可以通过在 ARKit 中启用图像识别功能。camera 扫描识别图片,然后显示一些 AR 内容(比如 3D 物体、视频、图片、音频,跳转 URL 等),这是最基本也是最原始的 AR 功能。本部分教程通过一个小案例了解 ARKit 的 2D Image Recognition 特性。

前提:需要在 9.3 或更高版本上运行 Xcode,并且在 iOS 11.3 或更高版本上测试。

在开始之前先下载基础工程(https://pan.baidu.com/s/1JnBBYytgCtoMj8y9jS8fPw 密码 :rj8w),我们在此基础上进行开发 ( 一些 UI 控件已经准备好 ) 。

Step 1: 启用图像识别功能

在 Xcode 打开刚刚下载的工程,效果如下图:

为了使用 ARKit 的 Image Recognition 功能,我们首先需要:

1. 准备好被识别的图像

2. 设置好 image 的物理 size

点击 Assets.xcassets,然后你会看到 AR Resources,操作如下图:

也可以将自己的图像拖放到这个组中。但是要确保给图片命名。

接下来需要设置图片的物理 size。ARKit 需要知道现实世界的图像大小来确定图像到相机的距离。输入不正确的物理图像大小将导致 ARImageAnchor 与相机的距离错误。

需要记住的是每次添加要识别的新图像时,都要提供物理图像大小。例如,"Book" 图像的物理尺寸如下 :

这是在 15.4 英寸 MacBook Pro 显示屏上打开图像文件时的物理图像大小属性。

Step 2: 图像属性

ARKit 的图像识别能力可能会随着图像的性质而变化。在 AR Resources 组中的图像会看到 "Book" 图像有两个质量评估。当图像对比度高时,图像检测效果最好。如下图所示:

"Snow Mountain" 和 "Trees In The Dark" 图片没有黄色警告。这意味着 ARKit 认为这些图像很容易识别。

Step 3: 编写代码

打开 ViewController.swift 文件,将以下方法插入 View Controller class:

func resetTrackingConfiguration ( ) { guard let referenceImages = ARReferenceImage.referenceImages ( inGroupNamed: "AR Resources", bundle: nil ) else { return } let configuration = ARWorldTrackingConfiguration ( ) configuration.detectionImages = referenceImages let options: ARSession.RunOptions = [ .resetTracking, .removeExistingAnchors ] sceneView.session.run ( configuration, options: options ) label.text = "Move camera around to detect images"}

接下来,在 viewWillAppear ( : ) 和 resetButtonDidTouch ( : ) 方法中调用 resetTrackingConfiguration ( ) 方法。

使用 ARImageAnchor 识别图像:现在我们要将一个透明的白色平面覆盖到检测到的图像上。白色平面反映了新检测到的参考图像的形状和大小,以及图像与设备摄像头的距离。

更新 renderer ( _:didAdd:for: ) 方法:

func renderer ( _ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor ) { guard let imageAnchor = anchor as? ARImageAnchor else { return } let referenceImage = imageAnchor.referenceImage let imageName = referenceImage.name ?? "no name" let plane = SCNPlane ( width: referenceImage.physicalSize.width, height: referenceImage.physicalSize.height ) let planeNode = SCNNode ( geometry: plane ) planeNode.opacity = 0.20 planeNode.eulerAngles.x = -.pi / 2 planeNode.runAction ( imageHighlightAction ) }

现在我们已经有了平面节点和检测到的图像的名称,我们将把平面节点添加到节点参数中,并设置标签的文本来显示识别的图像的名称。在 planeNode.runAction ( imageHighlightAction ) 之后插入以下代码 :

node.addChildNode ( planeNode ) DispatchQueue.main.async { self.label.text = "Image detected: " ( imageName ) ""}

接下来我们先测试一些我们目前实现的功能,效果如下图:

Step 4: 显示 3D 物体

首先注释掉下面的代码:

let planeNode = self.getPlaneNode ( withReferenceImage: imageAnchor.referenceImage ) planeNode.opacity = 0.0planeNode.eulerAngles.x = -.pi / 2planeNode.runAction ( self.fadeAction ) node.addChildNode ( planeNode )

用以下代码替换 TODO: Overlay 3D Object comment:

let overlayNode = self.getNode ( withImageName: imageName ) overlayNode.opacity = 0overlayNode.position.y = 0.2overlayNode.runAction ( self.fadeAndSpinAction ) node.addChildNode ( overlayNode )

接下来测试运行效果如下图:

完整项目链接:https://github.com/appcoda/ARKitImageRecognition参考资料:https://www.appcoda.com/arkit-image-recognition/

------AR Portal(AR 开发者社区)整理 公众号:AR 开发者社区(国内领先的 AR 开发者交流学习社区和 AR 内容平台)

以上内容由"CocoaChina"上传发布 查看原文
相关标签 arkitiosxcode

觉得文章不错,微信扫描分享好友

扫码分享