findHomography() / 3x3 matrix - 如何从中获取旋转部分?

3
作为调用findHomography()方法的结果,我得到了一个3x3的矩阵mtx[3][3]。该矩阵中包含了mtx[0][2]和mtx[1][2]作为平移部分。但是,如何从这个3x3的矩阵中获取旋转部分呢?
很不幸,我的目标系统使用完全不同的计算方式,因此我不能直接重用这个3x3的矩阵,而必须从中提取旋转部分,这就是我提出这个问题的原因。
3个回答

1

RQDecomp3x3存在一个问题,无法返回除Z轴以外的其他轴上的旋转,因此您只能正确地找到Z轴上的旋转,如果您找到投影矩阵并将其传递给“decomposeProjectionMatrix”,您将获得更好的结果。投影矩阵与单应性矩阵不同,您应该注意这一点。


decomposeProjectionMatrix 在计算一些内容后也会调用 RQDecomp3x3。 - Ela782

1

我自己找到了:OpenCV有一个名为RQDecomp3x3()的函数,可以用来从矩阵中提取变换的部分。


你是如何做到的?这正是我想要做的! - jlarsch
@jlarsch: 最终我为自己实现了它:将findHomography()返回的结果矩阵放入自己的数组中,然后选择Z旋转部分: x.x=mtxin->m[0]; x.y=mtxin->m[4]; x_length=vector2d_length(&x);y.x=mtxin->m[1]; y.y=mtxin->m[5]; y_length=vector2d_length(&y); 如果x_length > y_length,则 { ref.x=1.0; ref.y=0.0; *angleZ =vector2d_angle(&ref,&x); if (x.y< 0) *angleZ*=-1.0; } 否则, { ref.x=0.0; ref.y=1.0; *angleZ =vector2d_angle(&ref,&y); if (y.x>0) angleZ=-1.0; } 结果:angleZ - Elmi

1
通常情况下,您无法将最终的转换矩阵分解为其组成部分。但在某些特定情况下是可能的。例如,如果前面的操作仅为平移,则可以执行arccos(m[0][0])以获取旋转的theta值。

findHomography() 返回一个矩阵,其中包含任何操作(可能还包括一些缩放)。在我的情况下,我将其用于模式识别,我只想找出已识别模式的平移和旋转(围绕Z轴)。可能的其他值(如围绕其他轴的旋转或整个物体的拉伸)仅由于不准确性/计算错误而产生,因此不必考虑最终结果。如果我使用这些附加信息获取整个矩阵,我也会将这些不准确性添加到我的结果中... - Elmi
我正在尝试与原帖相同的内容:仅检测平移和旋转。我尝试了arccos(mtx[0][0]),但是mtx[0][0]>1,所以我无法取arccos。您能否更具体地说明如何从矩阵中提取旋转? - jlarsch

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