想象你是一位舞台剧导演。舞台上,演员正走向巨大的幕布,幕布上投着城堡的影像。在观众眼里,演员走到投影前时,必须由演员的身体挡住城堡——而不是演员从画面里“穿”过去,更不是城堡自己闪开一条路。这场“谁挡谁、何时挡”的调度,就是导演的职责。 AR(增强现实)应用里也在上演同样的戏码:摄像头拍到的真实世界是舞台,屏幕上叠加的虚拟小恐龙、虚拟菜单、虚拟地毯是投影。真实沙发要挡住虚拟恐龙,人的手要挡住悬浮按钮——这就是 AR 遮挡处理。要做到让观众看不出“穿帮”,系统得像导演一样,随时清楚每位演员(真实物体)和每块投影(虚拟物体)之间的远近关系,并决定谁该画在上面、谁该被按下不表。 本文会带你从零认识深度估计、遮挡判断、人像分割、环境网格、半透明混合、性能优化与工程落地,一步步揭开 AR 遮挡的幕后排练。

岗位关联

掌握 AR 遮挡处理,你就握住了虚实融合的核心能力——这是 AR 图形工程师与空间计算产品在“沉浸感”赛道上拉开差距的硬技能。

目录
  1. 可视化演示
  2. 遮挡基础:谁该挡在谁前面
  3. 深度估计:给演员量距离
  4. 遮挡判断:站到投影前了吗
  5. 人像分割:把演员从背景里抠出来
  6. 环境网格:给整个舞台搭骨架
  7. 半透明混合:薄纱后面的世界
  8. 性能优化:别让舞台卡顿
  9. 工程应用:把效果搬上真机
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

动态演示AR遮挡处理的核心机制,通过总览/传输/转换/输出四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

AR遮挡处理:AR虚实 AR虚实融合与遮挡问题概述 深度估计与实时遮挡判断 核心机制可视化 AR遮挡处理整体架构与关键组件

遮挡基础:谁该挡在谁前面

舞台剧排练现场,导演把一位演员叫到投影幕布前:“你从这里走过,观众看到的应该是你挡掉城堡的一部分,而不是城堡画面被你'穿'过去。”这个“谁挡谁”的调度,听起来简单,却是 AR 虚实融合的第一性命题。

在 AR 设备里,摄像头拍到的是真实世界,计算机再往画面中叠加虚拟物体。真实物体活在三维空间中,虚拟物体只存在于数字坐标系里。两者相遇时,系统必须先回答一个问题:谁离观众更近? 距离近的物体应该画在上面、挡住后面的物体。距离远的一方则要“退让”,被部分遮盖。如果没有这套规则,虚拟物体就会像幽灵一样飘在真实物体之上,一眼穿帮。

遮挡处理的根基就是“深度关系”。深度(depth)指物体到摄像头的距离。当真实物体的深度 $z_r$ 小于虚拟物体的深度 $z_v$ 时,真实物体更靠近镜头,它应该挡住虚拟物体;反之则虚拟物体完整可见。用数学语言表达:

这就像导演手里的两张站位表:一张标着演员离观众的距离,一张标着幕布的位置。比一比谁的“距离数字”更小,就知道谁该挡谁。问题来了——这张站位表从哪来?下一节,我们聊怎么给演员精确量距离。

