算法教程 · ALGORITHMS
装甲板识别入门:从像素到目标框
面向视觉组新人的第一篇教程,介绍目标检测的经典流程:预处理、轮廓提取、坐标解算。
视觉组 · 杨佳轩约 2 分钟
#OpenCV#目标检测#入门
写在前面
本文假设你已经会写 Python / C++,并安装了 OpenCV。 如果还没有,先跑一遍官方安装教程再回来。
视觉自瞄的第一步,就是从相机画面里找到敌人的装甲板。 下面我们用最经典的「颜色分割 + 轮廓拟合」路线演示一遍。
1. 图像预处理
正文中的图片直接使用相对路径即可(图片放在与
.md文件同级的images/文件夹中):
拿到一帧图像后,首先把颜色空间从 BGR 转换到 HSV,便于按颜色范围抠出目标。
cv::Mat frame, hsv, mask;
// frame = 从相机读取的一帧
cv::cvtColor(frame, hsv, cv::COLOR_BGR2HSV);
cv::inRange(hsv, cv::Scalar(0, 43, 46), cv::Scalar(10, 255, 255), mask);
2. 提取轮廓
对掩码图做形态学闭运算,再提取轮廓,按面积/宽高比过滤噪声:
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
lights = []
for c in contours:
x, y, w, h = cv2.boundingRect(c)
if w * h < 200: # 过滤太小的噪点
continue
if h / w < 2.5: # 灯条应为竖长条
continue
lights.append((x, y, w, h))
3. 灯条配对与坐标解算
把成对的左右灯条拟合成一个装甲板,再通过 PnP 解出相机坐标系下的 3D 坐标。
| 环节 | 手段 | 目标 |
|---|---|---|
| 预处理 | HSV 阈值 | 分离颜色目标 |
| 特征提取 | 轮廓宽高比/面积 | 过滤灯条候选 |
| 配对 | 角度 + 距离约束 | 组成装甲板 |
| 解算 | PnP (solvePnP) | 得到 3D 位姿 |
4. 下期预告
下一篇我们介绍如何用 KalmanFilter 对解算结果做时序滤波,
让云台在目标被短暂遮挡时依然平滑地”咬住”目标。