OpenCV立体视觉3D坐标到2D相机平面投影不同于将2D点三角化到3D

OpenCV stereo vision 3D coordinates to 2D camera-plane projection different than triangulating 2D points to 3D

本文关键字:2D 3D 三角 不同于 相机 立体视觉 坐标 OpenCV 平面 投影      更新时间:2023-10-16

我使用特征匹配在立体相机的左相机中获得一个图像点(pointL),在右相机中获得相应的图像点(pointR。这两个摄像头是平行的,并且处于同一"高度"。它们之间只有一个x平移。

我还知道每个相机的投影矩阵(projL,projR),这是我在使用initUndistortRectifyMap校准时得到的。

对于三角测量点,我调用:triangulatePoints(projL, projR, pointL, pointR, pos3D)(文档),其中pos3D是对象的输出3D位置。

现在,我想将3D坐标投影到左侧相机的2D图像

2Dpos=项目L*3dPos

生成的x坐标是正确的。但是y坐标大约错了20个像素。

我该怎么解决这个问题?

编辑:当然,我需要使用齐次坐标,以便将其与投影矩阵(3x4)相乘。因此,我设置:

3dPos[0] = x;
3dPos[1] = y;
3dPos[2] = z;
3dPos[3] = 1;

3dPos[3]设置为1是错误的吗?

注:

  1. 所有的图像都被重新映射,我在一种预处理步骤中这样做
  2. 当然,我总是使用齐次坐标

您可能正在投影到校正后的相机中。需要应用整流扭曲的倒数来获得原始(未失真)线性相机坐标中的点,然后应用失真来获得原始图像。