RGB相机基础:成像原理、色彩空间、相机标定基础
做ToF与RGB融合,说白了就是让两个眼睛看同一个世界。RGB相机就是我们的「左眼」,它负责颜色和纹理。我刚开始做这个方向时,总觉得RGB相机太成熟了,没什么好学的。结果第一次融合点云就出了大问题——颜色全飘了。嗯,从那以后我再也不敢小看RGB相机的基础知识了。
成像原理:光是怎么变成数字的?
RGB相机的核心,就是一个光电转换的过程。光打到传感器上,产生电荷,再转成电压,最后变成数字信号。这个过程,我习惯把它拆成三步:
- 光电转换:CMOS或CCD传感器把光子变成电子
- 模数转换:模拟电压转成数字灰度值
- 色彩还原:通过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相机的基础就这些。成像原理让你知道数据怎么来的,色彩空间让你知道怎么处理颜色,相机标定让你知道相机的位置。这三块搞定了,后面做ToF和RGB的融合,你心里就有底了。