Computer vision 单应估计->;结果是仿射矩阵?

Computer vision 单应估计->;结果是仿射矩阵?,computer-vision,transformation,projection,homography,Computer Vision,Transformation,Projection,Homography,我正在开发一个基于平面标记的姿态估计系统(使用Matlab)。 为了做到这一点,我在用网络摄像头拍摄的图像中检测一个矩形,得到4个角点的坐标,并计算这些角点在齐次坐标中的单应性,例如 58 46 75 90 M = 67 108 133 89 1 1 1 1 其中第一行为垂直坐标,第二行为水平坐标 我用DLT计算这些点和参考点之间的单应性(使用我在网上找到的几种不同的单应性计算函数,以及Matla

我正在开发一个基于平面标记的姿态估计系统(使用Matlab)。 为了做到这一点,我在用网络摄像头拍摄的图像中检测一个矩形,得到4个角点的坐标,并计算这些角点在齐次坐标中的单应性,例如

     58     46     75     90
 M = 67    108    133     89
      1      1      1      1
其中第一行为垂直坐标,第二行为水平坐标

我用DLT计算这些点和参考点之间的单应性(使用我在网上找到的几种不同的单应性计算函数,以及Matlab的cp2tform,它们都给出相同的结果),因为我知道标记是正方形

     1     1   100   100
 m = 1   100   100     1
     1     1     1     1
[编辑:它们都是按逆时针顺序排序的,因此我确保它们匹配。]

然后绘制这些参考点的重投影图

 m* = H*m
返回到网络摄像头图像,以查看单应性拟合情况

只要我只围绕z轴旋转(即,将其放在网络摄像头前面并手动倾斜)标记(=标记的范数向量),结果就可以了;重新投影的点几乎精确地投影到早期检测到的标记角点上,分解的z轴角度计算得很好

但是,如果我围绕x轴和/或y轴旋转标记,重新投影的点会越来越偏离相当大的距离。然后我意识到,计算出的单应矩阵H几乎是仿射矩阵,例如H=

    0.2339   -0.0967   57.8362
H = 0.1339    0.4714   66.3639
   -0.0010    0.0005    1.0000
(无论我如何倾斜标记,元素h31和h32几乎为零)这可以通过观察重新投影的点来确认,这些点总是看起来像仿射变换的结果,而不是投影变换的结果。毫不奇怪,x轴和y轴的分解角度几乎为零/等于零

很明显,我在网上找到的函数不能都是单应计算错误,Matlab的cp2tform也不能,但不幸的是,我没有看到或理解我的错误是什么。这一定是在使用像素坐标,但由于查看许多单应性解释和搜索“单应性估计结果仿射”没有产生任何结果,如果有人能为我指出正确的方向,我将非常高兴


谢谢。

从评论中提供的@mmpg值可以看出,我的y轴和x轴仍然被切换到与Matlab的图像坐标系相匹配的位置(y第一,x第二),这就是问题所在。
我没有想到这样一个基本的问题,因为我得到的单应在很大的角度范围内非常接近正确的单应。

因为我没有看到,这里有一个虚拟的问题:你是否注意将你获得的角点与你想映射到的角点相匹配?我忘了补充:是的,我注意到了(如果我没有这样做,我想重投影对于z轴旋转不会很好)。按ccw顺序排序并不能保证这一点,除非您通过考虑一个点来旋转,您确信该点将映射到正确的点,并且始终保持对应关系。一旦有了工作单应性,我将执行正交变换,以查看标记的内容并解决歧义,但是这只会有助于确定标记是否倾斜了0°或90°等,而不是其他角度。如果我误解了你的观点,请纠正我。“正交变换”当然是误导性的,我的意思是我使用H_inv进行投影变换,以便在标记处获得正交视图。