OpenCV的reprojectImageTo3D返回负米制坐标值是否正确?
reprojectImageTo3D返回负值与米制测量失效问题解答 返回负值是否正常
属于函数坐标系定义下的正常现象,不是计算bug:
- OpenCV立体视觉模块默认以左相机光心为三维坐标原点,X轴正方向指向图像右侧。当场景点位于光心左侧时,计算得到的X坐标自然为负,该值的正负仅代表点相对于光心的左右方位。
- 该函数默认Z轴正方向指向相机后方,相机前方所有真实场景点计算出的Z值均为负值,是固定的坐标系约定。
无法获取正确米制测量结果的常见错误
如果调整坐标系方向后测量值仍不符合米制真值,基本是以下环节操作有误:
- 重投影矩阵Q的尺度不匹配
reprojectImageTo3D输出坐标的单位和Q矩阵中基线参数的单位完全一致。如果双目标定阶段输入的棋盘格格距是毫米单位,stereoCalibrate返回的平移向量中基线长度单位就是毫米,直接传入生成Q矩阵的话,输出点云单位为毫米,需除以1000才能得到米制坐标。如果标定阶段格距输入错误、或者误将像素单位的参数传入Q矩阵,会直接导致尺度完全错误。 - Q矩阵参数错误
检查stereoRectify生成的Q矩阵是否符合标准结构:
[ 1 0 0 -cx ] [ 0 1 0 -cy ] [ 0 0 0 f ] [ 0 0 -1/Tx (cx - cx')/Tx]
其中f为立体校正后的等效焦距,cx、cy为左相机主点坐标,cx'为右相机主点在左相机坐标系的X轴偏移,Tx为双目基线长度。如果传入stereoRectify的相机内参、畸变系数、双目外参本身标定错误,生成的Q矩阵会直接导致三维坐标计算偏差。
- 视差图逻辑错误
视差的标准定义是左图匹配点X坐标减去右图对应匹配点X坐标(d = x_left - x_right),如果立体匹配阶段搞反左右图顺序,生成的视差值符号颠倒,会导致Z值计算完全错误。 - 未做坐标系对齐
拿到函数返回的点云数组后,首先要将所有点的Z值取反,把Z轴正方向调整为指向相机前方,再代入三维距离公式计算两点间距,否则符号问题会直接干扰计算结果。
内容的提问来源于stack exchange,提问作者Simone Greco
相关产品推荐
相关产品推荐

