【iOS ARKit】人形遮挡

2024-02-07 16:36
文章标签 ios 遮挡 人形 arkit

本文主要是介绍【iOS ARKit】人形遮挡,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

人形遮挡简介

       在 AR系统中,计算机通过对设备摄像头采集的图像进行视觉处理和组织,建立起实景空间,然后将生成的虚拟对象依据几何一致性原理嵌入到实景空间中,形成虚实融合的增强现实环境,再输出到显示系统中呈现给使用者。

      正确实现虚拟物体与真实环境的遮挡关系,需要基于对真实环境3D结构的了解,感知真实世界的3D结构、重建真实世界的数字3D模型,然后基于深度信息实现正确的遮挡。但真实世界是一个非常复杂的3D 环境,精确快速地感知周围环境,建立一个足够好的真实世界3D模型非常困难,特别是在不使用其他传感器的情况下(如结构光、TOF、双目、激光等)。

      随着移动设备处理性能的提高、新型传感设备的发明、新型处理方式的出现,虚实遮挡融合的问题也在逐步得到改善。在 ARKit3 中,苹果公司通过神经网络引入了人形遮挡功能,通过对真实场景中人体的精确检测识别,实现虚拟物体与人体的正确遮挡,虚拟物体可以被人体所遮挡,提升了 AR使用体验。

人形遮挡原理

       遮挡问题在计算机图形学中其实就是深度排序问题。在AR初始化成功后,场景中所有的虚拟物体都有一个相对于 AR 世界坐标系的坐标,包括虚拟摄像机与虚拟物体,因此,图形渲染管线通过深度缓冲区(Depth Buffer)可以正确地渲染虚拟物体之间的遮挡关系。但是,从摄像机输人的真实世界图像数据并不包含深度信息,无法与虚拟物体进行深度对比。

      为解决人形遮挡问题,ARKit 借助于神经网络技术将人体从背景中分离出来,并将分离出来的人体图像保存到新增加的人体分隔缓冲区(Segmentation Buffer)中,人体分隔缓冲区是一个像素级缓冲区,可以精确地将人体与环境区分开来,因此,通过人体分隔缓冲区,可以得到精确的人形图像数据。但仅仅将人体从环境中分离出来还不够,还是没有人体的深度信息,为此,ARKit 又新增一个深度估计缓冲区(EstimatedDepth Data Buffer),这个缓冲区用于存储人体的深度信息,但这些深度信息从何而来呢?借助A12及以上仿生处理器的强大性能及神经网络技术,ARKit 工程师们设计了一个只从输人的 RGB 图像估算人体深度信息的算法,这个深度信息每帧都进行更新。至此,通过 ARKit 既可以从人体分隔缓冲区得到人体区域信息,也可以通过深度估计缓冲区得到人体深度信息,图形渲染管线就可以正确地实现虚拟物体与人体的遮挡。

人形遮挡实现

     人形遮挡的实现技术非常复杂,对计算资源要求也非常高,但在 ARKit 中使用该技术实现人形遮挡却非常简单。在 AR 应用中使用人形遮挡需要使用 ARWorld TrackingConfiguration 配置类,并设置其 frameSemantics值为 personSegmentation 或者 personSegmentation WithDepth 之—。当使用 personSegmentation 时,ARKit 不会估算检测到人形的深度信息,人形会无条件遮挡虚拟元素而不管虚拟元素远近。当使用 personSegmentation WithDepth 时,ARKit 在检测到人体时,不仅会分离出人形,还会计算人体到摄像机的距离,从而实现正确的人形遮挡。需要注意的是,只有A13及以上处理器才支持人形遮挡功能,因此在使用前需要先检查设备是否支持。人形遮挡的基本使用方法代码如下所示。

//
//  HumanOcclusion.swift
//  ARKitDeamo
//
//  Created by zhaoquan du on 2024/2/4.
//import SwiftUI
import ARKit
import RealityKit
import Combine//HumanExtraction
struct HumanOcclusionView: View {var body: some View {HumanOcclusionContainer().edgesIgnoringSafeArea(.all).navigationTitle("人形遮挡")}
}struct HumanOcclusionContainer: UIViewRepresentable {func makeUIView(context: Context) -> ARView {let arView = ARView(frame: .zero)guard ARWorldTrackingConfiguration.supportsFrameSemantics(.personSegmentationWithDepth) else {print("不支持人形遮挡")return arView}let config = ARWorldTrackingConfiguration()config.frameSemantics = .personSegmentationWithDepthconfig.planeDetection = .horizontalloadModel(arView: arView)arView.session.run(config)return arView}func updateUIView(_ uiView: ARView, context: Context) {}func loadModel(arView: ARView){var cancelable : AnyCancellable?cancelable = Entity.loadAsync(named: "fender_stratocaster.usdz").sink(receiveCompletion: { completion inif case let .failure(error) = completion {print("无法加载模型,错误:\(error.localizedDescription)")}cancelable?.cancel()}, receiveValue: { entity inlet planAnchor = AnchorEntity(plane: .horizontal)planAnchor.addChild(entity)arView.scene.addAnchor(planAnchor)cancelable?.cancel()})}}

      编译运行,在检测到的平面上放置虚拟物体,当人从虚拟物体前面或后面经过时会出现正确的虚实遮挡,AR虚拟物体不会再漂浮于环境之上,可信度大幅提升。

               

     ARKit 对完整人形检测遮挡效果表现很好,除此之外,对人体局部肢体,如手、脚也有比较好的检测识别和遮挡效果,如图所示。从图中可以看到,ARKit 对人形的区分还是比较精确的,当然,由于深度信息是由神经网络估计得出,而非真实的深度值,所以也会出现深度信息不准确、边缘区分不清晰的问题。

  具体代码地址:GitHub - duzhaoquan/ARkitDemo

