C++ 在二维图像上绘制欧拉角旋转模型

C++ 在二维图像上绘制欧拉角旋转模型,c++,opencv,euler-angles,C++,Opencv,Euler Angles,我目前正在尝试在二维图像中绘制欧拉角度的三维表示(没有opengl或三维图形窗口)。图像输出可以类似于以下内容 本质上,我正在寻找一种研究或算法,它可以获取一个旋转矩阵或一组欧拉角,然后将它们输出到2d图像上,如上图所示。这将在使用OpenCV的C++应用程序中实现。它将用于根据对象的状态在OpenCV窗口上输出注释信息 我想我考虑得太多了,因为我应该能够从旋转矩阵中分解单位向量,然后提取它们的x,y分量,并在笛卡尔空间中从(0,0)中画一条线。我的想法正确吗 编辑:我正在寻找正交投影。您可以

我目前正在尝试在二维图像中绘制欧拉角度的三维表示(没有opengl或三维图形窗口)。图像输出可以类似于以下内容

本质上,我正在寻找一种研究或算法,它可以获取一个旋转矩阵或一组欧拉角,然后将它们输出到2d图像上,如上图所示。这将在使用OpenCV的C++应用程序中实现。它将用于根据对象的状态在OpenCV窗口上输出注释信息

我想我考虑得太多了,因为我应该能够从旋转矩阵中分解单位向量,然后提取它们的x,y分量,并在笛卡尔空间中从(0,0)中画一条线。我的想法正确吗

编辑:我正在寻找正交投影。您可以假设上面的图像具有正确的相机/视角

任何帮助都将不胜感激

谢谢

编辑:示例源代码现在可以在my repo中找到。 标题:

类别定义:

这不是最好的代码,但它很有效,并显示了获得公认答案中描述的投影矩阵所需的步骤


这里还有一个youtube视频,显示了正在运行的投影矩阵(以及添加的缩放和平移):

旋转矩阵将很容易显示

旋转矩阵可以通过使用法线、副法线和切线来构造

您应该能够按如下方式将它们取回:-

Bi-Normal (y') : matrix[0][0], matrix[0][1], matrix[0][2]
Normal    (z') : matrix[1][0], matrix[1][1], matrix[1][2]
Tangent   (x') : matrix[2][0], matrix[2][1], matrix[2][2]
使用透视变换可以添加透视(x,y)=(x/z,y/z)

要获得与所示类似的正交项目,您需要乘以另一个固定旋转矩阵以移动到“摄影机”视图(右45°,然后向上)

然后可以将端点x(1,0,0)、y(0,1,0)、z(0,0,1)和中心(0,0,0)乘以最终矩阵,仅使用x,y坐标

中心应始终变换为0,0,0


然后,您可以缩放这些值以绘制二维画布。

这是我的两分钱。希望能有帮助

如果我理解正确,您希望旋转三维坐标系,然后将其正交投影到给定的二维平面上(二维平面是相对于原始未旋转的三维坐标系定义的)

“旋转和投影三维坐标系”是“旋转三个三维基向量并将其正交投影到二维平面上,使其成为相对于平面二维基的二维向量”。让原始3D向量未加底漆,并对生成的2D向量加底漆。设{e1,e2,e3}={e1..3}为三维正交基(已给出),{e1',e2'}={e1..2'}为二维正交基(必须定义)。本质上,我们需要找到这样的操作符PR,它PR*v=v'

虽然我们可以谈论很多关于线性代数、算子和矩阵表示的内容,但这篇文章太长了。我只想说:

  • 对于3D旋转和3D->2D投影操作符,都有实矩阵表示(线性变换;2D是3D的子空间)
  • 这是两种相应的变换,即PR*v=P*R*v=v',因此我们需要找到旋转矩阵R和投影矩阵P。显然,在我们使用R旋转v之后,我们可以使用P投影结果向量vR
  • 已经有旋转矩阵<强> r< /强>,所以我们认为它是一个给定的3x3矩阵。为了简单起见,我们将讨论投影向量vR=R*v
  • 投影矩阵P是一个2x3矩阵,第i列是第i个3D基向量ei{e1..2'}基上的投影
  • 让我们发现,在二维平面上,投影矩阵(如三维向量)在正交基上被线性变换为二维向量v'{e1..2'}

    二维平面可以很容易地由垂直于它的向量定义。例如,从OP中的图中,我们的2D平面(纸张平面)似乎有法向单位向量n=1/sqrt(3)*(1,1,1)。我们需要在这个n定义的2D平面中找到一个2D基。因为在我们的2D平面上的任何两个线性独立的向量都会形成这样的基,这里有无限个这样的基。从问题的几何学出发,为了简单起见,让我们附加两个条件:第一,基础应该是正交的;第二,应该在视觉上具有吸引力(尽管这在某种程度上是一种主观条件)。可以很容易地看到,通过设置e1'=(1,0)'=x'-轴(水平,从左到右的正方向)和e2'=(0,1)'=y'-轴(垂直,从下到上的正方向),在带素数的系统中很容易形成这样的基础

    现在让我们在{e1..3}3D基础中找到这个{e1',e2'}2D基础

  • 让我们在原始基础中将e1'e2'表示为e1“e2”。注意到在我们的例子中,e1“没有e3-分量(z-分量),并且使用n点e1”=0的事实,我们得到e1'=(1,0)->e1“=(-1/sqrt(2),1/sqrt(2),0){e1..3}基础上。这里,dot表示点积
  • 然后,e2“=n交叉e1”=(-1/sqrt(6),-1/sqrt(6),2/sqrt(6))。这里,cross表示交叉积
  • n=1/sqrt(3)*(1,1,1)定义的2D平面的2x3投影矩阵p,由以下公式给出:

    ( -1/sqrt(2)    1/sqrt(2)        0     )
    ( -1/sqrt(6)   -1/sqrt(6)    2/sqrt(6) )
    
    其中第一列、第二列和第三列被转换{