在OpenCV中计算透视变换

时间:2016-09-21 14:42:52

标签: opencv emgucv

enter image description here
如何获得"点"的位置?从墙角度来看?我知道摄像机视角的x,y,(z)坐标,我知道墙的边缘点 我想计算一下这个点是否位于墙前,并且位于墙的前方(左,右)。 我的想法是计算墙的平面方程,并测试从点到平面的垂直线是否在墙的边界上击中它。
我可以不使用z坐标以某种方式做到这一点(这是非常不准确的),墙和相机之间的角度是可变的。

2 个答案:

答案 0 :(得分:0)

如果您知道墙中心的xc,yc位置,则可以转换新参考系中点的X,Y坐标。

首先,翻译原点。如果摄像机位于坐标(0,0)中,则3D世界中的点(X',Y',Z')的新坐标将

X' = X - xc
Y' = Y - yc
Z' = Z

(假设从您的图像中,墙壁与XY平面正交)

现在你必须围绕你知道的角度的Z轴旋转,并获得最终的坐标X'','',Z''相对于墙的中心。

如果角度为ap aplha,则得出rotational matrix around Z

     cos(alpha) -sin (alpha)    0
R = [sin(alpha) cos(alpha)      0]
         0           0          1

并获得(通过载体moltiplication的矩阵)

(X'', Y'', Z'') = R*(X',Y',Z') 

你必须再次获得Z'' = Z

现在,您可以在墙的中间左侧或右侧定义点,检查是否X'' > 0或X'' < 0(您也可以使用Y'',它取决于您使用的alpha值)

如果这个答案假定你没有的东西(alpha,xc,yc,点的3D坐标)告诉我,我会添加一个方法或策略。

答案 1 :(得分:0)

如果z坐标不重要,您可以忘记它并仅使用x,y。

而不是飞机,你可以在墙壁的2d点上安装一条线。接下来,如您所建议的那样,计算一条线,该线穿过绿点并垂直于墙的直线,并计算墙的直线与垂直线之间的交点。

如果交叉点的x或y坐标位于墙壁限制范围内,

x_wall_min< x< x_wall_max或y_wall_min< y< y_wall_max,

比站在墙前的点。

如果墙壁和相机之间的角度可能会有所不同,那么您必须更好地定义墙壁和墙壁的左侧或右侧。因为从某些角度来看可能并不明显。