OpenCV 到 OpenGL 坐标系转换

9

我有两个右手坐标系。

OpenCV enter image description here

如您所见,黑色箭头表示相机朝着正 $Z$ 轴拍摄。您可以忽略图表中的其余部分。

OpenGL

enter image description here

虽然在此处不可见,但 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坐标系中没有任何显示。


1
根据您的图表,您的答案是正确的,它应该改变3D点的Y和Z分量的符号...您能详细说明一下“什么都不做”的部分吗? - api55
输入点的来源是什么?它可能不在OpenCV坐标系统中吗?为了检查您的转换是否至少执行了应该执行的操作,请尝试将其应用于单位向量(例如[0,1,0])以查看它们是否被旋转。另一种双重检查方法是使用OpenCV viz来调试/可视化变换前后的点。 - api55
1
@api55 提供的截图来自OpenCV的网站。我正在使用solvePnP从描述3D对象的“对象点”和它在屏幕上出现的“图像点”计算旋转和平移向量。绘制单位向量似乎是一个好主意。 - Carpetfizz
1
请记住,除了轴变换之外,opencv和opengl中的矩阵是不同的:第一个是行主序,第二个是列主序。如果您正在处理转换矩阵,则可能会出现问题来源。 - TFreitas
是的,我在将最终矩阵提供给OpenGL之前对其进行了转置。 - Carpetfizz
显示剩余2条评论
1个回答

9
OpenCV的相机坐标系为X向右,Y向下,Z向前。而OpenGL的相机坐标系为X向右,Y向上,Z向内两个坐标系 使用solvePnP作为最常用的示例之一。您将获得一个3x3的旋转矩阵R和一个1x3的平移向量T,并使用RT创建一个4x4的视图矩阵M。只需反转M的第二行和第三行,即可获得OpenGL渲染的视图矩阵。 两个视图矩阵

1
这是一个很好的答案,帮助了我,但它缺少了一个事实,即OpenGL与OpenCV在矩阵表示法上使用不同的符号。由于OpenGL使用列主序系统,它会将第一列读取为第一行。因此,在使用它之前,我们需要转置“OpenGL视图矩阵”。 - Slayahh
@Slayahh 感谢你提供的补充,行列转换是矩阵中的一个重要点。 - Summer Sun
如何将OpenGL相机坐标转换为OpenCV格式? 我从ARCore相机姿态中获得了OpenGL坐标,现在想将其转换为OpenCV格式。 - Kiran George

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接