这篇关于【iOS ARKit】人形遮挡的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/688302

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)

摘要 剪贴板同步能够提高很多的效率,免去复制、发送、复制、粘贴的步骤,只需要在手机上复制,就可以直接在电脑上 ctrl+v 粘贴,这方面在 Apple 设备中是做的非常好的,Apple 设备之间的剪贴板同步功能(Universal Clipboard)确实非常方便,它可以在 iPhone、iPad 和 Mac 之间无缝传输剪贴板内容,从而大大提高工作效率。 但是,iPhone 如何和 Wind

【Unity小技巧】URP管线遮挡高亮效果

前言 在URP渲染管线环境下实现物体遮挡高亮显示效果,效果如下: Unity URP遮挡高亮 实现步骤 创建层级,为需要显示高亮效果的物体添加层级,比如Player 创建一个材质球,也就是高亮效果显示的材质球找到Universal Renderer Data Assets 4.在Assets上添加两个Render Objects组件 第一个做如下三处设置 指定遮挡层级指

iOS项目发布提交出现invalid code signing entitlements错误。

1、进入开发者账号,选择App IDs,找到自己项目对应的AppId,点击进去编辑, 2、看下错误提示出现  --Specifically, value "CVYZ6723728.*" for key "com.apple.developer.ubiquity-container-identifiers" in XX is not supported.-- 这样的错误提示 将ubiquity

我的第一次份实习工作-iOS实习生-第三个月

第三个月 这个月有一个考核项目,是一个电子书阅读器,组长说很重要,是我的实习考核项目。 我的项目XTReader,这是我参考网上的一些代码,和模仿咪咕阅读做的,功能还不完善,数据的部分是用聚合数据做的。要收费的。   还有阅读页面,基本功能实现了一下。使用了autolayout,自适应布局,也是第一次用网络,第一次用数据库,第一次用自动布局。还有很多不足。 做了一周多,有个问题一直没

我的第一次份实习工作-iOS实习生-公司使用过的软件

bittorrentsync 素材,文件同步软件 cornerstone svn 软件开发合作 mark man 测量坐标的软件 SQLLite Manager 数据库操作软件

我的第一次份实习工作-iOS实习生-第二个月

第二个月 来公司过了一个月了。每天早上9点上班,到晚上6.30下班,上下班要指纹打卡,第一个月忘了打卡好多次(),然后还要去补打卡单。公司这边还安排了,工资卡办理,招商银行卡。开了一次新员工大会,认识了公司的一些过往,公司的要求等,还加了一下公司的企业QQ,还有其他的羽毛球群,篮球群。我加了下羽毛球群,也去打了一两次。第二个月的感受,感觉跟组里面的交流跟沟通都好少,基本上还有好多人不认识。想想也

我的第一次份实习工作-iOS实习生-第一个月

实习时间:2015-08-20 到 2015-12-25  实习公司;福建天棣互联有限公司 实习岗位:iOS开发实习生 第一个月: 第一天来公司,前台报道后,人资带我去我工作的地方。到了那,就由一个组长带我,当时还没有我的办公桌,组长在第三排给我找了一个位置,擦了下桌子,把旁边的准备的电脑帮我装了下,因为学的是iOS,实习生就只能用黑苹果了,这是我实习用的电脑。 帮我装了一下电脑后,开机

iOS如何隐藏系统状态栏

这里主要说明一下iOS7系统给状态栏的适配及隐藏带来的改变。 变化一: 不隐藏状态栏的情况下,StatusBar会直接显示在当前页面上,当前页面的会延伸到 StatusBar下方,顶到最上头。 这种显示方式在iOS7上是无法改变的,也无法通过设置或者配置类达到iOS6的状态栏效果。       所以在iOS7上进行页面布局的时候要考虑