【iOS ARKit】人形遮挡

news2024/10/7 6:50:01

人形遮挡简介

       在 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 对人形的区分还是比较精确的,当然,由于深度信息是由神经网络估计得出,而非真实的深度值,所以也会出现深度信息不准确、边缘区分不清晰的问题。

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

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

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

相关文章

6.electron之上下文隔离,预加载JS脚本

如果可以实现记得点赞分享,谢谢老铁~ Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 将 Chromium 和 Node.js 嵌入到了一个二进制文件中,因此它允许你仅需一个代码仓库,就可以撰写支持 Windows、…

白嫖10款游戏加速器,一年都不用开会员!

过年期间你们是走亲串戚还是窝家玩游戏、追剧?相信很多小伙伴都不会放过这个难得的假期,肯定是会百忙之中来两把的,那么人一多玩游戏肯定就会拥堵,有延迟。解决延迟最好的办法就是用加速器,当你的网络比别人强时&#…

Rust通用代码生成器莲花发布红莲尝鲜版二十一,前端代码生成物有巨大改进

Rust通用代码生成器莲花发布红莲尝鲜版二十一,前端代码生成物有巨大改进 Rust通用代码生成器莲花已发布红莲尝鲜版二十一,此版本采用了新的前端代码生成引擎:时空之门前端代码生成器6.2.0。此引擎支持Nodejs 21,Nodejs 18和Nodejs 14。消除了…

开源软件:技术创新与应用的推动力量

文章目录 每日一句正能量前言开源软件如何推动技术创新开源软件的历史开源软件的开发模式开源软件与闭源软件源代码和开发许可维护特点、支持和成本开源软件的优势减少开支可定制性快速创新发展透明度和安全性 开源软件的应用 常见问题后记 每日一句正能量 不好等待运气降临&am…

如何检测机械硬盘和固态硬盘的健康状况?

机械硬盘、移动硬盘、固态硬盘等作为存储数据的重要部件,其重要性不言而喻。随着时间的推移,这些数据存储设备可能会出现各种问题,影响数据安全。机械硬盘、固态硬盘的健康状态怎么看?本篇介绍两个方法帮你检测电脑上的机械硬盘或…

大数据Doris(六十四):Doris on ES在快手商业化的业务场景介绍

文章目录 Doris on ES在快手商业化的业务场景介绍 一、服务介绍

kafka 文件存储机制

文章目录 1. 思考四个问题:1.1 topic中partition存储分布:1.2 partiton中文件存储方式:1.3 partiton中segment文件存储结构:1.4 在partition中如何通过offset查找message: 2. kafka日志存储参数配置 Topic是逻辑上的概念&#xff…

hummingbird,一个非常好用的 Python 库!

前言 随着人工智能和机器学习的快速发展,将训练好的模型部署到生产环境中成为了一个重要的任务。而边缘计算设备,如智能手机、嵌入式系统和物联网设备,也需要能够运行机器学习模型以进行实时推理。Python Hummingbird 是一个强大的工具&…

PKI - 03 密钥管理(如何进行安全的公钥交换)

文章目录 Pre密钥管理面临的挑战安全密钥管理的几种方式手动密钥交换与确认受信任的介绍 Pre PKI - 02 对称与非对称密钥算法 密钥管理面临的挑战 密钥管理面临的挑战主要包括以下几点: 安全的公钥交换:在使用基于非对称密钥算法的服务之前&#xff0c…

最新话费充值系统源码,附带系统安装教程

搭建教程 亲测环境:PHP7.0MySQL5.6 PHP扩展安装:sg11 数据库配置文件路径:/config/database.php 伪静态设置为thinkphp 后台地址:/admin 账号密码:admin/123456

Redis渗透SSRF的利用

Redis是什么? Redis是NoSQL数据库之一,它使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库。默认端口是:6379 工具安装 下载地址: http://download.redis.io/redis-stable.tar.gz然…

【XR806开发板试用】 GPIO驱动LED

按照教程来学习下GPIO驱动LED指示灯 一、硬件电路 使用板卡上D1指示灯测试 二、驱动程序部分 在ohosdemo目录下创建文件 编辑ohosdemo/BUILD.gn文件 编辑ohosdemo/led/BUILD.gn文件 编辑ohosdemo/led/src/main.c文件 三、编译程序 将编译好的程序下载到开发板 四…

完全让ChatGPT写一个风格迁移的例子,不改动任何代码

⭐️ 前言 小编让ChatGPT写一个风格迁移的例子,注意注意,代码无任何改动,直接运行,输出结果。 额。。。。这不是风格转换后的结果图。 ⭐️ 风格迁移基本原理 风格迁移是一种计算机视觉领域的图像处理技术,它的目标…

BUUCTF-Real-[Tomcat]CVE-2017-12615

目录 漏洞描述 一、漏洞编号:CVE-2017-12615 二、漏洞复现 get flag 漏洞描述 CVE-2017-12615:远程代码执行漏洞 影响范围:Apache Tomcat 7.0.0 - 7.0.79 (windows环境) 当 Tomcat 运行在 Windows 操作系统时,且启用了 HTTP P…

Stable Diffusion 模型下载:Schematics(原理图)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 “Schematics”是一个非常个性化的LORA,我的目标是创建一个整体风格,但主要面向某些风格美学,因此它可以用于人物、物体、风景等…

微信小程序合集更更更之实现仿网易云播放动效

实现效果 写在最后🍒 源码,关注🍥苏苏的bug,🍡苏苏的github,🍪苏苏的码云~

【Leetcode】2641. 二叉树的堂兄弟节点 II

文章目录 题目思路代码结果 题目 题目链接 给你一棵二叉树的根 root ,请你将每个节点的值替换成该节点的所有 堂兄弟节点值的和 。 如果两个节点在树中有相同的深度且它们的父节点不同,那么它们互为 堂兄弟 。 请你返回修改值之后,树的根 …

TitanIDE:v2.8.0正式发布,模板市场来袭!

TitanIDE v2.8.0版本正式发布,模板市场中内置40模版! 什么是TitanIDE TitanIDE,云端IDE,作为数字化时代研发体系不可或缺的一环,和企业建设好的云服务具有很高的互操作性。秉承“安全、高效、体验”的原则&#xff0…

open3d进行ICP点云配准

一、代码 import numpy as np import open3d as o3d from scipy.spatial.transform import Rotation as R# 1. 加载源点云和目标点云 source o3d.io.read_point_cloud("bun_zipper.ply") target o3d.io.read_point_cloud("bun_zipper2.ply") source.pai…

金融信贷风控特征计算详解

特征的含义? 特征可以说是风控系统中的最小单元,是风控工具的重要组成部分,我们也可以理解成变量。不过叫什么问题不大,团队内有相同的共识就行。 风控特征是我们做数字化线上风控中的重要组成部分,几乎可以说没有风…