【问题标题】:OpenCV to OpenGL coordinate system transformOpenCV 到 OpenGL 坐标系的转换
【发布时间】:2017-06-05 18:13:58
【问题描述】:

我有两个右手坐标系。

OpenCV

正如您在黑色箭头中看到的那样,相机向下看正 $Z$ 轴。您可以忽略图表的其余部分。

OpenGL

虽然在此处不可见,但 OpenGL 中的相机向下看-Z 轴。我想将 OpenCV 坐标系中相机前方的 3D 点转换为 OpenGL 中相机前方的 3D 点。

我试图在一个 4x4 矩阵中表示它,该矩阵将 RT 与底部的 0001 连接起来。

到目前为止,我已经尝试过了

1  0  0  0
0 -1  0  0
0  0  -1 0
0  0  0  1

但它似乎什么也没做,OpenGL坐标系中什么也没有显示。

【问题讨论】:

  • 根据你的图表,你的答案是正确的,它应该改变 3D 点的 Y 和 Z 分量的符号...你能详细说明什么都不做的部分吗?
  • 该点似乎仍然在 OpenGL 相机后面渲染,而不是 Z 组件被翻转
  • 输入点的来源是什么?会不会不在 OpenCV 坐标系中?要检查您的转换是否至少在做预期的事情,请尝试将其应用于单位向量(例如[0,1,0])以查看它们是否被旋转。另一种仔细检查的方法是使用 OpenCV viz 调试/可视化转换前后的点
  • @api55 提供的屏幕截图取自 OpenCV 的网站。我正在使用solvePnP从一些描述3D对象的“对象点”和它出现在屏幕上的“图像点”计算旋转和平移向量。绘制单位向量似乎是个好主意
  • 请记住,除了轴转换之外,opencv 和 opengl 中的矩阵是不同的:第一个是行主要顺序,第二个是列主要顺序。如果您正在处理转换矩阵,这可能是问题的根源

标签: opencv opengl-es opengl-es-2.0 linear-algebra augmented-reality


【解决方案1】:

OpenCV 的相机坐标向右,Y 向下,Z 向前。而 OpenGL 的相机坐标是X 向右,Y 向上,Z 向内

使用solvePnP 作为最常用的示例之一。 你得到一个 3x3 的旋转矩阵 R 和一个 1x3 的平移向量 T,并用 RT 创建一个 4x4 的视图矩阵 M。只需反转 M 的第 2 行和第 3 行,您将获得用于 OpenGL 渲染的视图矩阵。

【讨论】:

  • 这是一个很好的答案,对我有所帮助,但它缺乏一个事实,即 OpenGL 与 OpenCV 相比,它的矩阵使用不同的表示法。由于 OpenGL 使用列优先系统,它将读取第一列,就好像它是第一行一样。正因为如此,我们需要在使用之前对“OpenGL 视图矩阵”进行转置。
猜你喜欢
  • 1970-01-01
  • 2011-11-21
  • 2013-08-11
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多