公司网站建设费用记什么科目,健康中国app,汕头论坛网站建设,wordpress友链页面人形遮挡简介 在 AR系统中#xff0c;计算机通过对设备摄像头采集的图像进行视觉处理和组织#xff0c;建立起实景空间#xff0c;然后将生成的虚拟对象依据几何一致性原理嵌入到实景空间中#xff0c;形成虚实融合的增强现实环境#xff0c;再输出到显示系统中呈现给使用…人形遮挡简介 在 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