ARKit 3D 物体检测跟踪

news2024/9/30 1:34:10
  • 3D 物体检测跟踪

     3D物体检测跟踪技术,是指通过计算机图像处理和人工智能技术对摄像机拍摄到的3D物体识别定位并对其姿态进行跟踪的技术。3D物体跟踪技术的基础也是图像识别,但比前述2D 图像检测、识别、跟踪要复杂得多,原因在于现实世界中的物体是三维的,从不同角度看到的物体形状、纹理都不一样,在进行图像特征值对比时需要的数据和计算比2D 图像大得多。

      在 ARKit 中,3D物体检测、识别、跟踪通过预先记录3D物体的空间特征信息,在真实环境中寻找对应的3D真实物体对象,并对其姿态进行跟踪。与2D图像检测跟踪类似,要在 ARKit 中实现 3D 物体检测跟踪也需要一个参考物体库,这个参考物体库中的每个对象都是一个 3D物体的空间特征信息。获取参考物体空间特征信息可以通过扫描真实3D 物体采集其特征信息,生成.arobject 参考物体空间特征信息文件,.arobject 文件只包括参考物体的空间特征信息,而不是参考物体的数字模型,也不能利用该文件复原参考物体三维结构。参考物体空间特征信息对快速、准确检测识别3D物体起着关键作用。

  • 获取参考物体空间特征信息

      苹果公司提供了一个获取物体空间特征信息的扫描工具,该扫描工具是一个 Xcode 源码工程,需要自已编译,源码名为 Apple's Object Scanner app,读者可自行下载并使用Xcode 编译,下载地址为:https://developer.apple.com/documentation/arkit/scanning_and_detecting_3d_objects。该工具的主要功能是扫描真实世界中的物体并导出.arobject 文件,可作为3D物体检测识别的参考物体。

       使用扫描工具进行扫描的过程其实是对物体表面3D特征值信息与空间位置信息的采集过程,这是一个计算密集型的工作,为确保扫描过程流畅、高效,建议使用高性能的iOS设备,当然扫描工作可以在任何支持 ARKit 的设备上进行,但高性能iOS设备可以更好地完成这一任务。

4-6 扫描采集3D 参考物体空间特征信息

       参考物体空间特征信息对后续3D物体检测识别速度、准确性有直接影响,因此,正确地扫描并生成.arobject 文件非常重要,遵循下述步骤操作可以提高扫描成功率。下面,引导大家一步一步完成这个扫描过程。

      (1)将需要扫描的物体放置在一个背景干净不反光的平整面上(如桌面、地面),运行扫描工具,将被扫描物体放置在摄像头正中间位置,在扫描工具检测到物体时会出现一个空心长方体(包围盒),移动手机/平板,将长方体大致放置在物体的正中间位置,让包围盒框住被扫描物体,如图4-6(a)所示,屏幕上也会提示包围盒的相关信息。但这时包围盒可能与实际物体尺寸不匹配,单击 Next 按钮可调整包围盒大小。

     (2)在正式扫描之前需要调整包围盒的大小,扫描工具程序只采集包围盒内的物体空间特征信息,因此,包围盒大小对采集信息的完整性非常关键。围绕着被扫描物体移动手机/平板,扫描工具会尝试自动调整包围盒的大小,如果自动调整结果不是很理想,也可以手动进行调整,方法是长按长方体的一个面,当这个面出现延长线时拖动该面就可以移动该面,长方体6个面都可以采用类似方法进行调整。包围盒不要过大或过小,过小采集不到完整的物体空间特征信息,过大可能会采集到周围环境中的其他物体信息,不利于快速检测识别3D 物体。调鳖好后单击 Scan 按钮开始对物体空间特征信息进行采集,如图4-6(b)所示。

      (3)在开始扫描物体后,扫描工具程序会给出视觉化的信息采集提示,通过将成功采集过的区域用淡黄色色块标识出来,引导用户完成全部信息采集工作,如图4-6(c)所示。

      (4)缓慢移动手机(保持被扫描物体不动),从不同角度扫描物体,确保包围盒的所有面都成功扫描(通常底面不需要扫描,只需要扫描前、后、左、右、上5个面),如图4-6(d)、扫描工具程序会在所有面的信息采集完后自动进入下一步,或者在采集完所有信息后可以手动单击Finish 按钮进行到下一步,如果在未完整采集到所需信息时单击 Finish则会提示采集信息不足。

