OpenCV中triangulatePoints函数输出points4D的单位是什么?
OpenCV triangulatePoints() 输出坐标单位问题
在视觉里程计开发中,使用OpenCV的 triangulatePoints() 函数时遇到了输出单位的疑问,函数定义如下:
void cv::triangulatePoints(InputArray projMatr1, InputArray projMatr2, InputArray projPoints1, InputArray projPoints2, OutputArray points4D )
根据OpenCV文档,points4D 是齐次坐标下的4×N重建点数组,且处于世界坐标系,但未明确单位。以下是针对问题的解析:
1. points4D 的单位是什么?
triangulatePoints() 输出的齐次坐标点单位与输入投影矩阵中的平移向量 t 单位完全一致:
- 若投影矩阵中的
t是真实世界中的米级平移(比如来自已标定的相机位姿),归一化(除以第四个分量w)后的3D点坐标单位就是米; - 若
t是视觉里程计中未做尺度恢复的相对平移(仅保留相对比例),重建点的单位就是该相对缩放的任意单位; - 若使用归一化内参矩阵(
fx=fy=1,对应归一化图像平面),且t为米级单位,重建点同样为米级。
2. 「未传入像素尺寸,重建点单位不可能是米」的判断正确吗?
这个判断并不准确,原因如下:
- 投影矩阵
P = K[R|t]中的内参K包含的fx、fy等参数,本身就是由相机物理焦距和像素尺寸预先计算得到的(例如fx = 物理焦距 / 像素尺寸,最终单位为像素)。 - 只要投影矩阵中的平移向量
t携带真实尺度(单位为米),三角化的逆投影过程就会自动还原出与t匹配的米级单位3D点,无需额外传入像素尺寸。 - 只有当
t本身缺失真实尺度(比如纯视觉里程计中仅通过特征匹配得到的相对位姿)时,重建点才没有真实米级单位,但这是位姿尺度缺失导致的,和是否传入像素尺寸无关。
关于投影矩阵参数的补充
你提到的「投影矩阵主要包含 fx、fy 等参数,不包含像素尺寸」是正确的——像素尺寸是计算内参的前置参数,一旦内参确定并写入投影矩阵,函数就不需要再单独传入像素尺寸。
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

