我正在使用平面标记(使用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第二个),这确实是问题所在。
我没有想到这样一个根本性的问题,因为我得到的单应性在很大的角度范围内都非常接近正确的问题。

09-18 03:39