4-8 扫描采集3D 参考物体空间特征信息

     (5)在采集完物体空间特征信息后,扫描工具程序会在物体上显示一个XY2 的三维彩色坐标轴,如图4-8(a)所示。这个坐标轴的原点表示这个物体的原点(这个原点代表的是模型局部坐标系原点),可以通过拖动3个坐标轴边上的小圆球调整蜜标轴的原点位置。在图4-8(b)中可以看到 load Model按钮(pro机型才有),单击该按钮可以加载一个 USDZ 格式模型文件,加载完后会在三维坐标轴原点显示该模型,就像是在真实环境中检测到3D物体并加载数字模型一样。通过加载模型可以直观看到数字模型与真实三维物体之间的位置关系(贴合程度),如果位置不合适可以重复步骤(5)调整三维坐标轴原点位置,直到加载后的数字模型位置达到预期要求(通过Load Model 按钮可以预先查看 AR 应用运行后.在检测到 3D 物体时加载模型的效果,提供即时的反馈)。

    (6)在调整好坐标轴后可以对采集的空间特征信息进行测试验证,击Test按钮进行测试,如图4-8(b)所示。将被扫描物体放置到不同环境、不同的光照条件下,使用手机摄像头从不同角度查看该物体,在否正确检测出物体的位置及姿态。如果验证时出现无法检测识别的问题说明信息采集不完整或者有问题,需要重新采集一次如果验证无问题则可导出使用。导出可以直接单击 Share 按钮导出该单个物体采集的空间特征信息.arobject 格件,如图4-8(c)所示,也可以单击左上角的 Merge Scans 合并多个物体空间特征信息文件,如图4-8(d),可以合并之前采集导出的.arobject 文件,也可以开始新的物体扫描然后合并两次扫描结果。

   (7)在单击 Share 按钮后该工具程序会将采集的物体空间特征信息导出为.arobject 文件,在打开的导活框中,如图4-8(c)所示,可以选择不同的导出方式,可以保存到云盘,也可以通过邮件、微信等媒介发也人,还可以通过 AirDrop(隔空投送)的方式直接投送到 Mac 计算机或其他iOS 设备上。

  • 3D物体识别跟踪基本操作

       在 ARKit 中,3D物体检测、识别、跟踪系统依据参考物体库中的参考物体空间特征信息尝试在周围环境中检测匹配的3D物体并跟踪,与2D 图像识别跟踪类似,3D物体识别跟踪也有一些特定的术语,如表4-1所示。

表4-1 3D物体跟踪术语表

术语

描述说明

参考物体

(Reference Object)

识别3D物体的过程也是一个特征值对比的过程,ARKit 将从摄像头中获取的图像信息与参考物体库的参考物体空间特征值信息进行对比,存储在参考物体库中的用于对比的物体空间特征信息就叫作参考物体(物体空间特征信息并不是数字模型,也不能据此恢复出3D物体)。

一旦对比成功,真实环境中的3D物体将与参考物体库的参考物体建立对应关系,每一个真实3D 物体的姿态信息也一并被检测

参考物体库

(Reference Object Library)

参考物体库用来存储一系列参考物体空间特征信息用于对比,每一个3D 物体跟踪程序都必须有一个参考物体库,但需要注意的是,参考物体库中存储的实际是参考物体的空间特征值信息而不是原始3D物体网格信息,这有助于提高对比速度与鲁棒性。参考物体库越大,3D物体检测对比就会越慢,相比 2D 图像检测识别,3D物体检测识别需要比对的数据量更大、计算也更密集,因此,在同等条件下,参考物体库中可容纳的参考物体数量比 2D 图像库中的参考图像数量少得多

