【iOS-ARKit】扫描和检测3D对象-Scanning and Detecting 3D Objects

2023-10-27

记录真实世界对象的空间特征,然后使用结果在用户环境中查找这些对象并触发AR内容。

Overview

构建令人信服的AR体验的一种方法是识别用户环境的特征并使用它们触发虚拟内容的外观。 例如,当用户将他们的设备指向显示的雕塑或工件时,博物馆应用可以添加交互式3D可视化。

在iOS 12中,您可以通过在ARKit中启用对象检测来创建此类AR体验:您的应用程序提供参考对象,它可以对已知真实世界对象的三维空间要素进行编码,并且在AR session过程中,ARKit会告诉您的应用何时何地检测到相应的真实世界对象。

This sample code project provides multiple ways to make use of object detection:

此示例代码项目提供了多种方式来使用对象检测:

  • 运行应用程序扫描现实世界的对象并导出参考对象文件,您可以在自己的应用程序中使用该文件来检测该对象。
  • 使用此示例应用程序中演示的 ARObjectScanningConfigurationARReferenceObject 类将引用对象记录为您自己的资产生产管道的一部分。
  • 在世界跟踪AR会话中使用 detectionObjects 来识别参考对象并创建AR交互。

使用iOS应用程序扫描真实世界对象

扫描和定义ARKit可用于检测的参考对象的编程步骤非常简单。 (请参阅下面的“在AR会话中创建参考对象”。)但是,创建的参考对象的保真度以及您在自己的应用程序中检测参考对象的成功取决于扫描时与物体的物理交互。 在您的iOS设备上构建并运行此应用程序,以便通过一系列获取高质量扫描数据的步骤,从而生成可用于在自己的应用程序中进行检测的参考对象文件。

  1. 准备扫描。第一次运行时,应用程序会显示一个框,粗略估计任何真实世界物体在相机视图中居中显示的大小。将要扫描的对象放置在没有其他对象的表面上(如空的桌面)。然后移动设备,使对象显示在框中居中,然后点击下一步按钮。
  2. 定义边界框。在扫描之前,您需要告诉应用程序世界的哪个区域包含您要扫描的对象。拖动以3D方式移动框,或者按住框的一侧,然后拖动以调整其大小。 (或者,如果您不改变框,则可以在对象周围移动,并且应用程序将尝试自动在其周围放置一个框。)确保边界框仅包含要扫描的对象的功能(不是来自环境),然后点击扫描按钮。
  3. 扫描对象。四处移动以从不同角度查看对象。该应用程序会突出显示边界框的各个部分,以指示您何时扫描足以从相应方向识别对象。请务必扫描您希望您的应用的用户能够识别该对象的各个方面。扫描完成后,应用程序自动进入下一步,或者点击“停止”按钮手动继续。
  4. 调整原点。该应用程序显示x,y和z坐标轴线,显示对象的锚点或原点。拖动圆圈以将原点相对于对象移动。在这一步中,您还可以使用添加(+)按钮以USDZ格式加载3D模型。应用程序会在检测到真实世界对象时显示AR中出现的模型,并使用模型的大小来调整参照对象的比例。完成后点击测试按钮。
  5. 测试和导出。该应用程序现在创建了一个 ARReferenceObject 并重新配置了会话以检测它。在不同的环境和光照条件下,从不同角度观察真实世界的物体,以验证ARKit能够可靠地识别其位置和方向。点击导出按钮打开分享表以保存完成的 .arobject 文件。例如,您可以使用AirDrop轻松将其发送到您的开发Mac,或将其发送到“文件”应用程序以将其保存到iCloud Drive。

注意:参考对象仅包含ARKit识别现实世界对象所需的空间特征信息,并不是该对象的可显示3D重建。

检测AR体验中的参考对象

您可以使用Xcode资产目录在应用程序中捆绑引用对象以用于检测:

  1. 打开项目的资产目录,然后使用添加按钮(+)添加新的AR资源组。
  2. 将.arobject文件从Finder拖到新创建的资源组中。
  3. 或者,对于每个参考对象,请使用检查员为自己的使用提供一个描述性名称。

注意:将想要在同一个会话中查找的所有对象放入资源组中,并使用单独的资源组来保存一组对象以在单独的会话中使用。 例如,博物馆应用程序可能会使用单独的会话(并因此分开资源组)来识别博物馆不同侧翼的显示。

