2017-03-28 34 views
1

我有4个点值:TopLeft,TopRight,BottomLeft,BottomRight。这些在我的显示器上定义了一个4边形(就像一个扭曲的矩形)。这些都是Tobii注视设备认为的一点我在看着什么时候其实我正在看我的显示器的四个角落。将位置绘制成不规则矩形

此图显示左侧代表我的显示器的位图,以及Tobii设备告诉我的点,当我实际上正在查看屏幕的角落时,我正在查看这些点。 (这是一种表示,不是真实的)。

Example

我想用这四个校准点采取了屏幕的X,Y位置,也就是说,从一个不准确的注视位置并纠正它,以便它被定位为按右边的图像。

+0

相当复杂的主题,https://www.tutorialspoint.com/computer_graphics/2d_transformation.htm虽然我认为像矩形一样简单的形状来旋转而不旋转很容易。 – maraca

+0

您需要**透视**转换,而不是仿射一个。但要定义persp.transform,应该提供四个点对:https://www.cs.cmu.edu/~ph/texfund/texfund.pdf – MBo

+0

@MBo查看第二个点在哪里移动,那不是透视变换,否则该点会向右移动得更多(在扭曲的矩形中绘制对角线以查看中心的位置)。 – m69

回答

3

编辑:编辑问题的新解决方案在最后。

这个问题叫bilinear interpolation
一旦你掌握了这个想法,这将是非常容易的,你会在你的余生中记住它。
在这里发布所有细节将会很长,但我会尝试。

首先我将左边的点命名为(x,y),右边的点号是(X,Y)

(x1,y1),(x1,y2),(x2,y1)(x2,y2)是左矩形上的角点。

其次,让我们分裂的问题分成2双线性插值问题:

  • 想找到X
  • 想找到Ÿ

让我们找他们一一(XY)。

定义:Qxx是四个角落的XY在右侧长方形的价值。

假设我们想要在点(x,y)找到未知函数f的值 。假设我们知道在Q11 =(x1,y1),Q12 =(x1,y2),Q21 =(x2,y1)和Q22 = (x2,y2)四个点处的f的值。

你的问题的f(x,y)是你的问题XY

enter image description here

然后你插值f(x,y1)f(x,y2)要以同样的方式f(x,y)

最后,你会得到XY = f(x,y)

参考:所有图片/公式/文本这里是从维基链接(一些带有修改)复制。

编辑:问题编辑后,它变得非常不同。
新的是相反的,它被称为“逆双线性插值”,这是更难。
欲了解更多信息,请参阅http://www.iquilezles.org/www/articles/ibilinear/ibilinear.htm

+0

我提出了更精确的问题。你的答案是否仍然适用?如果是这样,我会试着了解你在说什么,并将其转换成C#:) –

+0

@Peter Morris不,它不适用了。我编辑了答案来涵盖你的新案例。 – javaLover

+0

你发给我的链接就像一个魅力。非常感谢! –

0

您可以使用6个方程定义唯一的线性变换。必须对齐的3个点提供了这6个方程,因为每对匹配点在x和y中提供了两个方程。

如果你想追求这个,我可以提供矩阵方程,它定义了线性变换的基础上它如何映射三个点。你反转这个矩阵,它将提供线性变换。

但做了这些,转换是完全明确的。您无法控制原始四边形角点的位置。一般来说,你甚至不能定义一个线性变换来将一个四边形映射到另一个上;这给出了只有6个未知数的8个方程(每个角2个)。其过度指定。实际上,线性变换必须总是将矩形映射为平行四边形,因此通常不能定义将一个四边形映射到另一个的线性变换。

所以,如果它不能是一个线性变换,它可以是一个非线性变换?嗯,是的,但非线性变换不一定会将直线映射为直线,因此四边形的映射边不会是直的。或任何其他线路。而且你仍然有14个方程(每个点和角都有2个方程),你必须发明一些非线性变换和14个未知数。

因此,所述的问题不能用线性变换求解;其超过指定。使用非线性变换将要求您设计一个具有14个自由变量的非线性变换(与线性变换中的6个变量相比),这将正确映射7个点,但直线将不再是直线。增加这个要求增加了无限多的约束条件(线条中的每一点都有一个约束条件),你甚至不能使用连续函数。

可能有一些解决方案,你正在做什么,你真的想做什么(即底层应用程序的需要),但作为一个数学问题是无法解决的。

让我知道你是否希望矩阵方程根据它如何变换3点来产生线性变换。