我有4个Point值:TopLeft,TopRight,BottomLeft,BottomRight。这些在我的显示器上定义了一个4面形状(如扭曲的矩形)。这些是Tobii注视设备认为我正在看的事实,我实际上正在看我的显示器的四个角落。
此图显示左侧的位图代表我的显示器,以及Tobii设备告诉我的点我正在查看当我实际上正在看屏幕的角落时。 (这是一种表达,而不是真实的。)
我想使用这四个校准点从不准确的注视位置拍摄屏幕X,Y位置并对其进行校正,使其按照右侧图像定位。
答案 0 :(得分:3)
编辑:最后编辑问题的新解决方案。
此问题是致电bilinear interpolation 一旦你掌握了这个想法,它就会很容易,你会在余生中记住它 在这里发布所有细节会很漫长,但我会尝试。
首先,我将左侧的点命名为(x,y)
,将右侧的值命名为(X,Y)
。
让(x1,y1)
,(x1,y2)
,(x2,y1)
,(x2,y2)
成为左边矩形的角点。
其次,让我们将问题分解为2个双线性插值问题:
让我们逐个找到它们(X
或 Y
)。
定义:Qxx
是右方矩形中四角的X
或 Y
的值。
假设我们想要找到未知函数f的值 点(x,y)。假设我们知道f的值 四点Q11 =(x1,y1),Q12 =(x1,y2),Q21 =(x2,y1),Q22 = (x2,y2)。
问题的f(x,y)
在您的问题中为X
或 Y
。
然后以同样的方式将f(x,y1)
和f(x,y2)
插入f(x,y)
。
最后,您将获得X
或 Y
= f(x,y)
参考:此处的所有图片/公式/文字都是从维基链接复制的(有些是经过修改的。)
编辑:问题编辑完成后,变得非常不同 新的相反,它被称为“逆双线性插值”,这是更难的 有关详细信息,请阅读http://www.iquilezles.org/www/articles/ibilinear/ibilinear.htm
答案 1 :(得分:0)
您可以使用6个方程定义唯一的线性变换。必须对齐的3个点提供了这6个方程,因为每对匹配点在x和y中提供了两个方程。
如果你想追求这个,我可以提供矩阵方程,它根据它如何映射三个点来定义线性变换。您反转此矩阵,它将提供线性变换。
但是,完成后,转换已完全指定。您无法控制原始四边形的角点将在何处。通常,您甚至无法定义线性变换以将一个四边形映射到另一个四边形;这给出了8个方程(每个角2个),只有6个未知数。它超指定。实际上,线性变换必须始终将矩形映射到平行四边形,因此通常您无法定义将一个四边形映射到另一个四边形的线性变换。
因此,如果它不能成为线性变换,那么它可以是非线性变换吗?嗯,是的,但是非线性变换不一定将直线映射到直线,因此四边形的映射边缘不会是直的。或任何其他线路。而且你仍然有14个方程式(每个点和角2个),你必须发明一些非线性变换,包含14个未知数。
因此,使用线性变换无法解决所述问题;它超过指定。使用非线性变换将需要设计具有14个自由变量的非线性变换(相对于线性变换中的6),这将正确映射7个点,但直线将不再是直线。添加此要求会增加无限数量的约束(对于行中的每个点都有一个约束),您甚至无法使用连续函数。
对于您正在尝试做的事情(即潜在的应用程序需求),您可能会有一些解决方案,但作为一个数学问题,它是无法解决的。
如果您希望矩阵方程根据它如何转换3个点来生成线性变换,请告诉我。