要在AR会话中启用对象检测,请将要检测的引用对象加载为 ARReferenceObject 实例,将这些对象提供给ARWorldTrackingConfigurationdetectionObjects 属性,然后使用该配置运行ARSession:

let configuration = ARWorldTrackingConfiguration()
configuration.detectionObjects = ARReferenceObject.referenceObjects(inGroupNamed: "gallery", bundle: nil)
sceneView.session.run(configuration)

当ARKit检测到您的一个参考对象时,会话会自动将相应的 ARObjectAnchor 添加到其锚点列表中。 要响应正在识别的对象,请实施一个适当的 ARSessionDelegateARSCNViewDelegateARSKViewDelegate 方法,以报告添加到会话的新锚点。 例如,在基于SceneKit的应用程序中,您可以实现 renderer:didAddNode:forAnchor: 向场景添加3D资产,自动匹配锚点的位置和方向

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    if let objectAnchor = anchor as? ARObjectAnchor {
        node.addChildNode(self.model)
    }
}

为了获得对象扫描和检测的最佳效果,请遵循以下提示:

  • 扫描和检测物体时,ARKit会寻找清晰,稳定的视觉细节区域。 详细的纹理物体比普通或反射物体更适合检测。
  • 对象扫描和检测针对小到足以放在桌面上的对象进行了优化。
  • 要检测的物体必须与扫描的参考物体具有相同的形状。 刚性物体比软体或弯曲,扭曲,折叠或以其他方式改变形状的物品更适合检测。
  • 当要检测的真实世界物体的照明条件与扫描原始物体的条件类似时,检测效果最佳。 一致的室内照明效果最好。
  • 高质量的对象扫描需要峰值设备性能。 使用最新的高性能iOS设备扫描的参考对象适用于在所有ARKit支持的设备上进行检测。

在AR会话中创建参考对象

此示例应用程序提供了一种创建参考对象的方法。 您还可以在自己的应用中扫描引用对象,例如,构建资产管理工具以定义进入其他应用的AR内容。

参考对象对ARKit用于跟踪设备位置和方向的内部空间映射数据进行编码。 要启用对象扫描所需的高质量数据收集,请使用ARObjectScanningConfiguration 运行会话:

let configuration = ARObjectScanningConfiguration()
configuration.planeDetection = .horizontal
sceneView.session.run(configuration, options: .resetTracking)

在对象扫描AR会话期间,从各个角度扫描对象以确保收集足够的空间数据以识别它。 (如果您正在构建自己的对象扫描工具,请帮助用户完成本示例应用程序提供的相同步骤。)

扫描完成后,调用createReferenceObjectWithTransform:center:extent:completionHandler: 从会话映射的用户环境区域生成一个ARReferenceObject:

// Extract the reference object based on the position & orientation of the bounding box.
sceneView.session.createReferenceObject(
    transform: boundingBox.simdWorldTransform,
    center: float3(), extent: boundingBox.extent,
    completionHandler: { object, error in
        if let referenceObject = object {
            // Adjust the object's origin with the user-provided transform.
            self.scannedReferenceObject =
                referenceObject.applyingTransform(origin.simdTransform)
            self.scannedReferenceObject!.name = self.scannedObject.scanName
            creationFinished(self.scannedReferenceObject)
        } else {
            print("Error: Failed to create reference object. \(error!.localizedDescription)")
            creationFinished(nil)
        }
})

当检测到参考对象时,ARKit根据参考对象定义的原点报告其位置。 如果要放置看起来与真实世界对象位于同一表面上的虚拟内容,请确保将参照对象的原点放置在现实世界对象所在的位置。 要在捕获 ARReferenceObject 之后调整原点,请使用referenceObjectByApplyingTransform: 方法。

获取ARReferenceObject之后,可以立即使用它来检测(请参阅上面的“在AR Experience中检测参考对象”),或将其另存为 .arobject 文件,以便在稍后的会话或其他基于ARKit的应用程序中使用。 要将对象保存到文件,请使用exportObjectToURL:previewImage:error: 方法。 在该方法中,您可以提供Xcode的真实世界对象的图片以用作预览图像。

See Also