1[zr<zv]={1真实物体在前,遮挡成立0真实物体在后,遮挡不成立\mathbb{1}[z_r < z_v] = \begin{cases} 1 & \text{真实物体在前,遮挡成立} \\ 0 & \text{真实物体在后,遮挡不成立} \end{cases}
把真实物体深度 $z_r$ 与虚拟物体深度 $z_v$ 比大小,真实物体更近就输出 1(挡住),否则输出 0(不挡)。
  1. 指示函数$\mathbb{1}[\cdot]$ 是条件判断函数,括号里的条件成立时值为 1,不成立时为 0。
    1[⋅]\mathbb{1}[\cdot]
  2. 真实物体深度$z_r$ 表示真实物体到摄像头的距离,值越小说明物体离观众越近。
    zrz_r
  3. 虚拟物体深度$z_v$ 表示虚拟物体在场景中的深度位置,它决定虚拟物体“站”在哪里。
    zvz_v
  4. 比较判定$z_r < z_v$ 说明真实物体更近,遮挡成立,指示函数输出 1。
    zr<zvz_r < z_v

深度估计:给演员量距离

导演喊“量距离!”场务拿起激光测距仪,从观众席朝演员“啪”地打出一道激光,读出一个数字:2.5 米。每一位演员、每一把椅子都要量一次,这张“距离清单”就是舞台调度的依据。在 AR 系统里,这张清单叫深度图。

深度图是一张特殊的图像:画面中的每个像素记录的不是颜色,而是“这个位置上的物体离摄像头有多远”。有了深度图,系统才知道哪里近、哪里远。获取深度图主要有三条路:专用深度传感器(比如 ToF 飞行时间传感器,通过光脉冲往返时间测距)、双目摄像头(模仿人眼从左右两个视角观察),以及单目深度估计网络(用 AI 从一张普通照片中“猜”出深度)。

以双目视差为例:两个摄像头之间隔着一大段已知距离 $b$(称为基线)。同一物体在左右两张图像上的水平位置会有偏移,这个偏移量就是视差 $d$。物体越近,视差越大,深度与视差成反比:

这就像场务用两只眼睛来回打量演员:左眼看一次、右眼看一次,心里估出“约 2.5 米”。有了距离清单,导演才能判断演员是否该挡幕布。可清单只是静态纸面,舞台上随时在动,导演要如何实时判断“你现在挡没挡到”?

z=f×bdz = \displaystyle\frac{f \times b}{d}
焦距 $f$ 和基线 $b$ 是硬件的固定参数,视差 $d$ 由左右图像的匹配算法算出,三者代入公式就得到深度 $z$。
  1. 深度值$z$ 是最终要求的物体深度,单位通常为米,表示物体到相机平面的距离。
    zz
  2. 焦距$f$ 是摄像头镜头的焦距,决定成像的缩放比例,是相机自身的固有属性。
    ff
  3. 基线$b$ 是两个摄像头光心之间的距离,基线越长,同样的深度变化产生的视差越明显。
    bb
  4. 视差$d$ 是同一物体在左右图中对应像素的横向位移,单位为像素,由匹配算法计算。
    dd
  5. 反比关系$z = f \times b / d$ 说明视差越大深度越小——物体越近,左右眼看到的“错位”越明显。
    f×bd\frac{f \times b}{d}

遮挡判断:站到投影前了吗

演员在舞台上每挪一步,导演就得重新判断一次“你现在有没有挡住幕布”。AR 系统同样如此:深度图到手后,遮挡判断要逐帧、逐像素地完成,而且必须做到 60 帧每秒——画面稍有卡顿,观众立刻头晕。

遮挡判断的本质是深度比较:把真实场景的深度图与虚拟物体的深度图对齐,然后逐像素对比。若某个像素上真实物体的深度小于虚拟物体,说明该像素被真实物体覆盖,虚拟物体在此处不可见。但这里有个工程难题:深度传感器存在噪声,物体边缘又往往存在“上一像素属于前景、下一像素属于背景”的突变。如果直接硬比大小,边缘处会频繁闪烁,像舞台边缘忽明忽暗的灯泡。

解决办法是引入过渡带:用深度差除以过渡带厚度 $t$,得到一个 0 到 1 之间的连续可见度,替代生硬的“是/否”:

导演眼睛很尖,但不会只盯一个点——他会盯着演员的轮廓线,看到边缘快贴近幕布时提前布置“过渡”。算法里的 $t$ 就是导演心中那杆“差不多的软尺”。不过,真实场景里还有一群人形物体,它们的深度往往和背景混在一起,这时候该用什么办法把它们单独拎出来?

vis(p)=min⁡(1,zv(p)−zr(p)t)\text{vis}(p) = \min\left(1, \frac{z_v(p) - z_r(p)}{t}\right)
虚拟深度减去真实深度,再除以过渡带厚度 $t$。差值越大,虚拟物体越“安全”地露在外面;差值为负时被钳制到 0,表示完全遮挡。
  1. 像素位置$p$ 代表画面上的一个像素,遮挡判断需要把每个像素逐一处理。
    pp
  2. 虚拟深度$z_v(p)$ 是在像素 $p$ 处虚拟物体的深度,由渲染管线给出。
    zv(p)z_v(p)
  3. 真实深度$z_r(p)$ 是在像素 $p$ 处真实场景的深度,来自深度图。
    zr(p)z_r(p)
  4. 过渡带$t$ 是允许的深度误差厚度,$t$ 越大,边缘过渡越柔和。
    tt
  5. 裁切限制$\min(1, \cdot)$ 把结果限制在 0 到 1 之间;分子为负时可见度为 0,表示被完全遮住。
    min⁡(1,zv−zrt)\min\left(1, \frac{z_v - z_r}{t}\right)

人像分割:把演员从背景里抠出来

舞台上灯光师要把一束光精准打在演员身上,让他和背景幕布分离开。AR 系统也会遇到同样的麻烦:深度传感器再准,也常常分不清“哪里是人,哪里是沙发”——当人手和脸挡住虚拟物体时,我们必须精确知道人的轮廓。这时就需要人像分割这把“灯光裁剪器”。

人像分割是语义分割的一种特殊应用:用神经网络对每个像素打分,判断它属于“人”还是“非人”。输出通常是一张概率图,每个像素的分数落到 0 到 1 之间,越接近 1 越可能是人体。拿到概率图之后,系统就可以在高概率区域使用人的深度参与遮挡判断,在低概率区域使用场景深度,从而实现“手能挡住虚拟恐龙”这类效果。

分割网络的最后一层通常会对原始得分做一次 Sigmoid 压缩,把任意实数映射到 (0, 1) 区间:

灯光师手里的光圈就是 Sigmoid——束光打下去,边缘不是生硬一刀切,而是由亮到暗的渐变。这样抠出的人像轮廓才能自然融入 AR 场景。但舞台上除了人,还有地板、墙、沙发这些“布景”,系统要如何知道这些物体的空间位置?

σ(x)=11+e−x\sigma(x) = \displaystyle\frac{1}{1 + e^{-x}}
$x$ 是网络输出的原始证据分(可正可负),通过 $e^{-x}$ 做指数变换,让大的正分逼近 1、大的负分逼近 0,输出像一个概率。
  1. 原始得分$x$ 是神经网络最后一个特征层输出值,可理解为“该像素属于人的证据强度”。
    xx
  2. 自然常数$e \approx 2.718$ 是自然指数函数的底,使分数变化具有平滑的“S 形滑梯”过渡。
    ee
  3. 指数惩罚$e^{-x}$ 当 $x$ 很大时趋近 0,当 $x$ 很小时趋向正无穷,拉开“人”与“非人”的差距。
    e−xe^{-x}
  4. 归一输出除以 $1 + e^{-x}$ 后,$\sigma(x)$ 永远落在 0 到 1 之间,恰好可作为概率使用。
    11+e−x\frac{1}{1 + e^{-x}}

环境网格:给整个舞台搭骨架

导演想往舞台地面放一张虚拟地毯、往墙上挂一幅虚拟画。要做到这一点,系统必须先知道“地面在哪、墙在哪、沙发占了多大地方”。于是舞台组给整个剧场搭了一套 3D 骨架:地板、墙壁、道具的位置全部标出来。这套骨架在 AR 里叫环境网格(environment mesh)。

环境网格通过 SLAM(即时定位与地图构建)技术生成:设备一边移动一边扫描空间,把平整的表面识别为平面,把不规则物体构建成三角网格。有了环境网格,虚拟物体才能稳定地“落地”,也才能与真实物体进行空间遮挡。网格中每个三角面都有一个法线,指示这个面朝向哪里——向上、向前还是倾斜。

一个空间点的法线可以由其周围邻居面的法线加权平均估计:距离越近的邻居影响越大。将所有邻居法线按权重叠加,再归一化为单位向量:

舞台骨架不是搭一次就完事:演员搬动椅子、布景被换掉,骨架就要跟着改。AR 系统同样动态刷新网格,虚拟地毯才能一直贴紧“真实”的地板。但现实里还有一种更刁钻的布景——薄纱、玻璃、水雾,它们又挡视线又不完全挡死,该怎么办?

n^=∑iniwi∥∑iniwi∥\hat{n} = \displaystyle\frac{\sum_{i} n_i w_i}{\left\|\sum_i n_i w_i\right\|}
分子把邻居三角面的法线 $n_i$ 按其权重 $w_i$ 累加,分母是合成向量的长度,用来归一化,最终 $\hat{n}$ 是一个表示平面朝向的单位向量。
  1. 邻居法线$n_i$ 是网格上第 $i$ 个相邻三角面的法线向量,法线垂直于面,指向“这个面朝向哪里”。
    nin_i
  2. 权重$w_i$ 表示第 $i$ 个邻居对当前点的贡献,通常与距离成反比——越近影响越大。
    wiw_i
  3. 加权求和$\sum_i n_i w_i$ 把所有邻居法线按权重叠加,得到合成方向。
    ∑iniwi\sum_i n_i w_i
  4. 归一化除以合成向量的长度 $\|\cdot\|$,把结果压缩成长度为 1 的单位向量。
    ∥∑iniwi∥\left\|\sum_i n_i w_i\right\|

半透明混合:薄纱后面的世界

不是所有遮挡都是“实心”的。舞台上垂下一条薄纱,投影打在纱上,观众能隐约看到纱后的演员。真实世界里,玻璃窗、塑料瓶、一缕烟雾都是半透明物体——它们既遮挡虚拟物体,又允许部分光线穿过。处理这类遮挡,靠的不是“挡或不挡”,而是“挡多少”。

渲染中用透明度 $\alpha$(0 到 1 之间)描述遮挡程度:$\alpha = 1$ 表示完全不透明,$\alpha = 0$ 表示完全透明。最终屏幕颜色由虚拟物体的颜色和真实场景透过来的颜色按 $\alpha$ 加权混合:

薄纱的透明度不是固定值——纱厚则挡、纱薄则透。AR 系统通过深度与边缘柔化动态调整 $\alpha$,让玻璃、水汽这类“半遮半掩”的物体在虚实之间自然过渡。但这些精细计算无疑会消耗大量算力,手机能撑得住吗?

Cout=αCv+(1−α)CrC_{out} = \alpha C_v + (1 - \alpha) C_r
$C_v$ 是虚拟物体颜色,$C_r$ 是真实物体透过来的颜色,$\alpha$ 是虚拟物体的不透明度。$\alpha$ 越接近 1 虚拟物体越实在,越接近 0 真实世界越透亮。
  1. 输出颜色$C_{out}$ 是最终显示在屏幕上的颜色,由两个来源加权平均得到。
    CoutC_{out}
  2. 虚拟颜色$C_v$ 是虚拟物体自身的固有色,由材质和光照决定。
    CvC_v
  3. 真实颜色$C_r$ 是背后真实场景透过来的颜色,来自摄像头画面。
    CrC_r
  4. 加权混合$\alpha C_v + (1 - \alpha) C_r$ 按不透明度分配两个来源的占比,实现半透明视觉。
    αCv+(1−α)Cr\alpha C_v + (1 - \alpha) C_r

性能优化:别让舞台卡顿

导演最怕的场面:舞台调度太复杂,后台电脑死机,全场观众对着一幅定格的画面。AR 同样如此——深度估计、分割、网格、混合全部要在几十毫秒内完成一次,否则出现卡顿就会引发眩晕。

性能优化的核心思路是“按需精细”:近在眼前的物体需要用高精度模型计算遮挡,远处的物体粗略带过即可。这就要用到 LOD(细节层次) 技术——为同一个虚拟物体准备几套不同精细度的模型,根据距离动态切换。近处用高模,远处用低模,在保证视觉质量的同时大幅削减计算量。

LOD 档位通常按距离划分,用对数刻度让近处的距离变化更敏感:

导演给后排观众准备的内容可以粗略些,前排观众的体验必须精致。LOD 就是这位精打细算的导演——把算力花在观众“看得见”的地方。一切技术就绪,最后的考验是真机实战——效果到底达不达标?

L=⌊log⁡2dd0⌋+1L = \left\lfloor \log_2 \frac{d}{d_0} \right\rfloor + 1
$d$ 是物体到摄像机的距离,$d_0$ 是切换高精度模型的基准距离。先算距离比例的对数,向下取整再加一,得到当前应使用的 LOD 档位。
  1. 距离参数$d$ 是物体到相机的实际距离,距离越远,物体占据屏幕越小,可以用粗糙模型。
    dd
  2. 基准距离$d_0$ 是触发细节切换的基准距离,通常由开发者根据场景经验调整。
    d0d_0
  3. 距离比$d / d_0$ 把距离无量纲化,比值越大表示物体越远。
    dd0\frac{d}{d_0}
  4. 对数压缩$\log_2$ 把线性距离压缩成指数档位,近处档位变化细腻,远处快速降档。
    log⁡2dd0\log_2 \frac{d}{d_0}
  5. 取整加一$\lfloor \cdot \rfloor$ 向下取整,$+1$ 保证档位从 1 开始编号。
    ⌊log⁡2dd0⌋+1\left\lfloor \log_2 \frac{d}{d_0} \right\rfloor + 1

工程应用:把效果搬上真机

排练再完美,最终要在剧场迎接观众。AR 遮挡从论文走进产品,要经过真机验收:举起手机,沙发真的挡住了小恐龙吗?人走动时边缘会不会闪?这就是工程应用阶段的命题。

不同 AR 平台(如 ARKit、ARCore)提供了深度 API 和环境网格 API,开发者要做的是整合与调优:选择合适的深度来源、设计遮挡策略、接入调试工具,并用客观指标评估遮挡质量。其中用得最多的指标是 IoU(交并比),用来衡量“预测出的遮挡区域”与“真实遮挡区域”的重合程度:

演出结束,导演要看观众反馈:哪里穿帮、哪里不真实。IoU 就是那张观众反馈表——数字不说谎,它告诉团队“假戏”有没有做真。至此,从深度估计到工程验收,AR 遮挡这台大戏的幕后流程已经完整展开:用深度感知真实,用判断决定遮挡,用优化保住流畅,用评估守住真实。

IoU=∣A∩B∣∣A∪B∣IoU = \displaystyle\frac{|A \cap B|}{|A \cup B|}
$A$ 是算法输出的遮挡区域,$B$ 是人工标注的真值区域。交集占并集的比例越接近 1,说明预测的遮挡范围和真实越吻合。
  1. 预测区域$A$ 是算法输出的遮挡 mask,标记了哪些像素被判定为“真实物体挡住虚拟物体”。
    AA
  2. 真值区域$B$ 是人工标注的标准答案 mask,代表“理论上应该被遮挡的像素区域”。
    BB
  3. 交集$A \cap B$ 统计同时被算法和真值判定为遮挡的像素数量。
    A∩BA \cap B
  4. 并集$A \cup B$ 统计至少被一方判定为遮挡的像素数量,作为归一化分母。
    A∪BA \cup B
  5. 重合度$\frac{|A \cap B|}{|A \cup B|}$ 的值越接近 1,说明遮挡范围和边缘越贴合真实。
    ∣A∩B∣∣A∪B∣\frac{|A \cap B|}{|A \cup B|}

AI 应用场景

AR 家具试摆

阶段:深度估计 + 实时遮挡判断

解决的问题:传统电商看家具只有静态图,用户不知道沙发尺寸是否合适、摆进家里是否协调。AR 试摆让虚拟沙发 1:1 出现在客厅中,但若沙发不会被人和墙壁遮挡,用户立刻觉得“它是贴图”。

具体案例:宜家 Place 应用利用手机 ToF 深度传感器获取房间深度图,结合环境网格识别地面与墙壁。当用户从虚拟沙发前走过时,系统逐像素比较“人的深度”与“沙发深度”,将沙发被挡住的部分实时隐藏,达到以假乱真的效果。

车载 AR-HUD 导航

阶段:环境网格构建 + 遮挡判断

解决的问题:传统抬头显示(HUD)把导航箭头直接叠加在路面,前方有卡车时,箭头依然画在卡车上面,造成误导。AR 导航要求虚拟箭头被真实车辆正确遮挡,让驾驶员直觉理解“箭头是从这条路延伸出去的”。

具体案例:某车厂 AR-HUD 系统利用前视摄像头与毫米波雷达融合数据,构建前方车辆的深度信息。当系统检测到前方大货车时,计算货车的深度轮廓,将箭头位于货车之后的部分隐去,形成真实的前后遮挡关系。

视频会议虚拟演播室

阶段:人像分割 + 半透明混合

解决的问题:视频会议开启虚拟背景时,手和身体常常“抠不干净”,边缘出现白边或残影。人像分割网络输出的概率图和边缘羽化,能让主持人更好地融入虚拟背景。

具体案例:主流会议软件部署轻量级语义分割模型,逐帧输出人体概率图。在人手滑过虚拟白板区域时,结合深度先验对白板做局部遮挡,并通过 alpha 混合实现手部边缘的柔和过渡,避免生硬裁剪。

Python 演示

python54 行
import numpy as np  def make_real_depth(h, w, z_far=3.0, z_box=0.8):    """模拟真实场景深度图:一个近处盒子 + 远处背景"""    depth = np.full((h, w), z_far, dtype=np.float64)    bh, bw = h // 3, w // 4    bx, by = (w - bw) // 2, (h - bh) * 2 // 3    depth[by:by + bh, bx:bx + bw] = z_box    return depth  def make_virtual_depth(h, w, z_center=2.0, radius=0.4):    """模拟虚拟物体深度图:一个位于场景中央的球"""    yy, xx = np.mgrid[0:h, 0:w]    cx, cy = w // 2, h // 2    dist = np.sqrt((xx - cx) ** 2 + (yy - cy) ** 2) / min(h, w)    depth = np.where(dist < radius, z_center, np.inf)    return depth  def occlusion_mask(depth_real, depth_virtual, thresh=0.1):    """逐像素比较深度:真实物体更近则该像素被遮挡"""    valid = np.isfinite(depth_virtual)    occluded = valid & ((depth_real + thresh) < depth_virtual)    return occluded  def smooth_edge(mask, k=3):    """用 3x3 平均卷积做遮挡边缘柔化"""    kernel = np.ones((k, k)) / (k * k)    padded = np.pad(mask.astype(np.float64), k // 2, mode='edge')    out = np.zeros_like(mask, dtype=np.float64)    h, w = mask.shape    for i in range(k):        for j in range(k):            out += kernel[i, j] * padded[i:i + h, j:j + w]    return out  def main():    h, w = 240, 320    depth_real = make_real_depth(h, w)    depth_virtual = make_virtual_depth(h, w)    mask = occlusion_mask(depth_real, depth_virtual)    soft = smooth_edge(mask)    ratio = mask.mean() * 100    print("虚拟球被真实盒子遮挡的像素占比: {:.1f}%".format(ratio))    print("遮挡mask总像素数:", int(mask.sum()))    print("边缘柔化后前5个像素值:", soft[0, :5])  if __name__ == "__main__":    main()
目的:模拟 AR 场景中“真实盒子在前、虚拟球在后”的深度关系,逐像素计算遮挡 mask 并做边缘柔化,演示遮挡判断的核心流程。
  1. make_real_depth(h, w)生成一张只有近处盒子和远处背景的模拟真实深度图。
  2. make_virtual_depth(h, w)生成一个位于画面中央的虚拟球深度图,外部区域为无穷远。
  3. occlusion_mask(depth_real, depth_virtual, 0.1)真实物体深度加上误差阈值后仍小于虚拟深度,就判定为被遮挡。
  4. np.isfinite(depth_virtual)排除虚拟物体不存在的区域,避免无穷大参与比较。
  5. smooth_edge(mask, 3)用 3×3 卷积核做边缘柔化,模拟过渡带效果。
  6. depth[by:by + bh, bx:bx + bw] = z_box把矩形区域的实际深度赋给盒子,模拟前景物体。
  7. np.where(dist < radius, z_center, np.inf)用圆形掩膜生成虚拟球的深度分布。

常见误区

误区“只要拿到深度图,AR 遮挡就百分百真实了,深度图最准确。”

正解深度图有噪声、边缘不精确,对玻璃等透明物体更是无能为力。就像拿一把有点生锈的卷尺量舞台距离,量出来的边缘会锯齿、抖动。真实工程需要把深度估计、人像分割、过渡带、半透明混合组合使用,才能达到“看起来自然”的效果。

为何常见:深度图看起来非常“客观”,人容易把数据等同于真实,忽略了传感器的物理局限。

误区“遮挡不就是比较两个深度谁大谁小吗?深度小的一定挡住深度大的。”

正解大多数场景确实如此,但半透明物体、动态物体、边缘深度突变都会让简单的比大小失效。直接硬比会导致边缘闪烁、轮廓跳动。工程上会用过渡带、置信度,甚至机器学习来修正遮挡边界。

为何常见:教材把遮挡抽象成深度比较,单看公式容易忽略真实场景中的复杂度和噪声。

误区“AR 应用启动时把房间扫描一遍,环境网格就不用再更新了。”

正解房间里的椅子会被搬动、人会在场景中走动、光照会变化。ARKit/ARCore 的网格会持续更新,遮挡判断必须基于最新一帧的深度和环境信息,否则虚拟物体会“穿过”移动的椅子,明显穿帮。

为何常见:把 SLAM 理解为离线建图,忽视了 AR 对实时性的硬要求。

误区“给遮挡边缘加羽化会让画面变模糊,影响真实感,所以不该加。”

正解羽化不是整张图模糊,而是把遮挡边缘的 0/1 硬边改成 0 到 1 的渐变,模拟真实相机抗锯齿和光学散射的效果。没有羽化的边缘反而显得“纸片化”,一看就是贴图。

为何常见:把“柔化”等同于“失焦”,不理解软边缘是为模拟真实光学而设计的。

面试题

Q1. AR 遮挡处理要解决的核心矛盾是什么?

单选题 · easy

  • A.真实物体与虚拟物体的远近关系← 正确答案
  • B.虚拟物体的建模复杂度太高
  • C.手机摄像头的分辨率不够高
  • D.AR 设备的电池续航时间太短

答案:A。AR 遮挡的核心是解决真实物体与虚拟物体之间的深度关系——谁离观众更近,谁就画在上面。建模复杂度、分辨率和续航都是工程问题,但不是遮挡处理要解决的“核心矛盾”。

Q2. 下列哪个设备可以直接提供深度信息?

单选题 · easy

  • A.ToF 飞行时间深度传感器← 正确答案
  • B.普通家用黑白打印机
  • C.无线蓝牙降噪耳机
  • D.标准液晶显示屏幕

答案:A。ToF 传感器通过光脉冲往返时间测量距离,能直接输出深度图,是 AR 设备常用硬件。打印机、耳机、显示器都不具备三维测距能力。

Q3. 人像分割网络输出的概率图主要用途是什么?

单选题 · easy

  • A.区分人与背景区域← 正确答案
  • B.提高屏幕刷新率
  • C.增强无线网络信号
  • D.压缩视频文件大小

答案:A。人像分割网络对每个像素输出“是人还是非人”的概率,概率图用于将人体区域从背景中分离,进而引导遮挡判断。刷新率、网络信号、视频压缩都与分割无关。

Q4. 双目视差计算深度时,物体越近会产生什么现象?

单选题 · mid

  • A.视差越大,对应深度越小← 正确答案
  • B.视差越小,对应深度越小
  • C.视差与深度变化无关
  • D.视差波动没有任何规律

答案:A。双目测距公式 $z = f \times b / d$ 表明视差 $d$ 与深度 $z$ 成反比。物体越近,左右眼看到的偏移越大,视差越大,算出来的深度值越小。其余选项与反比关系矛盾。

Q5. 遮挡判断中引入“过渡带 t”的作用是什么?

单选题 · mid

  • A.让遮挡边缘更平滑自然← 正确答案
  • B.降低摄像头的分辨率
  • C.增加虚拟物体的亮度
  • D.减少真实场景的色彩

答案:A。过渡带把深度差除以厚度 $t$,得到一个 0~1 的连续可见度,避免边缘因噪声在“挡与不挡”间来回跳变,从而让边缘更平滑。它与分辨率、亮度、色彩无关。

Q6. LOD 分级细节的核心思想是什么?

单选题 · mid

  • A.近处精细远处粗略← 正确答案
  • B.所有物体同样精细
  • C.只渲染背景物体
  • D.禁用深度传感器

答案:A。LOD 根据距离切换模型精细度:近处物体用高精度模型保证遮挡细节,远处用低精度模型省算力。均匀精细会浪费资源,只渲染背景或禁用传感器都不是 LOD 思路。

Q7. 半透明遮挡中 alpha=0.3 表示什么?

单选题 · hard

  • A.虚拟物体不透明度为三成← 正确答案
  • B.虚拟物体透明度为三成
  • C.真实物体亮度下降三成
  • D.背景颜色占比为三成

答案:A。$\alpha$ 是虚拟物体的不透明度系数。$\alpha=0.3$ 表示混合时虚拟物体颜色占 30%,真实背景颜色占 70%(即 $1-\alpha$)。透明度是三成对应 $\alpha=0.7$,因此其他选项都不对。

Q8. 环境网格 mesh 在 AR 遮挡中的用途有哪些?

多选题 · mid

  • A.提供真实空间的几何骨架← 正确答案
  • B.辅助虚拟物体稳定落地← 正确答案
  • C.提供虚拟物体的遮挡依据← 正确答案
  • D.延长手机电池续航时间

答案:ABC。环境网格构建了真实空间的 3D 几何骨架,可检测地面墙面,帮助虚拟物体稳定放置,并可作为遮挡判断的空间依据。电池续航与网格本身没有直接关系。

Q9. 以下哪些因素会导致 AR 遮挡判断出错?

多选题 · hard

  • A.深度图边缘存在噪声← 正确答案
  • B.半透明物体混色偏差← 正确答案
  • C.人像分割边缘不齐← 正确答案
  • D.屏幕亮度设置太低

答案:ABC。深度噪声会让边缘抖动,半透明物体的混合偏差会让遮挡比例失衡,人像分割边缘不齐会产生白边或残影。屏幕亮度只影响用户观感,不会改变算法计算的遮挡关系。

Q10. 使用 IoU 评估 AR 遮挡质量时,需要哪些输入?

多选题 · extreme

  • A.算法输出的预测遮挡区域← 正确答案
  • B.人工标注的真值遮挡区域← 正确答案
  • C.两者的交集与并集统计← 正确答案
  • D.设备电池的温度数据

答案:ABC。$IoU = |A \cap B| / |A \cup B|$,$A$ 是算法预测区域,$B$ 是人工标注真值,计算交集和并集后求比值。温度数据与遮挡质量评估无关。