4. 无人机视觉传感器与相机标定

在无人机视觉AI部署中,传感器选型与相机标定是决定后续算法上限的“地基”。Jetson平台算力再强,如果图像源头选错或标定不准,检测、测距、避障都会出现系统性偏差。本章围绕RGB相机、深度相机、红外相机的选型逻辑,以及内参标定、畸变校正与图像采集流程展开,帮助你把“看得见”变成“看得准”。

一、三类相机的核心差异与选型依据

无人机上常见的视觉传感器可分为三类:RGB相机负责纹理与颜色,是目标检测、语义分割的主力;深度相机(结构光、双目、ToF)直接输出距离信息,适合避障、三维重建与降落引导;红外相机(热成像)感知温度分布,用于夜间搜救、电力巡检与火点识别。选型时不能只看分辨率,而要同时考虑帧率、视场角、重量、功耗、接口带宽以及与Jetson的对接方式。

RGB相机通常通过MIPI CSI-2或USB接入Jetson,CSI带宽高、延迟低,适合高帧率推理;USB相机部署简单,但受总线带宽限制。深度相机中,双目依赖纹理,弱纹理场景易失效;结构光在强光下受干扰;ToF在远距离精度下降。红外相机分辨率普遍偏低,但温度灵敏度是关键指标。选型本质是“任务需求—环境约束—平台接口”三者的匹配。

无人机视觉传感器选型 → 标定 → 采集 全链路 RGB 相机 • 纹理/颜色,检测分割主力 • CSI-2 / USB 接入 Jetson • 关注:分辨率、帧率、FOV • 典型:IMX219 / IMX477 深度相机 • 直接输出距离,避障/重建 • 结构光 / 双目 / ToF • 关注:量程、精度、抗光性 • 典型:RealSense D435i 红外相机 • 温度分布,夜间/巡检 • 热成像,分辨率偏低 • 关注:NETD、测温范围 • 典型:FLIR Lepton / Boson 内参标定 + 畸变校正 棋盘格/圆点靶标 → 采集多视角 → 求 K、D → 去畸变 → 重投影误差 < 0.3 px 输出:camera_matrix、dist_coeffs、新内参 newCameraMatrix 图像采集流程 触发/连续采集 → 时间戳同步 → 去畸变 → 色彩空间转换 → 送入 TensorRT 推理 关键:曝光锁定、白平衡固定、帧率与推理节拍匹配

二、内参标定的原理与实操

相机内参描述的是像素坐标与相机坐标之间的映射关系,核心是焦距(fx、fy)、主点(cx、cy)以及畸变系数(k1、k2、p1、p2、k3)。标定过程本质是求解这些参数,使三维空间点投影到图像上的位置与实际观测一致。常用方法是张正友标定法:用已知尺寸的棋盘格,从多个角度拍摄,提取角点,通过最小化重投影误差求解内参和畸变系数。

在Jetson上,可以用OpenCV完成标定。典型流程是:采集15~25张不同姿态的棋盘格图像,检测角点,调用cv2.calibrateCamera求解,再用cv2.undistort或cv2.initUndistortRectifyMap做校正。标定质量看重投影误差,一般要求小于0.3像素;若大于0.5像素,说明图像质量差、角点检测不准或姿态覆盖不足。

import cv2, numpy as np, glob

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((6*9, 3), np.float32)
objp[:, :2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2)

objpoints, imgpoints = [], []
for f in glob.glob("calib/*.jpg"):
    img = cv2.imread(f)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ok, corners = cv2.findChessboardCorners(gray, (9, 6), None)
    if ok:
        corners = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)
        objpoints.append(objp)
        imgpoints.append(corners)

ret, K, D, rvecs, tvecs = cv2.calibrateCamera(
    objpoints, imgpoints, gray.shape[::-1], None, None)
print("重投影误差:", ret)
print("内参 K:\n", K)
print("畸变 D:", D.ravel())

三、畸变校正与图像采集流程

无人机常用广角镜头,桶形畸变明显,边缘直线会弯曲。畸变校正分两步:先标定得到畸变系数,再对每帧图像做去畸变。实时场景中,推荐预先计算映射表,用cv2.remap做查找表映射,比每帧调用undistort更快。若使用CSI相机,可借助Jetson的硬件ISP或GStreamer插件完成部分校正,降低CPU占用。

图像采集流程要与推理节拍匹配。建议固定曝光和白平衡,避免自动模式导致帧间亮度跳变;为每帧打上时间戳,便于与IMU、飞控数据融合;采集线程与推理线程分离,用环形缓冲区避免丢帧。对于深度相机,还要注意深度图与RGB图的对齐(align),否则测距会错位。

标定不是一次性的。镜头更换、碰撞、温度大幅变化后都应重新标定。建议把标定参数保存为YAML,在部署时加载,避免每次重启重算。

四、选型对比与常见误区

维度 RGB相机 深度相机 红外相机
主要输出 彩色图像 深度图 + RGB 热成像灰度/伪彩
典型接口 CSI-2 / USB USB / GMSL USB / SPI
强光表现 好 结构光易受干扰 不受可见光影响
弱纹理表现 好 双目易失效 依赖温差
标定重点 内参 + 畸变 内参 + 深度对齐 内参 + 非均匀性
典型任务 检测、分割 避障、重建 搜救、巡检

常见误区有三个:一是只看分辨率不看帧率,导致推理端等图;二是标定用自动曝光,角点亮度不一致,误差偏大;三是深度相机不做RGB对齐,直接把深度值当目标距离,结果偏差几十厘米。复盘时建议记录标定时的温度、镜头型号和重投影误差,形成可追溯的标定档案。

若发现去畸变后图像边缘被裁切,需调整getOptimalNewCameraMatrix的alpha参数:alpha=0保留全部像素但引入黑边,alpha=1裁掉黑边但丢失边缘信息,需按任务权衡。