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 采样路径

官方原章以 Core Image 为例:上层 filter 设置 sampler、传入参数、选择 kernel,再把结果写入目标图像。kernel 仍然按像素运行,但框架会处理坐标变换、硬件差异和惰性求值,让我们可以把重点放在“每个像素要算什么”。

更重要的是,输出不一定必须是普通 RGBA 画面。检测阶段可以让四个通道承载 x·my·mm 等统计量,下一轮 kernel 再把它们继续归约。GPU 负责并行算,CPU 只接收最后的少量结果。

evaluate only the pixels that can reach the destinationsource imageROIsampler pixels neededoutside area stays untoucheddestination domainoutputvisible pixels onlylazy evaluation keeps CPU free

2. 用颜色距离生成二值掩码

先选择要追踪的颜色,再为它设置容差。对当前像素和目标颜色分别做亮度归一化,可以减轻同一物体因光照变化而产生的整体明暗差;随后计算颜色距离,小于阈值就输出白色,否则输出黑色。

阈值是检测系统最敏感的旋钮:太小会漏掉阴影或高光中的目标,太大会把背景里的相似颜色一起吞进来。掩码阶段只回答“像不像”,不回答“中心在哪里”,因此后面还要做统计归约。

compare color, keep only the targetvideo framenormalize RGB, then measure distancetarget color + thresholdbinary maskwhite = included, black = rejectedone GPU pass over the frame

3. 把掩码变成可以归约的三个通道

令掩码为 m(x,y)。目标中心就是所有 x·m 的总和除以 m 的总和,y 同理;而分母 sum(m) 还直接告诉我们目标区域的面积。于是每个像素不再输出一张最终画面,而是输出三项统计:横坐标贡献、纵坐标贡献、命中权重。

这一步把“在整帧里找位置”改写成“在 GPU 上做可并行的加法”。坐标先归一化到 0 到 1,最终 1×1 像素中的 RG 通道就是质心,B 通道就是面积比例。

reduce a whole mask to one useful pixelmask m(x,y)target pixelsmultiply by x,yweighted channelsx · my · mmone vector per pixeldownsample repeatedly1 × 1 resultsum(xm) / sum(m)sum(ym) / sum(m)area = sum(m)centroid + areaCPU receives three values

4. 用多次下采样把整张图压成 1×1

GPU 擅长同时处理很多像素,但不适合让每个片元直接写同一个全局计数器。因此采用多次 pass:先把每个像素变成带权坐标,再把邻域平均到更小的图,反复进行直到得到一个像素。原章的示例一次横纵都缩小四倍,并利用线性插值硬件用较少采样覆盖更大的块。

如果源图不是正方形或尺寸不是二的幂,需要注意边界和面积补偿;图像域外的透明像素会让平均值带固定比例偏差,最后应按真实图像面积校正。归约结束后再做一次安全除法,避免目标完全消失时除以零。

color detection as a multipass GPU pipeline1 · maskcolor → binary image2 · reducex m, y m, m→ 1 × 1centroid + area3 · overlayposition + scalethe GPU returns a tiny statistic, leaving video decode and encode to the CPU

第 1 / 3 步 · 逐像素比较归一化颜色,生成黑白掩码

逐步观察整帧视频如何变成一个可以驱动交互叠加的质心与面积。

5. 把质心和面积交给叠加阶段

叠加 kernel 读取 1×1 结果,把图像采样位置平移到质心,再用面积的平方根估计目标与相机的距离尺度。对于形状大致不变的球或标记物,面积随距离平方变化,因此开平方能给出足够稳定的大小线索。

最后用预乘 alpha 合成叠加图,而不是把透明颜色再乘一遍 alpha。这个假设不适用于会改变形状的气球或液体,但对球、彩色道具和交互标记很实用。

location and area drive the overlayvideo + centroidl.xy = center, l.z = areasqrt(area) estimates scaletranslate + scaleoverlay centered on l.xysize follows object areacompositepremultiplied alphaoverlay on video

6. ROI 决定何时值得全帧处理

颜色检测的好处是计算很轻,即使每帧处理整张高清图也可能足够快;但当 filter 链包含变换、裁剪或只输出局部区域时,ROI 就决定了哪些源像素真的需要采样。Core Image 可以从目标反向推导依赖关系,把不可能出现在最终输出里的区域排除。

不要把 ROI 误当成检测到的物体框。ROI 是计算依赖范围,掩码的白色区域才是颜色命中范围;两者服务于不同阶段。

动手走一遍:从视频帧到叠加结果

分步1 / 3

先生成颜色掩码

归一化当前像素和目标颜色,计算距离并用阈值输出黑白掩码;先控制误检,再谈定位。

compare color, keep only the targetvideo framenormalize RGB, then measure distancetarget color + thresholdbinary maskwhite = included, black = rejectedone GPU pass over the frame
GPU Gems 3 · Chapter 26

Color Detection and Tracking Lab

可交互

调整目标色、阈值、噪声与归约方式,观察掩码面积如何驱动质心定位和叠加图大小。

video → color mask → centroid → duck overlayinput frametracked resulttarget + thresholdcenter + sqrt(area) scalemask area 36.1% · centroid 49% / 47% · 5 reduction passesthreshold 34 · color distance is controlled
掩码面积36.1%
质心 X / Y49% / 47%
叠加缩放0.84×
归约 pass5

小结

  • 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

为计算输出实际需要读取的源图区域,用于跳过无关像素。

讨论

评论区加载中…