物体检测

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【iOS-ARKit】扫描和检测3D对象-Scanning and Detecting 3D Objects 的相关文章

  • NSPredicate 查询不包含特定字符串

    对这个问题进行了高低查找 但找不到我的答案 我正在查询核心数据以查找不等于指定字符串的所有记录 例如 所有不等于当前会话ID的记录 我已经尝试过这些但无济于事 NSPredicate predicate NSPredicate predic
  • iOS7及以上版本中如何在接收器和扬声器之间切换音频输出?

    我有一个音频播放器 可以选择在接近传感器通知 1 时将音频输出从扬声器切换到接收器 耳机 无论是否连接耳机 以下是我执行此操作的代码 void switchAudioOutput NSString output AVAudioSession
  • 如何在 Monotouch 中对 UIImageView 进行运动模糊效果?

    在 MonoTouch 中进行实时运动模糊的方法是什么 当滚动惯性图片库时 我需要在 UIImageView 上应用运动模糊效果 以强度和方向作为参数 就像在 Photoshop 中一样 我在 CocoaTouch 或 CoreAnimat
  • 使用prefersLargeTitles 和 UITableView 平滑滚动

    我在使用时遇到了滚动问题prefersLargeTitles并添加了UITableView 如果我设置prefersLargeTitles在导航控制器中 其根是UITableViewController一切都很好 导航大标题的滚动方式与我们
  • Xcode 不会在故事板中显示我的文本字段占位符文本

    当我在属性检查器中分配文本字段的占位符值时 它不会显示在故事板中 但是 当我运行应用程序的模拟器时 它就在那里 我缺少什么设置吗 我只想能够在编辑器中看到占位符文本 下面是 xcode 和模拟器之一的屏幕截图 我遇到了同样的问题 幸运的是我
  • Swift 3 '[UIApplicationLaunchOptionsKey:任意]?'无法转换为 '[String : NSString]'

    我有一个 TVOS 应用程序已从 Swift 2 转换为 Swift 3 但出现以下错误 我不确定如何让它安静下来 UIApplicationLaunchOptionsKey 任意 无法转换为 String NSString 它出现在这段代
  • 使用 JavaScript 从 URL 变量读取来加载不同的 CSS 样式表

    我试图在我的 WordPress 博客上使用两个不同的样式表 以便在通过 Web 访问页面时使用一个样式表 而在通过我们的 iOS 应用程序访问博客内容时使用另一个样式表 现在 我们将 app true 附加到来自 iOS 应用程序的 UR
  • 应用程序图标未刷新

    我更改了新版本应用程序中的图标图像 并且我在设备中安装了旧版本应用程序 然后我安装了新版本 它在 iOS 5 中运行良好 但在 iOS 6 中 图标没有刷新 它仍然显示旧版本图标 徽标 如果没有安装旧版本应用程序 该设备在 iOS 5 和
  • 使用 Push Transition 效果更改 RootViewcontroller

    在我的iOS应用程序中 我需要更改应用程序之间窗口的rootviewController 因此 当我动态更改我的rootviewcontroller时 它会在更改之前轻拂视图 但我想要的是在更改rootviewcontroller时提供平滑
  • iOS 解决方案仅当图像尚未使用 SDWebImage 缓存在内存中时才加载带有动画的图像

    我已经为这个问题苦苦挣扎了几天 以前我使用 AFNetworking 类别来加载和缓存图像 但它的回调中没有提供缓存类型 所以我过去常常在每个控制器中跟踪哪些图像已经加载 我浏览了 SDWebImage 它提供了我正在寻找的东西 SDIma
  • 在 iOS 中录制音频并永久保存

    我制作了 2 个 iPhone 应用程序 可以录制音频并将其保存到文件中并再次播放 其中之一使用 AVAudiorecorder 和 AVAudioplayer 第二个是苹果的在这里说话 http developer apple com l
  • WebGL iOS 渲染为浮点纹理

    我正在尝试在 iOS Safari 上的 WebGL 中渲染浮点纹理 而不是在本机应用程序中 我已经设法让 iOS 读取手动 例如从 JavaScript 创建的浮点纹理 但是当我创建浮点类型的帧缓冲区并使用 GPU 渲染到其中时 它不起作
  • 在 Interface Builder 中的资产目录上使用图像

    是否可以直接在界面生成器上使用添加到资产目录中的图像 这是怎么做到的 在 UIImageView 属性上 我看不到任何引用资产目录上任何图像的选项 Import the images into the xcassets folder 单击右
  • 如何从 NSString 中删除十六进制字符

    我面临一个与字符串中的某些十六进制值相关的问题 我需要从字符串中删除十六进制字符 The problem is when i print object it prints as BLANK line And in debug mode it
  • iOS 中的等宽字体是什么?

    我想要在我的 iOS 应用程序中为 UILabel 使用等宽字体 不幸的是 我找不到一个 甚至 美国打字机 实际上也不是等宽的 XCode 中可用的等宽字体是什么 iOS 等宽字体 Courier Courier Bold Courier
  • 更改 UITextField 辅助功能描述

    有没有办法将 UITextField 的辅助功能标签设置为 文本字段 之外的其他内容 因此 我不想将其称为 文本字段 而是将其命名为 代码验证字段 我的建议是不要试图在内置语音输出上智取系统 对于盲人用户来说 文本字段正在编辑 相当于 该项
  • 在WKWebview中设置useragent

    如何在 WKWebView 中设置自定义用户代理字符串 我正在尝试嵌入我的应用程序的版本 以便我的服务器端可以看到可用的功能 我找到了以下方法 let userAgent MyApp 1 33 7 request setValue user
  • 如果 NSExtensionActivationRule 设置为仅音频,则共享扩展不会出现在有功能的应用程序中

    我正在尝试创建一个共享扩展 用户可以从任何有能力的应用程序上传她的录音 该文档甚至有一个简单的示例 请参阅声明共享或操作扩展支持的数据类型 https developer apple com library content document
  • 如何在 Xcode 4 中通过一个操作归档多个目标

    我有一个包含多个目标的项目 这些目标都适用于不同的 iOS 应用程序 例如 一个用于精简版的目标 另一个用于专业版的目标 我想立即构建并归档我的所有应用程序 目前 我对每个目标都有一个方案 我用它来独立归档每个应用程序 但现在我必须开始归档
  • 具有多种自定义单元格类型的 RxSwift 表视图

    我想知道是否有任何代码示例RxSwift当我可以在一个表视图中使用多个自定义单元格时 例如 我有两个部分 第一部分有 10 个单元格 类型为CellWithImage标识符和第二部分有 10 个带有类型的单元格CellWithVideo标识