AR 物体锚点

(ARObject Anchor)

记录真实世界中被检测识别的3D物体位置与姿态的锚点,该锚点由 ARSession 在检测识别到 3D物体后自动添加到每一个被检测到的对象上。通过该锚点,可以将虚拟物体对象谊染到指定的空间位置上

3D物体检测效果,当检测到这个盒子时添加一个虚拟物体

       

     与2D图像检测跟踪一样,在 ARKit 中,3D 物体检测跟踪的使用也分成两步,第一步是建立一个参考物体库(参考物体库也可以在运行时动态建立),第二步是配置好 3D物体跟踪 Configuration 配置,并使用该配置运行 ARSession。具体代码如下:

//
//  ObjectChceking.swift
//  ARKitDeamo
//
//  Created by zhaoquan du on 2024/1/22.
//

import SwiftUI
import ARKit
import RealityKit

struct ObjectChceking: View {
    
    static var arView: ARView?
    
     var body: some View {
         ObjectChcekingContainer()
           .overlay(
               VStack{
                   Spacer()
                   Button(action: {ObjectChceking.arView?.changeObjectsLibrary()}) {
                       Text("切换物体库")
                           .frame(width:150,height:50)
                           .font(.system(size: 17))
                           .foregroundColor(.black)
                           .background(Color.white)
                       
                           .opacity(0.6)
                   }
                   .cornerRadius(10)
                   Spacer().frame(height: 40)
               }
       )
           .edgesIgnoringSafeArea(.all)
           .navigationTitle("3D物体检测")
    }
    
}
struct ObjectChcekingContainer: UIViewRepresentable {
    
    
        
    var dele = ARViewObjectCheckingDelegate()
    func makeUIView(context: Context) -> some ARView {
        let arView = ARView(frame: .zero)
        
        guard let images = ARReferenceObject.referenceObjects(inGroupNamed: "ReferenceObjectsLibrary", bundle: Bundle.main) else {
            fatalError("无法加载物体")
        }
        let config = ARWorldTrackingConfiguration()
        config.detectionObjects = images
        
        arView.session.run(config,options: [])
        arView.session.delegate = dele
        ObjectChceking.arView = arView
        return arView
    }
    func updateUIView(_ uiView: UIViewType, context: Context) {
        
    }
    
    
}
extension ARView {
    func changeObjectsLibrary(){
        
        guard let config = session.configuration as? ARWorldTrackingConfiguration else {
            return
        }
        guard let detectedObjectsLib = ARReferenceObject.referenceObjects(inGroupNamed: "ReferenceObjectLibrary1", bundle: Bundle.main) else {
            fatalError("无法加载参考物体")
        }
        config.maximumNumberOfTrackedImages = 1
        config.detectionObjects = detectedObjectsLib
        session.run(config, options:[.resetTracking,.removeExistingAnchors])
        print("参考物体库切换成功")
    }
    
}
class ARViewObjectCheckingDelegate: NSObject, ARSessionDelegate {
    
