当前位置: 首页 > 知识库问答 >
问题:

如何将OpenCV相机旋转矢量转换为OpenGL旋转矢量?

毋举
2023-03-14

我有一个相机旋转矩阵3x3,然后我用罗德里格斯函数从旋转矩阵中得到旋转矢量,但是它给出的结果像RotVec=(0.02,0.32.-0.01),但是OpenGLglRotate函数需要度数。我认为RotVec=(0.02,0.32.-0.01)是归一化的,我应该把每个元素乘以360来得到度数。但是OpenCV和OpenGL之间也有坐标系的差异。我如何在OpenGL坐标系中获得度数的旋转矢量?

共有1个答案

岳彬炳
2023-03-14

OpenCV和OpenGL使用不同的3D坐标系,以及不同的内存矩阵表示法。OpenGL矩阵以列大顺序存储在内存中。例如:

m[0]     m[4]     m[8]     m[12]=tx
m[1]     m[5]     m[9]     m[13]=ty
m[2]     m[6]     m[10]    m[14]=tz
m[3]=0   m[7]=0   m[11]=0  m[15]=1

与正常的OpenCV矩阵相比,这是换位的,后者是按行大顺序排列的。例如:

m[0]     m[1]     m[2]     m[3]=tx
m[4]     m[5]     m[6]     m[7]=ty
m[8]     m[9]     m[10]    m[11]=tz
m[12]=0  m[13]=0  m[14]=0  m[15]=1

因此,您需要跟踪您的矩阵是OpenCV还是OpenGL格式。它们可以通过换位(cv::Mat::t()运算符)进行转换。因此,与其使用Rodrigue()(假设您的旋转矩阵是一个cv::Matx33),您可以将其转换为cv::Matx44,并使用glMultMatrix(xform. t(). val)将其直接与OpenGL MODELVIEW转换连接。(t()创建转置,. val是指向转置的16个浮点数数组的指针。)

如果你这样做,它可能仍然不起作用,因为在用于相机校准的OpenCV 3D坐标系中,X在右边,Y在下面,Z在相机前面。在“正常”的OpenGL坐标系中,X在右边,Y在上面,Z在相机后面(也就是说,只能看到负的Z坐标)。这两个都是右撇子系统,由围绕X的180度旋转相关。所以你可以在OpenGL模型堆栈的底部插入这样的旋转。然后你可以直接将OpenCV 3D坐标传递给OpenGL。

(如果你想使用OpenCV相机校准,例如正确对齐增强现实,那么你还需要使用相机的内部矩阵仔细设置你的投影矩阵。但这是另一个问题...)

但由于实际问题是如何在OpenGL坐标系中获得以度为单位的旋转向量,因此需要:

  • 决定矩阵是OpenGL格式还是OpenCV格式;如果是OpenGL,请转置它

不必考虑坐标系的差异,因为这两个系统都是惯用右手的。结果将在适用于初始矩阵的坐标系中。

 类似资料:
  • 我试图创建一个第一人称相机。我从我的XNA项目中提取了一段代码,并试图将其转换为java(LWJGL)。 如果我移动鼠标,俯仰和偏航会增加/减少。在开始运行我的游戏时,它运行良好,但在一些动作后,我无法向下或向上看。如果我的位置是 性能良好的XNA代码: 所以我发现LWJGL和XNA在旋转矩阵方面有一些不同。 Java: 结果: {1.0 0.0 0.0 0 0.0}{0.0 0.3299931-

  • 可以使用类的方法对图像执行旋转操作。以下是这种方法的语法 - 该方法接受以下参数 - src - 表示此操作的源(输入图像)的对象。 dst - 表示此操作的目标(输出图像)的对象。 rotationMatrix - 表示旋转矩阵的对象。 size - 表示输出图像大小的整数类型变量。 示例 以下程序演示如何旋转图像。 假定以下是上述程序中指定的输入图像:。 执行上面示例代码,得到以下结果 -

  • 我正在使用GLFW在c中创建一个OpenGL应用程序。基于本教程,我成功地创建了类似FPS的摄影机(WASD移动-鼠标移动-俯仰-偏航)。 我使用的相机鼠标移动 这很好,但问题是我的应用程序窗口不是全屏的,所以如果我想旋转鼠标光标,它就会离开窗口,很难控制相机。 是否可以做与glfwSetCursorPosCallback相同的事情,但仅当按下左键时?我希望相机做与现在相同的事情,但仅当我按下左键

  • 问题内容: 我将JComboBox与自定义类对象一起使用,并且equals方法被覆盖,并且非常深入地集成到代码中。 问题是,如果在JComboBox下拉列表中两个对象相等,那么如果选择了一个,则全部选中,并且get selected索引返回-1。 有没有一种方法可以将a强制转换为a ?我试过了 和 其中是的父项,是的扩展项,但它们都不编译。 我需要的只是JComboBox,不要使用重写的equal

  • OpenGL总是围绕(0,0,0)旋转。但是我需要绕着相机旋转。我知道在GL中,没有相机,但是如果我翻译回(0,0,-6.0),它会绕着(0,0,0)旋转,而不是绕着(0,0,-6.0)旋转 所以我的问题是:如何在opengl和c中设置旋转中心 我已经找到了这篇文章:OpenGL围绕一个点旋转相机 显示此解决方案的地方: 旋转函数通常围绕原点旋转。要围绕另一个点P旋转,必须:平移(-P)旋转平移(