我正在开发一个基于平面标记的姿态估计系统(使用 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
[Edit:它们都按逆时针顺序排序,所以我确保它们匹配。]
然后我绘制这些参考点的重投影
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也不能,但不幸的是我没有看到或不明白我的错误是什么。它一定是在像素坐标的使用中,但由于查看了许多单应性解释并搜索“单应性估计结果仿射”没有产生任何结果,如果有人能指出我正确的方向,我会非常高兴。
Thanks.