当我们用相机捕捉一张照片时,光线从三维世界中的物体表面反射,穿过镜头系统,最终在传感器平面上形成二维投影。这个看似简单的过程背后,隐藏着一套精密的几何关系。理解图像形成的几何原理,是计算机视觉、摄影测量、机器人导航等领域的基石。
在传统针孔相机模型中,我们可以将镜头简化为一个无限小的孔洞,光线从场景中的物体通过这个孔洞投射到成像平面上。这种理想化模型虽然忽略了实际光学系统的复杂性,却完美揭示了图像形成的核心几何关系。现代数码相机虽然使用复杂的多透镜组,但最终仍然遵循这一基本投影规律。
针孔相机模型是理解图像几何的基础框架。在这个模型中,所有光线都必须通过一个无限小的孔(光学中心)才能到达成像平面。设光学中心为坐标原点O,成像平面位于z = f的位置(f为焦距)。对于空间中的点P(X,Y,Z),其在成像平面上的投影p(x,y)可以通过相似三角形关系得出:
x = f * X / Z
y = f * Y / Z
这个简单的投影方程揭示了三维到二维转换的本质:深度信息Z决定了物体在图像中的缩放比例。当物体远离相机(Z增大)时,其在图像中的投影会变小。
注意:实际相机中,成像平面位于光学中心后方,为计算方便通常使用虚拟成像平面(位于光学中心前方),这样投影坐标不会出现负值。
完整的成像过程涉及多个坐标系的转换:
这些坐标系之间的转换通过外参矩阵(旋转R和平移t)和内参矩阵(焦距f、主点坐标cx,cy、畸变参数等)来描述。一个空间点Pw从世界坐标到像素坐标的完整变换为:
p = K [R|t] Pw
其中K为内参矩阵,[R|t]为外参矩阵。这个方程构成了计算机视觉中相机标定和三维重建的数学基础。
真实相机使用透镜组而非理想针孔,这会引入两类主要畸变:
径向畸变:由透镜曲率导致,表现为图像边缘的"桶形"或"枕形"弯曲
切向畸变:由透镜与成像平面不平行导致,表现为图像局部拉伸
这些畸变可以用多项式模型校正:
x_corrected = x(1 + k1r² + k2r⁴ + k3r⁶) + [2p1xy + p2(r²+2x²)]
y_corrected = y(1 + k1r² + k2r⁴ + k3r⁶) + [p1(r²+2y²) + 2p2xy]
其中k1,k2,k3为径向畸变系数,p1,p2为切向畸变系数,r为点到图像中心的距离。
当同一场景被多个相机或同一相机在不同位置拍摄时,图像间存在严格的几何约束:
对极几何:描述两幅视图间的几何关系,核心是对极约束:
p2^T F p1 = 0
其中F为基础矩阵,p1和p2为对应点在不同图像中的齐次坐标。
三角测量:利用多视角观测计算三维点位置。给定两个相机投影矩阵P1,P2和对应图像点x1,x2,三维点X可通过解以下方程得到:
x1 = P1 X
x2 = P2 X
这些多视图几何关系是立体视觉和运动恢复结构(SfM)技术的理论基础。
相机标定是确定内参和畸变参数的过程,常用棋盘格标定法步骤如下:
OpenCV提供了完整的标定工具链:
python复制import cv2
import numpy as np
# 准备标定板角点坐标
objpoints = [] # 3D点
imgpoints = [] # 2D点
# 检测角点
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)
基于几何模型,我们可以实现多种图像处理:
透视矫正:通过检测平面区域的四个角点,计算单应性矩阵H将倾斜视角转换为正视图
python复制H, _ = cv2.findHomography(src_points, dst_points)
warped = cv2.warpPerspective(image, H, (width, height))
立体校正:使左右视图的行对齐,便于立体匹配
python复制R1, R2, P1, P2, Q, _, _ = cv2.stereoRectify(
cameraMatrix1, distCoeffs1,
cameraMatrix2, distCoeffs2,
imageSize, R, T)
map1x, map1y = cv2.initUndistortRectifyMap(...)
全景拼接:利用特征匹配和单应性矩阵将多幅图像拼接成广角视图
虽然线性几何模型在多数情况下表现良好,但在以下场景需要特别处理:
在实际项目中,我经常遇到标定结果不理想的情况。经过多次实践发现,标定板的覆盖范围至关重要——需要确保标定板出现在图像的各个区域(特别是边缘),同时保持适度的倾斜角度。另外,温度变化会导致镜头焦距微变,高精度应用需要在工作温度下重新标定。