GPU Gems 3 · Chapter 26. Object Detection by Color: Using the GPU for Real-Time Video Image Processing
从视频颜色掩码出发,解释如何用 GPU 归约得到目标质心与面积,再驱动实时叠加和距离缩放。
学习目标
- 能解释颜色掩码、坐标加权和多次下采样如何把整帧视频变成一个目标质心与面积
- 能修改 Color Detection and Tracking Lab 的目标色、阈值、噪声、归约方式与叠加图,比较误检和定位结果
- 能回答:为什么 GPU 只返回 1×1 的统计像素,就能让 CPU 继续负责视频编解码和交互逻辑
先问:为什么找一个彩色物体不必把整帧搬回 CPU
想象你在一张大照片里找一只颜色独特的球。最笨的做法是把每个像素都交给 CPU,再逐个比较;更聪明的做法是让一台并行工人同时查看整张照片,最后只交回“球在哪里、占了多大”两行信息。
本章解决的就是这个问题:视频帧留在 GPU 上,像素着色器先筛出目标色,再把所有命中的坐标归约成一个质心和一个面积。没有这条路径,CPU 会被像素扫描拖住,无法同时做好视频解码、编码和游戏逻辑。
我们不会依赖摄像头权限,而是用确定性的彩色目标模拟一帧视频。这样每个参数变化都能复现同一条检测链路:掩码、统计、叠加。
1. 让图像处理框架管理 GPU 采样路径
↡把图像输入、采样器、像素 kernel 和输出组织成惰性图像处理图的高层框架;它可以只计算最终输出需要的像素。官方原章以 Core Image 为例:上层 filter 设置 sampler、传入参数、选择 kernel,再把结果写入目标图像。kernel 仍然按像素运行,但框架会处理坐标变换、硬件差异和惰性求值,让我们可以把重点放在“每个像素要算什么”。
更重要的是,输出不一定必须是普通 RGBA 画面。检测阶段可以让四个通道承载 x·m、y·m、m 等统计量,下一轮 kernel 再把它们继续归约。GPU 负责并行算,CPU 只接收最后的少量结果。
2. 用颜色距离生成二值掩码
↡按目标颜色和阈值把每个像素分成命中或未命中两类的图像;命中像素为 1,其他像素为 0。先选择要追踪的颜色,再为它设置容差。对当前像素和目标颜色分别做亮度归一化,可以减轻同一物体因光照变化而产生的整体明暗差;随后计算颜色距离,小于阈值就输出白色,否则输出黑色。
阈值是检测系统最敏感的旋钮:太小会漏掉阴影或高光中的目标,太大会把背景里的相似颜色一起吞进来。掩码阶段只回答“像不像”,不回答“中心在哪里”,因此后面还要做统计归约。
3. 把掩码变成可以归约的三个通道
↡所有命中像素坐标的加权平均位置;权重是掩码值,结果就是目标色区域的中心。令掩码为 m(x,y)。目标中心就是所有 x·m 的总和除以 m 的总和,y 同理;而分母 sum(m) 还直接告诉我们目标区域的面积。于是每个像素不再输出一张最终画面,而是输出三项统计:横坐标贡献、纵坐标贡献、命中权重。
这一步把“在整帧里找位置”改写成“在 GPU 上做可并行的加法”。坐标先归一化到 0 到 1,最终 1×1 像素中的 RG 通道就是质心,B 通道就是面积比例。
4. 用多次下采样把整张图压成 1×1
↡把较大图像按固定比例逐级缩小、每次合并邻域统计的过程;重复执行直到只剩一个汇总像素。GPU 擅长同时处理很多像素,但不适合让每个片元直接写同一个全局计数器。因此采用多次 pass:先把每个像素变成带权坐标,再把邻域平均到更小的图,反复进行直到得到一个像素。原章的示例一次横纵都缩小四倍,并利用线性插值硬件用较少采样覆盖更大的块。
如果源图不是正方形或尺寸不是二的幂,需要注意边界和面积补偿;图像域外的透明像素会让平均值带固定比例偏差,最后应按真实图像面积校正。归约结束后再做一次安全除法,避免目标完全消失时除以零。
第 1 / 3 步 · 逐像素比较归一化颜色,生成黑白掩码
逐步观察整帧视频如何变成一个可以驱动交互叠加的质心与面积。
5. 把质心和面积交给叠加阶段
↡用统计结果把另一张图移动到目标中心,并根据目标面积估计它应显示的大小后进行合成的过程。叠加 kernel 读取 1×1 结果,把图像采样位置平移到质心,再用面积的平方根估计目标与相机的距离尺度。对于形状大致不变的球或标记物,面积随距离平方变化,因此开平方能给出足够稳定的大小线索。
最后用预乘 alpha 合成叠加图,而不是把透明颜色再乘一遍 alpha。这个假设不适用于会改变形状的气球或液体,但对球、彩色道具和交互标记很实用。
6. ROI 决定何时值得全帧处理
↡为计算某个输出区域而实际需要从源图读取的区域;它帮助框架跳过不会影响最终结果的像素。颜色检测的好处是计算很轻,即使每帧处理整张高清图也可能足够快;但当 filter 链包含变换、裁剪或只输出局部区域时,ROI 就决定了哪些源像素真的需要采样。Core Image 可以从目标反向推导依赖关系,把不可能出现在最终输出里的区域排除。
不要把 ROI 误当成检测到的物体框。ROI 是计算依赖范围,掩码的白色区域才是颜色命中范围;两者服务于不同阶段。
动手走一遍:从视频帧到叠加结果
先生成颜色掩码
归一化当前像素和目标颜色,计算距离并用阈值输出黑白掩码;先控制误检,再谈定位。
Color Detection and Tracking Lab
调整目标色、阈值、噪声与归约方式,观察掩码面积如何驱动质心定位和叠加图大小。
小结
- GPU 颜色检测先生成掩码,再把整帧压缩成质心和面积两个关键信号。
- 归一化颜色距离和阈值共同决定漏检与误检的取舍。
x·m、y·m、m三个通道让质心计算可以通过多次下采样并行完成。- 质心定位叠加图,面积平方根在形状稳定时提供距离缩放线索。
- ROI 是计算依赖范围,不等于颜色掩码中的目标区域。
练习
练习
问题 1|修改 Demo 代码。 在 Color Detection and Tracking Lab 中把 frame noise 切到 noisy,再分别把 threshold 调到低值和高值。记录掩码面积、质心和背景风险的变化。
问题 2|诊断归约结果为零。 掩码画面能看到目标,但最终 1×1 结果的面积为零。请检查颜色空间、坐标通道和下采样链。
问题 3|场景选型。 一个形状稳定的彩色球、一个会膨胀的气球、一个只占小矩形区域的 UI 标记,分别如何选择面积缩放、时间滤波和 ROI 策略?
名词解释
本章出现的专业名词,用大白话再讲一遍。
- Core Image filter
把图像采样、像素 kernel 和输出组织成 GPU 处理图的高层过滤器。
- color mask
用颜色距离和阈值生成的黑白图,白色表示像素命中目标颜色。
- centroid
目标像素坐标按掩码权重求出的中心位置。
- multipass reduction
反复缩小并合并统计通道,直到把整张图汇总为一个像素。
- overlay compositing
按质心移动、按面积缩放另一张图,再把它合成到视频上的过程。
- region of interest
为计算输出实际需要读取的源图区域,用于跳过无关像素。