从像素到归一化平面:揭秘相机内参的剥离与标准化

张开发
2026/4/15 14:04:21 15 分钟阅读

分享文章

从像素到归一化平面:揭秘相机内参的剥离与标准化
1. 相机成像的本质从三维世界到二维像素第一次接触相机模型时我被这个神奇的过程震撼到了——它竟然能把立体的世界压缩成一张平面照片。后来才发现这背后藏着精妙的数学原理。想象你站在窗前看风景相机成像就像在窗玻璃上描摹外面的世界。不过这个窗玻璃成像平面上有看不见的标尺内参我们需要先理解这些标尺才能还原真实的视角关系。相机内参矩阵就像这个标尺的说明书它包含三个关键信息焦距(fx,fy)相当于你的眼睛到窗玻璃的距离。焦距越长看到的视野越窄望远效果焦距越短视野越宽广角效果主点(u0,v0)相当于窗玻璃正对你视线的中心点。理想情况下它应该在图像正中央但实际相机可能略有偏差轴间倾斜系数通常为0现代相机一般不存在这个问题早期胶片相机可能出现x/y轴不垂直的情况用OpenCV读取相机内参是这样的import numpy as np camera_matrix np.array([ [fx, 0, u0], [0, fy, v0], [0, 0, 1] ])2. 像素坐标的诞生三维到二维的魔法让我们拆解这个转换过程。假设有个无人机在相机前方飞行它的相机坐标系坐标是(Xc,Yc,Zc)。要计算它在照片中的位置(u,v)需要经历三次变形透视收缩物体越远显得越小。数学表现为Xc/Zc和Yc/Zc就像远方的铁轨看起来会交汇焦距缩放用fx和fy把物理尺寸转为像素尺寸。好比用不同倍数的放大镜观察同一物体原点偏移加上主点坐标(u0,v0)因为像素坐标系原点通常在图像左上角而非中心实测一个例子假设某点相机坐标(2,3,6)米相机fxfy800像素主点(320,240)。那么Xc,Yc,Zc 2,3,6 fx,fy 800,800 u0,v0 320,240 u fx * (Xc/Zc) u0 # 800*(2/6)320 ≈ 586.67 v fy * (Yc/Zc) v0 # 800*(3/6)240 640这个计算过程解释了为什么靠近画面边缘的物体会产生拉伸变形——透视投影是非线性的。3. 剥离相机特性获得纯净的几何关系3.1 为什么要做归一化我在做双目视觉项目时踩过坑用两个不同相机拍摄同一场景直接匹配特征点总是不准。后来发现是因为两台相机的内参不同导致相同的空间点在两个图像中的像素位置不成线性关系。归一化就是要消除这种硬件差异好比把不同品牌的温度计读数都换算成标准摄氏度。3.2 分步剥离内参3.2.1 消除主点偏移就像把照片的中心点移到画布正中央xd u - u0 # 586.67-320266.67 yd v - v0 # 640-2404003.2.2 消除焦距影响相当于把图像按焦距比例缩小回标准尺寸x_norm xd / fx # 266.67/800≈0.333 y_norm yd / fy # 400/8000.5现在得到的(0.333, 0.5)就是归一化坐标。神奇的是这个结果恰好等于Xc/Zc 2/6 ≈ 0.333 Yc/Zc 3/6 0.5这说明归一化坐标直接反映了空间点与相机光轴的夹角关系与具体相机参数无关。4. 深度归一化的实战意义4.1 单位深度平面令Zc1时归一化坐标就等于相机坐标系中的X/Y值。这相当于把所有物体都投影到一个假想的单位球面上。在SLAM系统中这种处理能消除不同距离物体的尺度差异保留纯粹的方向信息简化后续的特征匹配4.2 实际应用案例在无人机视觉导航中我常用归一化坐标做障碍物检测检测图像中的障碍物像素区域转换为归一化坐标结合IMU数据估算实际空间位置# 伪代码示例 def detect_obstacle(u, v): x_norm (u - u0) / fx y_norm (v - v0) / fy # 假设已知障碍物高度可估算距离 distance obstacle_height / y_norm return (x_norm * distance, distance)这种处理方式比直接使用像素坐标更稳定即使更换不同焦距的相机算法也不需要重新调参。有个经验之谈当需要处理多相机数据或进行跨设备协作时归一化坐标就是你的通用语言。

更多文章