让我们说:
point1 = [1 2 3 4 5 ; 1 2 3 4 5 ];
point2 = [2 3 4 5 6 ; 2 3 4 5 6 ];
s = findHomography(points1,points2);
Coordinates of an object containing points1 are [0,0; 10,0; 0,10; 10,10]
如何在对象上找到计算透视变换,以便将其转换为我的测试坐标。 opencv中有内置函数可以做到这一点,但是,我真的需要一个简单的例子来清除我的困惑。感谢。
答案 0 :(得分:2)
透视变换不是线性变换。因此,您不能使矩阵M 2x2使得w = M * v(来自第一平面的点v =(x1,y1)并且来自第二平面的点w =(x2,y2))。但是如果使用“齐次坐标”,你可以做到这一点。齐次坐标中的2d点看起来像(x,y,1)。或者在更一般的情况下(x,y,z)等价于(x / z,y / z,1)。如果您考虑如何将三维场景中的点投影到相机的二维传感器,这种符号是有意义的。在齐次坐标矩阵中,M 3x3实际存在,并且w = M * v。所以当你从2d到2d进行透视变换时,你应该期望有3x3矩阵和3xn点。
编辑(回答评论):
xTag = M11 * x1 + M12 * y2 + M13
yTag = M21 * x1 + M22 * y2 + M23
zTag = M31 * x1 + M32 * y2 + M33(M33将始终等于1,因为只有8个自由度)
x2 = xTag / zTag
y2 = yTag / zTag
答案 1 :(得分:1)
您可以使用Peter Kovesi在MATLAB and Octave Functions for Computer Vision and Image Processing网站上找到的homography2d.m
和homoTrans.m
函数来查找单应性并应用转换。