    public func session(_ session: ARSession, didAdd anchors: [ARAnchor]){
       guard let pAnchor = anchors[0] as? ARObjectAnchor else {
          return
        }
        

        let objectName =  pAnchor.referenceObject.name == "jinhua" ? "toy_drummer" : "toy_robot_vintage"
        DispatchQueue.main.async {
            do{
                let myModeEntity = try Entity.load(named: objectName)
                let objectEntity = AnchorEntity(anchor: pAnchor)
                objectEntity.addChild(myModeEntity)
                myModeEntity.playAnimation(myModeEntity.availableAnimations[0].repeat())
               
                ObjectChceking.arView?.scene.addAnchor(objectEntity)
            } catch {
                print("加载失败")
            }
                        
        }
        
    }
   

}

      在上述代码中,首先从 bundle 中加载参考物体库,并将该参考物体库设置到 AR 配置类的trackedObjectsLib 属性,然后通过 ARSession.run()方法即可运行3D 物体检测跟踪。ARKit 支持同时跟踪多个3D物体,同时跟踪的物体越多,性能消耗也会越大,在一般情况下,建议同时跟踪的3D物体不多于3个。运行3D 物体检测识别应用后,当 ARKit 检测到与参考物体库中参考物体一致的 3D物体时,ARSession 会自动添加一个 ARObjectAnchor 到 ARAnchor 集合中,开发人员可以通过 ARSessionDelegate协议中的 session(_ session:ARSession, didAdd anchors: [ARAnchor])代理方法进行相应处理。

     参考物体库除了可以在 Xcode 编辑状态下静态创建,也可以在AR应用运行时动态创建,典型的参考代码如下:

        let arView = ARView(frame: .zero)
        
        let config1 = ARObjectScanningConfiguration()
        config1.planeDetection  = .horizontal
        arView.session.run(config1, options: [.resetTracking])

     相关代码地址:https://github.com/duzhaoquan/ARkitDemo.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1413790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络协议测试】畸形数据包——圣诞树攻击(DOS攻击)

简介 TCP所有标志位被设置为1的数据包被称为圣诞树数据包(XMas Tree packet),之所以叫这个名是因为这些标志位就像圣诞树上灯一样全部被点亮。 标志位介绍 TCP报文格式: 控制标志(Control Bits)共6个bi…

单调栈第二天(还没写完)

503.下一个更大元素II 力扣题目链接(opens new window) 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更…

可以运行在浏览器的Windows 2000

Windows 2000 可以在浏览器里跑了,缺点就是速度慢。 点击这里在浏览器中运行 Windows 2000​​​​​​- --------------------------------------------------------------------------------------------------------------------------------- --------------…

2024年【浙江省安全员-C证】考试题库及浙江省安全员-C证模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 2024年【浙江省安全员-C证】考试题库及浙江省安全员-C证模拟考试,包含浙江省安全员-C证考试题库答案和解析及浙江省安全员-C证模拟考试练习。安全生产模拟考试一点通结合国家浙江省安全员-C证考试最新大纲…

vue3+naiveUI二次封装的v-model 联动输入框

根据官网说明使用 源码 <template><div class"clw-input pt-3"><n-inputref"input":value"modelValue":type"type":title"title"clearable:disabled"disabled":size"size"placeholder&…

【异常收集】IDEA启动项目遇到的异常汇总,包括插件异常,版本依赖异常,启动异常等以及对应的解决办法

该文章旨在记录开发中遇到的一些异常&#xff0c;以供遇到似错误进行参考修改 一、项目在多个环境下切换&#xff0c;有一次启动后编译失败&#xff0c;报异常 背景&#xff1a;项目在不同环境下有对应的分支&#xff0c;切换分支后运行项目&#xff0c;报错如下 错误:Kotlin:…

前端工程化之:webpack1-6(编译过程)

一、webpack编译过程 webpack 的作用是将源代码编译&#xff08;构建、打包&#xff09;成最终代码。 整个过程大致分为三个步骤&#xff1a; 初始化编译输出 1.初始化 初始化时我们运行的命令 webpack 为核心包&#xff0c; webpack-cli 提供了 webpack 命令&#xff0c;通过…

YouTrack Pending 项目删除

YouTrack 项目在删除的时候可能没有办法马上就删除掉。 我们还会看到类似下面的这种情况。 根据官方的解释说明是&#xff0c;如果项目有很多内容或者有很多的信息&#xff0c;那么在删除的时候会消耗很多的时间&#xff0c;所以 YouTrack 给出了一个 Pending 删除的状态。 哪…

这些SQL你练习过吗?(网友提供的SQL)

