1. 为什么你的单目摄像头需要“体检”?——标定的核心价值
大家好,我是老张,在3D视觉和智能硬件这行摸爬滚打了十几年。今天想和大家聊聊一个听起来有点“学术”,但实际动手起来却非常有趣、且是3D视觉入门必备的技能——单目摄像头的标定。尤其是其中应用最广、效果最稳的张氏棋盘格法。
你可能会有疑问:我新买的摄像头,插上电脑就能用,拍出来的照片也挺清晰,为什么还要费劲去“标定”它呢?这就像你新买了一台高精度机床,出厂时工程师已经调校过,但如果你想用它加工出微米级精度的零件,就必须在你自己车间的工作环境下,重新进行一次精密的校准。摄像头也一样,标定的本质,就是给你的摄像头做一次全面的“体检”和“校准”,搞清楚它的“内在特性”和“视力缺陷”。
这个“内在特性”,就是相机的内参,它决定了三维空间中的一个点是如何精准地映射到你的二维照片上的。而“视力缺陷”,主要是指镜头带来的畸变,它会让照片边缘的直线变弯。如果你在做视觉测量、SLAM(同步定位与地图构建)、或者AR/VR应用,不进行标定,你的系统就像在用一把刻度不准的尺子去量东西,后续的所有计算都会累积误差,最终结果可能差之千里。
张正友教授在1998年提出的这套方法,之所以成为工业界和学术界的金标准,就是因为它太实用了:你不需要昂贵的精密标定板,只需要一张自己打印的棋盘格图纸;你不需要深奥的数学工具,用OpenCV这样的开源库就能轻松实现。接下来,我就带你一步步拆解这个过程,分享我实战中积累的技巧和踩过的坑,保证你跟着做一遍就能掌握。
2. 理解相机模型:从3D世界到2D像素的旅程
在动手标定之前,我们得先搞明白相机是怎么“看”世界的。这个过程就像一场接力赛,3D世界的坐标要经过几个关键步骤,才能变成你手机里的一个像素点。
2.1 坐标系的“三级跳”
想象一下,你的摄像头装在一个小车上。我们要追踪一个小车前方积木的顶点。
-
第一跳:从“小车坐标系”到“相机坐标系”。积木在小车坐标系里有个位置
(X_w, Y_w, Z_w)。但摄像头有自己的“原点”(通常是镜头的光心)。我们需要知道摄像头相对于小车是怎么安装的——是正着、歪着、还是倒着装的?这个关系由一个旋转矩阵R和一个平移向量t来描述,合起来叫外参。用它们就能把积木的坐标转换到以摄像头光心为原点的坐标系里:P_c = R * P_w + t。外参标定就是确定R和t,它描述了相机在世界中的姿态。 -
第二跳:从“相机坐标系”到“归一化平面”。这是最经典的针孔相机模型在起作用。摄像头前方有一个虚拟的平面,叫做归一化平面,它距离摄像头光心的距离是1个单位(比如1米)。利用相似三角形原理,相机坐标系中的点
(X_c, Y_c, Z_c)会被投影到这个平面上,变成(x, y) = (X_c / Z_c, Y_c / Z_c)。注意,这里除了一下深度Z_c。这意味着,在单目相机中,我们丢失了深度信息! 一个远处的房子和近处的模型,如果它们在照片上看起来一样大,我们就无法直接区分谁远谁近。这是单目视觉的一个根本性限制。 -
第三跳:从“归一化平面”到“像素坐标系”。归一化平面上的坐标
(x, y)单位是米,我们需要把它转换成图像上的像素位置(u, v)。这需要一个线性变换:u = f_x * x + c_x v = f_y * y + c_y这里
f_x,f_y就是相机的焦距(以像素为单位)。为什么有两个?因为图像传感器上每个像素的物理尺寸可能不是完美的正方形,f_x和f_y可以不同。(c_x, c_y)是主点坐标,理论上就是图像的正中心,但实际由于组装偏差,它可能稍微偏离中心。这个变换矩阵就是相机的内参矩阵K:K = [ [f_x, 0, c_x], [0, f_y, c_y], [0, 0, 1] ]
2.2 给镜头戴上“矫正眼镜”:畸变模型
真实的摄像头都有镜头,镜头就会引入畸变,就像哈哈镜一样。主要分两种:
- 径向畸变:由镜头形状导致,表现为“桶形畸变”(图像像鼓起的桶)或“枕形畸变”(图像像凹陷的枕头)。直线会变成曲线,越靠近图像边缘越明显。
- 切向畸变:由镜头和成像平面不平行导致,有点像你把一张照片斜着撕开的感觉。</


1万+

被折叠的 条评论
为什么被折叠?



