我正在从平面标记开发一个姿势估计系统(使用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也不行,但不幸的是我没有看到或理解我的错误是什么。它必须在像素坐标的使用中,但是看着许多单应性解释并且搜索“单应性估计结果仿射”并没有产生任何结果,如果有人能指出我正确的方向,我会很高兴。
感谢。
答案 0 :(得分:0)
正如我从评论中提供的值@mmpg所看到的那样,我的y轴和x轴仍然被切换为匹配Matlab的图像坐标系(y first,x second),结果证明是问题所在。 我没有想到这样一个根本问题,因为我得到的Homography在很大的角度范围内非常接近正确的。