行转列SQL练习 题目 把图1转换成图2结果展示 图1 CREATE TABLE TEST_TB_GRADE (ID int(10) NOT NULL AUTO_INCREMENT,USER_NAME varchar(20) DEFAULT NULL,COURSE varchar(20) DEFAULT NULL,SCORE float DEFAULT 0,PRIMARY KEY (ID) )insert into TEST_TB_GRADE(USER_NAME, CO…

[HTML]Web前端开发技术18(HTML5、CSS3、JavaScript )HTML5 基础与CSS3 应用——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

Python网络爬虫实战——实验5:Python爬虫之selenium动态数据采集实战

【实验内容】 本实验主要介绍和使用selenium库在js动态加载网页中数据采集的作用。 【实验目的】 1、理解动态加载网页的概念 2、学习Selenium库基本使用 3、掌握动态加载数据采集流程 【实验步骤】 步骤1理解动态加载网页 步骤2学习使用Selenium库 步骤3 采集河北政府采购…

统计学-R语言-8.3

文章目录 前言例题例题一例题二例题三例题四例题五例题六例题七 总结 前言 本篇介绍的是有关方差知识的题目介绍。 例题 例题一 &#xff08;数据&#xff1a;exercise7_3.RData&#xff09;为研究上市公司对其股价波动的关注程度&#xff0c;一家研究机构对在主板、中小板和…

PHP伪协议使用姿势

php支持的伪协议 1 file:// — 访问本地文件系统 2 http:// — 访问 HTTP(s) 网址 3 ftp:// — 访问 FTP(s) URLs 4 php:// — 访问各个输入/输出流&#xff08;I/O streams&#xff09; 5 zlib:// — 压缩流 6 data:// — 数据&#xff08;RFC 2397&#xff09; 7 glob:// —…

YARN介绍

1 概念 YARN 是一个资源管理、任务调度的框架&#xff0c;主要包含三大模块&#xff1a;ResourceManager&#xff08;RM&#xff09;、 NodeManager&#xff08;NM&#xff09;、ApplicationMaster&#xff08;AM&#xff09;。其中&#xff0c;ResourceManager 负责所有资 源…

数据结构——链式二叉树(2)

目录 &#x1f341;一、二叉树的销毁 &#x1f341;二、在二叉树中查找某个数&#xff0c;并返回该结点 &#x1f341;三、LeetCode——检查两棵二叉树是否相等 &#x1f315;&#xff08;一&#xff09;、题目链接&#xff1a;100. 相同的树 - 力扣&#xff08;LeetCode&a…

MySQL十部曲之四:MySQL中的数据类型

文章目录 前言概述数字类型数字类型语法数字类型字面量十六进制字面量位字面量布尔字面量 数字类型的属性超出范围和溢出处理 时间和日期类型时间和日期类型语法DATE、DATETIME和TIMESTAMP的异同TIMESTAMP和DATETIME的自动初始化和更新时间和日期字面量 字符串类型字符串类型语…

Android 基础技术——Handler

笔者希望做一个系列&#xff0c;整理 Android 基础技术&#xff0c;本章是关于 Handler 为什么一个线程对应一个Looper&#xff1f; 核心&#xff1a;通过ThreadLocal保证 Looper.prepare的时候&#xff0c;ThreadLocal.get如果不空报异常&#xff1b;否则调用ThreadLocal.set,…

376. 摆动序列 - 力扣(LeetCode)

题目描述 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为摆动序列。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。少于两个元素的序列也是摆动序列。 例如&#xff0c; [1,7,4,9,2,5] 是一个摆动序列&#xff0c;因为差值 (6,…

项目中从需求分析到研发上线

一、背景 应用系统从设想到需求到研发到上线会经历一些列工程化过程。比如经典的瀑布模型工作流&#xff0c;其实就是一个经过很多经验总结下来的工程方法。本节阐述项目中从需求到研发上线的过程。但是也有些根据不同的行业&#xff0c;不同的公司&#xff0c;不同管理者的风…

Cesium加载地图-高德影像

废话不多说&#xff0c;直接上代码 整体代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><…