2、视觉基础:图像采集、颜色空间、分辨率、帧率、摄像头标定与畸变校正基础
旭日机器人视觉系统的第一课,不是算法,而是“看得清、看得准”。图像采集、颜色空间、分辨率、帧率、摄像头标定与畸变校正,构成了机器人感知世界的底层物理与数学基础。如果这些基础不牢,后续的目标识别、跟随和运动控制接口都会建立在“失真”的数据之上。本章将系统梳理从光信号到数字图像、再到几何校正的完整链路,帮助你在工程实践中建立正确的视觉数据观。
2.1 图像采集:从光信号到数字矩阵
图像采集是视觉系统的“感官入口”。旭日机器人通常搭载USB摄像头或MIPI接口的CMOS传感器。光线通过镜头聚焦到感光元件上,每个像素点将光强度转换为电荷量,再经过模数转换(ADC)输出为数字值。这一过程涉及三个关键控制参数:曝光时间(决定进光量)、增益(放大信号强度)、白平衡(校正色温偏差)。
在实际工程中,采集环节最常见的错误是“自动参数陷阱”。例如,当机器人从室内移动到室外时,自动曝光会让画面突然过亮或过暗,导致后续的目标识别算法失效。因此,在固定光照环境下,建议手动锁定曝光和增益;在动态光照下,应使用带防抖动的自动曝光策略,并限制增益上限以避免噪声放大。
v4l2-ctl --set-fmt-video=width=640,height=480,pixelformat=YUYV 设置格式,并用 v4l2-ctl --stream-mmap --stream-count=100 测试实际帧率是否达标。
2.2 颜色空间:机器人如何“看懂”颜色
颜色空间是颜色信息的数学表达方式。旭日机器人视觉中最常用的三种颜色空间为:RGB(面向显示设备)、HSV(面向颜色分割)、YUV(面向视频传输与压缩)。RGB空间对光照变化极其敏感,同一物体在不同亮度下RGB值差异巨大;而HSV将色调(H)、饱和度(S)、明度(V)分离,使得颜色识别对光照鲁棒性更强。
例如,识别红色目标时,在RGB空间需要同时判断R>200且G<100且B<100,阈值难以设定;而在HSV空间,只需设定H在0~10°或170~180°范围内,S>0.4,V>0.3即可稳定提取。YUV空间则常用于视频流处理,Y分量代表亮度,UV代表色度,便于在低带宽下保持颜色信息。
| 颜色空间 | 分量含义 | 适用场景 | 光照敏感性 |
|---|---|---|---|
| RGB | 红/绿/蓝三通道 | 显示、图像保存 | 高 |
| HSV | 色调/饱和度/明度 | 颜色分割、目标识别 | 低(H分量) |
| YUV | 亮度/色度 | 视频传输、压缩编码 | 中 |
| 灰度 | 单通道亮度 | 边缘检测、形状匹配 | 高 |
2.3 分辨率与帧率:精度与实时性的权衡
分辨率决定图像的空间细节,帧率决定时间分辨率。旭日机器人常用的分辨率组合包括:640×480@30FPS(低延迟、适合快速跟随)、1280×720@30FPS(平衡之选)、1920×1080@15FPS(高精度但帧率受限)。选择时需要计算数据带宽:640×480×30×2字节(YUV422)= 18.4MB/s,而1080p@30FPS则高达124MB/s,这对USB带宽和处理器能力都是考验。
在运动控制接口中,帧率直接影响控制环路的稳定性。如果视觉帧率低于控制频率,会导致目标位置更新滞后,产生振荡。一般建议视觉帧率至少是控制频率的2~3倍。例如,若运动控制周期为20ms(50Hz),视觉帧率应不低于100FPS,或采用预测补偿算法。
2.4 摄像头标定与畸变校正
摄像头标定是视觉定位精度的基石。由于镜头制造公差和装配误差,图像会产生两类畸变:径向畸变(桶形/枕形)和切向畸变(镜头与传感器不平行)。标定的核心是求解内参矩阵(焦距fx、fy,主点cx、cy)和畸变系数(k1、k2、p1、p2、k3)。
标准标定流程如下:
- 打印7×9或9×11的棋盘格标定板,方格边长20~30mm,贴在平整硬板上。
- 从不同角度、距离拍摄15~20张标定板图像,覆盖画面中心和边缘。
- 使用OpenCV的
cv2.findChessboardCorners()提取角点,亚像素精细化。 - 调用
cv2.calibrateCamera()计算内参和畸变系数。 - 验证重投影误差,通常应小于0.5像素。
import cv2
import numpy as np
# 准备标定点
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((7*9, 3), np.float32)
objp[:, :2] = np.mgrid[0:9, 0:7].T.reshape(-1, 2) * 25.0 # 25mm方格
obj_points = [] # 世界坐标
img_points = [] # 像素坐标
for fname in glob.glob('calib_images/*.jpg'):
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, (9, 7), None)
if ret:
corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
obj_points.append(objp)
img_points.append(corners2)
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(
obj_points, img_points, gray.shape[::-1], None, None)
print("内参矩阵:\n", mtx)
print("畸变系数:", dist.ravel())
畸变校正后的图像可以直接用于像素坐标到世界坐标的转换。在旭日机器人中,标定结果通常以YAML文件保存,供后续的视觉伺服和目标定位模块调用。
2.5 案例拆解:移动机器人视觉标定与畸变校正实战
背景与约束:某仓储AGV需要识别地面二维码进行定位,定位精度要求±2cm。AGV搭载俯视摄像头,安装高度1.2m,视场角约60°。初始测试发现,二维码在图像边缘时识别位置偏差达5cm。
初始现象:使用未标定的摄像头直接进行二维码识别,中心区域定位误差约1cm,但边缘区域误差急剧增大至5~8cm,且二维码边缘出现明显的弧形弯曲。
分析判断:这是典型的径向畸变问题。广角镜头在边缘产生桶形畸变,导致像素坐标与实际物理坐标的映射关系非线性。必须进行标定和畸变校正。
操作步骤:
- 制作A3尺寸棋盘格标定板(7×10格,每格30mm),确保覆盖整个视场。
- 在AGV实际工作高度和角度下,拍摄20张不同姿态的标定板图像。
- 使用OpenCV标定,得到fx=820.3, fy=819.7, cx=640.2, cy=359.8,畸变系数k1=-0.352, k2=0.124, p1=0.0012, p2=-0.0008。
- 对每帧图像执行
cv2.undistort()校正,并裁剪掉校正后产生的黑色边缘区域。 - 重新测试二维码识别,边缘区域误差降至1.5cm以内。
结果对比:校正前平均定位误差3.8cm,最大误差8.2cm;校正后平均误差0.9cm,最大误差1.8cm,满足±2cm的精度要求。
风险与代价:畸变校正会损失约8%的有效像素区域(边缘被裁剪),且校正后的插值运算增加了约3ms的处理时间。对于30FPS的系统,总延迟增加约10%,在可接受范围内。
复盘经验:标定不是一次性工作。AGV经过长时间运行后,镜头可能因振动产生微小位移,建议每季度重新标定一次。同时,标定板应使用哑光材质,避免反光导致角点检测失败。
2.6 常见误区与总结复盘
在视觉基础环节,工程师常犯以下错误:
- 误区一:认为分辨率越高越好。高分辨率带来计算量剧增,且对镜头解像力要求更高,有时反而降低识别稳定性。
- 误区二:忽略帧率与运动速度的匹配。当目标在图像中移动速度超过每帧10像素时,会产生运动模糊,需要缩短曝光时间或提高帧率。
- 误区三:标定后不验证。标定结果应通过重投影误差和实际测量双重验证,不能只看重投影误差。
- 误区四:颜色空间选择不当。在HSV中分割颜色时,H分量在0°和180°附近是连续的,红色目标需要特殊处理两个区间。