自瞄教程
02 识别

传统视觉:从灯条到装甲板

用颜色、轮廓和几何规则完成装甲板识别。

在神经网络普及之前,自瞄识别通常从一个很直接的观察开始:敌方装甲板上有两条明显的发光灯条,它们颜色接近、长度相近、方向近似平行。只要把这些特征逐层写成规则,就能从图像中筛选出装甲板。

1. 一条典型的传统视觉管线

BGR 图像
  → 颜色与亮度分离
  → 二值化
  → 形态学处理
  → 轮廓提取
  → 灯条拟合
  → 左右灯条配对
  → 装甲板几何检查
  → 灯条端点与角点输出

颜色与亮度分离

最简单的做法是比较 B、G、R 通道。例如攻击红方时,可以寻找 R - B 较大的像素;也可以将图像转换到 HSV 等颜色空间,分别限制色相、饱和度和亮度。阈值处理后得到一张二值图:可能属于目标的像素为白色,其余为黑色。

阈值不是越严格越好。阈值过高会漏掉远距离或曝光较低的灯条,阈值过低则会把场地灯、反光和屏幕内容一起保留下来。

轮廓与灯条拟合

在二值图上寻找连通区域和轮廓,再使用最小外接矩形、椭圆或直线拟合描述每个候选灯条。常见筛选条件包括:

  • 面积和长度达到最小值;
  • 长宽比符合细长发光条;
  • 倾斜角位于允许范围;
  • 颜色均值接近敌方颜色;
  • 轮廓内部亮度分布合理。

灯条配对

将候选灯条两两组合,根据长度比、角度差、中心高度差、间距与平均长度之比进行筛选。通过配对的两条灯条确定上、下端点和装甲板的四个二维角点。这一节只做灯条与几何配对,不识别数字。

直接看见每一步的结果

传统视觉最适合边写边看。教程提供的可运行示例会同时显示二值图和原图叠加层:橙色矩形是通过轮廓筛选的灯条候选,黄色线表示灯条长轴,绿色四边形和圆点表示两灯条配对得到的四个角点。拖动亮度、颜色差、形态学半径和最小面积滑条,就能立即看到每条规则改变了什么。

示例源码与构建命令在第一个传统视觉识别器练习中。先运行它,再读下面的规则会直观得多。

2. 传统视觉的优点

  • 过程直观:每个中间结果都可以显示出来,漏检和误检容易定位到某条规则;
  • 计算开销小:在分辨率和候选数量受控时,CPU 就可以达到较高帧率;
  • 不依赖训练数据:不需要先收集和标注大量图像;
  • 几何约束明确:输出角点天然来自灯条结构,便于接入 PnP;
  • 适合确定环境:相机曝光、场地光线和目标外观稳定时,效果可以很好。

3. 它为什么会在复杂环境中变得困难

传统视觉的主要问题不是某一个阈值没有调好,而是规则数量会随着环境变化不断增加。

光照和曝光改变像素分布

同一条灯条在室内、室外、逆光、过曝和欠曝画面中的颜色值差异很大。为一种环境调好的阈值,换一块场地后可能同时出现漏检和误检。

背景中存在相似特征

场地灯带、观众屏幕、反光边缘和机器人指示灯都可能形成细长高亮区域。单独看颜色、长度或平行度,它们可能和真实灯条非常相似。

远距离与运动模糊破坏几何结构

目标变小时,灯条只有少量像素;云台快速运动时,灯条会拉长、断裂或粘连。轮廓和最小外接矩形的结果会产生明显抖动,进而影响角点和 PnP。

规则之间相互影响

放宽阈值可以提高召回率,却会带来更多候选和误检;加强几何限制可以减少误检,又会漏掉大角度、部分遮挡的装甲板。最终代码里容易积累大量针对特定场景的参数。

4. 神经网络解决了哪些痛点

神经网络不再只判断单个像素或单条轮廓,而是从较大的感受野中学习目标的整体外观。颜色、灯条形状、数字区域、周围结构和上下文可以共同参与判断,因此它能在一定范围内适应亮度、噪声、背景和姿态变化。

这并不意味着训练一个网络后就不再需要工程工作。模型的稳定性来自覆盖充分的数据、正确的标注、与真实相机一致的预处理,以及针对错误样本持续迭代。几何检查和时间一致性仍然有价值,只是它们从“主要识别器”变成了“输出约束与结果校验”。

在进入神经网络之前,先完成第一个传统视觉识别器练习:使用模拟器取图,亲自规定颜色、亮度与几何规则,并观察阈值在静止和运动目标上的变化。完成练习后,下一节再从神经网络的基本结构开始,解释 YOLO 如何把一张图像变成候选目标、置信度、类别和关键点。

On this page