针孔相机模型与投影

核心03-相机与三维几何预计 30 分钟相机模型投影内参矩阵齐次坐标

前置知识点

kp-001 图像的数字化表示与色彩空间 kp-004 几何变换与图像插值

一句话定义

针孔相机模型把三维点经「外参(世界到相机)」与「内参(相机到像素)」两级矩阵映射到图像像素坐标,是三维几何与二维图像之间最基本的换算关系。

为什么重要

从 AR 贴图、机器人抓取到 SLAM 定位,任何「知道 3D 想推 2D」或「知道 2D 想反推 3D」的问题都以投影方程为出发点;读不懂内参矩阵,标定、对极几何、位姿估计全部无从谈起。

直观类比

相机是暗箱:墙上开一个小孔,外界景物在小孔对面的平面上倒立成像;内参矩阵是「这面墙离孔多远、像素格有多大、光轴打在墙上哪里」的说明书,外参矩阵回答「这个箱子摆在相机的哪个方向、多远」。

前置知识

kp-001(像素坐标);kp-004(齐次坐标与矩阵形式);库外三维旋转矩阵与叉积。

核心概念

原理与机制

小孔成像中,像点位置只由「点相对于光轴的方向」决定:相机坐标系下点 P=(X, Y, Z) 在归一化平面上落点 (X/Z, Y/Z),再经焦距放大并平移主点得到像素坐标。合并写成两级矩阵相乘的形式后,外参负责「把场景搬进相机」,内参负责「在相机里落成像素」。投影是非线性的(除以深度),但用齐次坐标可写成线性矩阵乘法——这是多视几何把一切写成线性代数的关键技巧。深度 Z 在投影中被约去,因此单个针孔图像无法恢复绝对尺度:同一方向、距离加倍的物体成像完全相同。

公式与模型

s · [ u, v, 1 ]ᵀ = K · [ R | t ] · [ X, Y, Z, 1 ]ᵀ K = [ fx γ cx ] fx = f / dx(f 焦距毫米,dx 像元尺寸) [ 0 fy cy ] [ 0 0 1 ]

归一化坐标:x_n = X/Z, y_n = Y/Z;像素:u = fx·x_n + cx, v = fy·y_n + cy。倾斜因子 γ 现代工艺下近似为 0。

图示

3D 点 P=(X, Y, Z) 光心 成像平面 像素 u = fx·(X/Z) + cx 深度 Z 被约去 → 单目无绝对尺度

实例与案例

AR 贴图:知道桌面四个角点的世界坐标(IMU + 平面检测给出),用已知 K 与位姿投影回图像,就能把虚拟物体「钉」在桌面上。机器人抓取:标定 K 后,由深度相机的 3D 点反投影 X = (u−cx)·Z/fx 得到相机系坐标,再经外参转到机械臂基座。鱼眼与广角镜头先按针孔建模再叠畸变修正,是标定与 SLAM 的通用套路。

import cv2, numpy as np
K = np.array([[800, 0, 320], [0, 800, 240], [0, 0, 1]], dtype=float)
pts3d = np.array([[0.5, 0.2, 3.0]])
imgpts, _ = cv2.projectPoints(pts3d, rvec=np.zeros(3), tvec=np.zeros(3), cameraMatrix=K, distCoeffs=None)

常见误区

与其他知识点的关系

K 是 kp-011 标定要估计的对象;K 联系归一化坐标与像素坐标,正是 kp-012 中本质矩阵与基本矩阵换算的桥梁;kp-013 立体深度公式 Z = fB/d 直接复用本站符号。

自测题

  1. 为什么投影方程要写成齐次坐标形式?

答案要点:把「除以深度」的非线性操作吸收进齐次缩放,整条链路成为线性矩阵乘法,便于推导与最小化。

  1. 内参里 fx 与 fy 为什么允许不同?

答案要点:像元横向与纵向尺寸可能不等(制造工艺或采样非方格),两方向像素级焦距随之不同。

  1. 单目看到一辆车成像高度增加一倍,能断定它更近吗?

答案要点:能断定方向不变时深度减半,但绝对深度无法由单帧确定;若尺寸未知则连相对深度也不可辨。

延伸阅读

相关知识点

kp-011 相机标定与畸变kp-004 几何变换与图像插值