首页 > 其他分享 >【iOS ARKit】人形遮挡

【iOS ARKit】人形遮挡

时间:2024-02-06 18:00:26浏览次数:32  
标签:遮挡 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 = .personSegmentationWithDepth
        config.planeDetection = .horizontal
        loadModel(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 in
                if case let .failure(error) = completion {
                    print("无法加载模型,错误:\(error.localizedDescription)")
                }
                cancelable?.cancel()
            }, receiveValue: { entity in
                let planAnchor = AnchorEntity(plane: .horizontal)
                planAnchor.addChild(entity)
                arView.scene.addAnchor(planAnchor)
                
                cancelable?.cancel()
                
            })
    }
    
    
}

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

 

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

具体代码地址:https://github.com/duzhaoquan/ARkitDemo.git

标签:遮挡,iOS,人形,ARKit,虚拟,深度,人体
From: https://www.cnblogs.com/duzhaoquan/p/18010131

相关文章

  • axios 使用
    官网https://axios-http.com/安装npminstallaxios使用格式axios.method({configs}).then(function(response){//}).catch(function(error){//handleerrorconsole.log(error);}).finally(function(){//alwaysexecuted});axios函数axi......
  • 打包 iOS 的 IPA 文件
    摘要本篇博客将为您介绍如何打包iOS的IPA文件。从APP提交、创建应用程序、设置应用程序标识和证书、配置构建设置到构建应用程序、导出IPA,以及签名和导出等方面进行详细讲解。此外,我们还将介绍一些实用的代码案例,帮助您更好地理解和操作。引言打包iOS的IPA文件是发布应用程序的......
  • axios导出Excel或word
    axios导出Excel或word1.通用方法书写importaxiosfrom'axios'import{saveAs}from'file-saver'//创建axios实例constrequest=axios.create({baseURL:'http://192.168.0.101:8081/zj_travel',//所有的请求地址前缀部分(没有后端请求不用写)timeout:80......
  • 极狐 GitLab 和 Xcode Cloud 集成,实现 iOS 的自动打包
    一直以来,iOS/macOS开发者面临一个难题:大部分云厂商只提供Linux/Windows服务器,而不提供Mac,如果想实现「持续集成自动打包」就需要绑定自己的Mac作为构建机。如果用个人Mac,一旦关机,小组同事就无法构建;如果再买一台公共Mac,又造成浪费。2022年6月,Apple在WWDC(全球开发者......
  • 【iOS ARKit】3D人体姿态估计实例
    ​   与2D人体姿态检测一样,在ARKit中,我们不必关心底层的人体骨骼关节点检测算法,也不必自己去调用这些算法,在运行使用ARBodyTrackingConfiguration配置的ARSession之后,基于摄像头图像的3D人体姿态估计任务也会启动,我们可以通过session(_session:ARSession,didUpdatea......
  • 【iOS ARKit】3D 人体姿态估计
       与基于屏幕空间的2D人体姿态估计不同,3D人体姿态估计是尝试还原人体在三维世界中的形状与姿态,包括深度信息。绝大多数的现有3D人体姿态估计方法依赖2D人体姿态估计,通过获取2D人体姿态后再构建神经网络算法,实现从2D到3D人体姿态的映射。   在ARKit中,由于是采......
  • iOS应用提交上架的最新流程
    摘要本篇博客介绍了iOS应用程序上架的最新流程。包括上架基本需求资料、证书的创建和使用、测试设备的添加、描述文件的创建、打包、审核等步骤。 引言在开发完iOS应用程序后,我们需要将其提交到AppStore上架。然而,随着技术的不断发展,上架流程也会不断更新。本文将介绍最新......
  • nodejs+axios调用第三方接口返回数据给前端
    nodejsaxios调用第三方接口返回数据给前端后端koalas前端vue0.内容和前后端框架本项目为前端执行时间段和航班,后端利用指定信息查询第三方航班信息接口并返回给前端。1.koajs+axiosapp.js文件中引入koa、添加初始化中间件并启动项目。1.1引入koa并添加初始化bodyPars......
  • 【iOS ARKit】2D肢体动作捕捉
       人体肢体动作捕捉在动漫影视制作、游戏CG动画、实时模型驱动中有着广泛的应用,利用ARKit,无须额外的硬件设备即可实现2D和3D人体一系列关节和骨骼的动态捕捉,由于移动AR的便携性及低成本,必将促进相关产业的发展。ARBodyTrackingConfiguration   ARKit配置类AR......
  • Vue中如何对Axios进行二次封装
    作为一个前端开发者,你一定对Axios这个强大的HTTP库非常熟悉。它不仅简化了与后端API的通信,而且还提供了许多强大的功能,如拦截器、取消请求等。但是在实际开发中,我们经常需要对Axios进行二次封装,以便更好地适应我们的业务需求。今天,我将为大家分享一下如何在Vue中对Axios进行二次封......