RGB相机基础:成像原理、色彩空间、相机标定基础

做ToF与RGB融合,说白了就是让两个眼睛看同一个世界。RGB相机就是我们的「左眼」,它负责颜色和纹理。我刚开始做这个方向时,总觉得RGB相机太成熟了,没什么好学的。结果第一次融合点云就出了大问题——颜色全飘了。嗯,从那以后我再也不敢小看RGB相机的基础知识了。

成像原理:光是怎么变成数字的?

RGB相机的核心,就是一个光电转换的过程。光打到传感器上,产生电荷,再转成电压,最后变成数字信号。这个过程,我习惯把它拆成三步:

  1. 光电转换:CMOS或CCD传感器把光子变成电子
  2. 模数转换:模拟电压转成数字灰度值
  3. 色彩还原:通过Bayer阵列插值出RGB三通道

你想想看,每个像素其实只感知一种颜色(红、绿或蓝),其他两种颜色是靠周围像素猜出来的。这就是Bayer阵列的玩法。我在项目中遇到过一个问题:如果场景里有细条纹,插值出来的颜色会出摩尔纹。后来我加了低通滤波才解决。

关键参数:分辨率、帧率、像元尺寸、动态范围。这四个参数直接影响融合效果。比如像元尺寸太大,深度图的分辨率就浪费了;太小,弱光下噪点爆炸。

色彩空间:RGB不是唯一的选择

RGB只是最常用的色彩空间,但绝对不是万能的。我做过一个项目,在RGB空间做颜色分割,效果惨不忍睹。后来换成HSV空间,一下子就清晰了。为什么会这样?因为RGB的三个通道高度相关,而HSV把色调、饱和度、亮度分开了。

常用的色彩空间有这些:

色彩空间 特点 适用场景
RGB 三通道线性相关,硬件友好 显示、存储、相机原始数据
HSV 色调/饱和度/亮度分离 颜色分割、目标检测
YUV 亮度与色度分离 视频压缩、传输
Lab 感知均匀,与设备无关 颜色匹配、图像质量评估

我个人习惯在做ToF与RGB融合时,先把RGB转到YUV空间。因为深度图本身是亮度相关的,在Y通道上做对齐,比在RGB上做要稳定得多。避坑指南:我曾经在Lab空间做颜色校正,结果发现不同相机的Lab转换矩阵不一样,折腾了两天才找到原因。

相机标定基础:让相机知道自己的位置

相机标定,说白了就是让相机知道「我在哪,我在看哪」。没有标定,RGB和ToF的像素就是各说各话。我见过太多人直接拿两个相机的原始数据做融合,结果点云全是重影。

标定的核心是求解两个矩阵:

  • 内参矩阵:焦距、主点坐标、畸变系数。描述相机本身的特性。
  • 外参矩阵:旋转矩阵R、平移向量t。描述相机在世界坐标系中的位姿。

常用的标定方法是张正友标定法。你只需要打印一张棋盘格,拍十几张不同角度的照片,就能算出内参和畸变。代码实现其实很简单:

import cv2
import numpy as np

# 准备棋盘格角点坐标
objp = np.zeros((6*9, 3), np.float32)
objp[:,:2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2)

# 存储所有图片的角点
objpoints = []  # 世界坐标系
imgpoints = []  # 图像坐标系

# 遍历图片,找角点
for fname in images:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, corners = cv2.findChessboardCorners(gray, (9, 6), None)
    if ret:
        objpoints.append(objp)
        imgpoints.append(corners)

# 标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(
    objpoints, imgpoints, gray.shape[::-1], None, None
)

这段代码我用了不下百次。注意一点:棋盘格一定要平整,我见过有人用打印纸贴在弯曲的纸箱上,标定出来的内参全是错的。避坑指南:我曾经在户外标定,风把棋盘格吹动了,结果标定结果一直收敛不了。后来我改用玻璃板加背胶,稳得很。

小技巧:标定完成后,一定要做重投影误差检查。一般误差小于0.5像素就算合格。如果大于1像素,说明标定图片质量有问题,重新拍吧。

本章知识体系

下面这张图是我自己画的,把RGB相机的基础知识串起来了。你跟着这个逻辑走,就不会乱。

RGB相机基础知识体系 成像原理 色彩空间 相机标定 光电转换 → 模数转换 → 色彩还原 Bayer阵列 + 插值算法 RGB / HSV / YUV / Lab 颜色分割 / 融合 / 压缩 内参矩阵 + 外参矩阵 张正友标定法 + 畸变校正 ToF与RGB融合的基础

注意:标定不是一次性的。相机如果被磕碰、温度变化大、或者镜头松动,内参都会变。我建议每次项目开始前都重新标定一次,花不了十分钟,但能省下后面几天的调试时间。

好了,RGB相机的基础就这些。成像原理让你知道数据怎么来的,色彩空间让你知道怎么处理颜色,相机标定让你知道相机的位置。这三块搞定了,后面做ToF和RGB的融合,你心里就有底了。

专注资料整理