随机推荐

  • 终于等到你!Guitar Pro 8.1版本简谱功能首发

    Guitar Pro是一款非常流行的音乐制谱软件它不仅适用于吉他谱还可以用于其他乐器的制谱 历经5年多时间研发Guitar Pro 在2022年正式发布了全新的8系列版本时隔不到1年Guitar Pro又给广大中国用户带来期盼已久的简谱功能
  • 使用 Easy Excel 插件实现Excel文件高效导入导出接口

    目录 简介 导入功能实现 1 添加依赖 2 创建导入的实体类 DTO 3 服务接口中创建一个用于导入的方法 4 编写监听器处理数据 5 在服务类中实现导出方法 6 控制器层调用 7 调用接口 导出功能实现 1 创建用于导出的实体类 VO 2
  • nuxt在pages下建文件,本地能访问,线上404不能访问

    以下网址都是虚拟网址 ip 在官网开发过程中 要重构页面 将 官网介绍 页面 从PHP的模板tpl 改为前后端分离的形式 nuxt在pages下新建Vue文件 就能直接生成路径 我在pages 下新建了view doctor vue 文件
  • 三环控制永磁同步电机

    2 双闭环模型 3 三闭环模型 输入可以给定一个正弦波或者阶跃信号作为位置给定 下载连接 https download csdn net download weixin 42226781 87420823
  • 【翻译】燃烧积压,调整流程

    排列和流动 听起来像Vinyasa瑜伽课 它们真正的内容是管理的趋势 但即使是管理这个词似乎也不对 因为当你在管理对齐和流动时 你是有意放弃你的大部分权力 你走的是仆人式领导的道路 不断寻找方法让你的队友生活更轻松 最大限度地提高流量和一致
  • opencv安装教程(通用过程说明)

    文章目录 环境说明 安装方式说明 预编译版本 从OpenCV团队获取 从第三方开发者获取 从源码编译 步骤0 安装准备 步骤1 获取源代码 步骤2 配置构建环境 步骤3 构建 步骤4 安装 可选 步骤5 构建插件 可选 环境说明 语言 c
  • 多维时序

    多维时序 MATLAB实现CNN BiLSTM多变量时序预测 目录 多维时序 MATLAB实现CNN BiLSTM多变量时序预测 基本介绍 模型特点 程序设计 关联分析 学习总结 参考文献 基本介绍 本次运行测试环境MATLAB2020b
  • ORA-01578 ORACLE data block corrupted

    我们用户连接到数据库执行存储过程时报坏块ORA 01578ORACLE data block corrupted错误 从错误提示信息来看 确实该数据库遭遇到坏块 通过查询数据字典 如下图 SQL gt select from V DATAB
  • Python3多线程_thread模块的应用

    文章目录 前言 一 Python3多线程 二 thread模块 1 单线程 2 多线程 总结 前言 参考文章 Python多线程 thread和Threading Python3 多线程 Python3通过两个标准库 thread 和 th
  • java利用递归删除文件夹(以及里面的文件和子文件夹)

    1 在main方法中使用Scanner工具类从控制台获取String类型的地址 2 将获取的地址转变为File类型 3 创建一个删除方法 删除文件夹首先要获取该文件夹下的所有文件和文件夹数组 然后遍历数组 在遍历过程中判断是否为文件 如果是
  • Anaconda使用记录(一):管理conda

    写在前面 由于本人使用的是windows用户 因此关于本专栏的使用记录主要是对基于win的一些命令进行笔记 Windows用户打开 Anaconda Prompt 右击以管理员身份运行 并在此界面进行操作 管理conda 1 检验conda
  • 超级详细 的 Vmware下载 与 安装过程

    如何配置多个操作系统 超级详细 的 Vmware下载 与 安装过程 一 引言 在项目开发中经常需要 进行项目部署 有时不想买多台服务器 增加不必要的预算 那有什么方案解决这类型的问题呢 这个是一个好问题 那就行了我们就来介绍其中一种方法 V
  • java连不上sql表_Java与数据库的多表连接不能进行

    package cn com import java sql public class Order public void TradeResult String s Connection con PreparedStatement stmt
  • k8s部署mysql

    注意事项 其实mysql这种应用我还是不建议挂到k8s中 因为我是学习使用 使用的vmvare开了3台虚拟linux 因为k8s对配置要求较高 如果太低的话会出现pod部署失败等配置问题 建议还是只在k8s部署springcloud项目的j
  • 自研规则引擎

    核心业务语义 规则 规则引擎里面的最基本的原子定义 支持一系列特征值的基础运算 包括与或运算 隶属于场景 可以被该场景下的所有规则集所引用 决策流 将一系列规则以流的形式组合而成 规则集中的其中一个执行策略 规则集 业务调用的基础单位 业务
  • go之web框架 iris

    前言 最近开始学习GO的WEB框架 IRIS号称是Go最快的后端Web框架 目前发展最快的Go Web框架 提供完整的MVC功能并且面向未来 所以先从它开始 github地址 https github com kataras iris 文档
  • Linux 如何查看文件夹的大小

    du 命令 查看当前目录和子目录文件夹 文件大小情况 du disk usage 磁盘使用率 输出每个文件或者目录总大小 查看当前目录的总大小 du sh 查看当前目录所有子目录的大小 du sh 查看当前目录和所有子目录大小 最后一行会显
  • linux C网络编程基本流程

    百度的二面就被问到这个问题了 去年记得还专门研究过这个问题的 哎 忘了 肯定挂的原因就是这个 哎 网上找了找资料 总结如下 Linux C编程 网络编程 网络编程 一定离不开套接口 那什么是套接口呢 在Linux下 所有的I O操作都是通过
  • 什么是Base64?

    Base64概念 什么是Base64 按照RFC2045的定义 Base64被定义为 Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式 The Base64 Content Transfer Encod
  • 【iOS-ARKit】扫描和检测3D对象-Scanning and Detecting 3D Objects

    记录真实世界对象的空间特征 然后使用结果在用户环境中查找这些对象并触发AR内容 Overview 构建令人信服的AR体验的一种方法是识别用户环境的特征并使用它们触发虚拟内容的外观 例如 当用户将他们的设备指向显示的雕塑或工件时 博物馆应用可