OpenCV立体视觉3D坐标到2D相机平面投影不同于将2D点三角化到3D
OpenCV stereo vision 3D coordinates to 2D camera-plane projection different than triangulating 2D points to 3D
我使用特征匹配在立体相机的左相机中获得一个图像点(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
是错误的吗?
注:
- 所有的图像都被重新映射,我在一种预处理步骤中这样做
- 当然,我总是使用齐次坐标
您可能正在投影到校正后的相机中。需要应用整流扭曲的倒数来获得原始(未失真)线性相机坐标中的点,然后应用失真来获得原始图像。
相关文章:
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- 根据组件 1、2(和 3)对空间 (2D/3D) 向量进行排序
- 删除使用 new 创建的 2D 或 3D 指针
- 将 3D 变换转换为 2D
- CUDA,使用2D和3D阵列
- 用于将笛卡尔 (x,y,z) 转换为圆柱坐标 (ρ,θ,z) 坐标 2D/3D 的代码
- 从 C++ 中的 3D 矩阵中提取 2D 矩阵
- 使用 pcl 或 opencv 在 2D 场景中匹配 3D 模型
- 将 2D 图像坐标转换为 z = 0 的 3D 世界坐标
- 将每个对象渲染到空间中,并在3D场景上渲染2D场景
- 使用 2D 数据创建 3D 直方图(OpenCV?
- 使用 OpenCV 在 3D 矩阵中导入 2D 矩阵
- 将 2D 屏幕坐标转换为 3D 世界坐标
- OpenCV从2D像素获取3D坐标
- 使用cuda的平行尺寸降低(3d至2d)
- 数据结构2d/3d瓦片数组C++
- 标准化 2D/3D 矢量/坐标类
- 2d(3d)坐标的哈希映射(即双精度向量)
- 找出4个非共面点的2D-3D对应关系