Matrix 正方形到梯形

Matrix 正方形到梯形,matrix,transform,linear-algebra,projection,perspective,Matrix,Transform,Linear Algebra,Projection,Perspective,我知道将正方形转换为梯形是一种线性转换,可以使用投影矩阵来完成,但是我在理解如何构造矩阵时遇到了一些困难 使用投影矩阵进行平移、缩放、旋转和剪切非常简单。是否有一个简单的投影矩阵可以将正方形转换为梯形?a、b、c、d是二维正方形的四个角 a、 b、c、d用齐次坐标表示,因此它们是3x1矩阵 alpha、beta、gamma和delta是二维梯形的四个角 alpha、beta、gamma、delta以齐次坐标表示,因此它们是3x1矩阵 H是您正在寻找的3x3矩阵,它也称为单应矩阵 h1 h

我知道将正方形转换为梯形是一种线性转换,可以使用投影矩阵来完成,但是我在理解如何构造矩阵时遇到了一些困难


使用投影矩阵进行平移、缩放、旋转和剪切非常简单。是否有一个简单的投影矩阵可以将正方形转换为梯形?

a、b、c、d是二维正方形的四个角

a、 b、c、d用齐次坐标表示,因此它们是3x1矩阵

alpha、beta、gamma和delta是二维梯形的四个角

alpha、beta、gamma、delta以齐次坐标表示,因此它们是3x1矩阵

H是您正在寻找的3x3矩阵,它也称为单应矩阵

    h1 h2 h3
H = h4 h5 h6
    h7 h8 h9
H把a,b,c,d映射成α,β,γ,δ,所以你有以下四个方程

alpha=H*a
beta=H*b
gamma=H*c
delta=H*d
假设你知道a,b,c,d和alpha,beta,gamma,delta,你可以解出前面四个方程组中的九个未知数h1,h2,h3,h4,h5,h6,h7,h8,h9

在这里,我刚刚描述了这个问题的一个“原始”解决方案,原则上它是可行的;对于上述方法的详细解释,您可以参见本页,例如,他们将
h9=1
(因为
H
可以仅用8个参数表示),然后在8个未知数中求解由8个方程组成的线性系统。你可以在论文的第二部分找到类似的解释

另一种解释是用射影几何学来校正大卫·奥斯汀(David Austin)在《自然》杂志上的一部相机

Richard Hartley和Andrew Zissermann在《计算机视觉中的多视图几何》第二版的第4章“估计-2D投影变换”中描述了上述方法及其缺点,其中他们还描述了不同和更好的算法;您可以查看此链接,它似乎遵循同一本书


您可以在本书第15.1.4节“投影变换模型”中找到关于单应性的另一种解释。his中概述了算法15.4:投影变换(单应)的最大似然学习:通过非线性最小化来解决问题。

也许您可以使用四边形?请看我的回答:

然后,您可以完全控制每个点,并可以轻松制作任何四角形状。:)

依赖性最小的Java实现 对于那些知识和时间有限的人来说,在寻找一个快速而肮脏的解决方案时,项目中有一个有效且相当可靠的Java实现

转换正在进行中。它归结为构造和求解矩阵:

/**
*请注意,John Zelle博士帮助我们开发了
*处理解决单应映射所涉及的矩阵。
* 
**/
矩阵A=新矩阵(新双[][]{
{x1,y1,1,0,0,0,-xp1*x1,-xp1*y1},
{0,0,0,x1,y1,1,-yp1*x1,-yp1*y1},
{x2,y2,1,0,0,0,-xp2*x2,-xp2*y2},
{0,0,0,x2,y2,1,-yp2*x2,-yp2*y2},
{x3,y3,1,0,0,0,-xp3*x3,-xp3*y3},
{0,0,0,x3,y3,1,-yp3*x3,-yp3*y3},
{x4,y4,1,0,0,0,-xp4*x4,-xp4*y4},
{0,0,0,x4,y4,1,-yp4*x4,-yp4*y4}
});
矩阵XP=新矩阵(新双[]]
{xp1}、{yp1}、{xp2}、{yp2}、{xp3}、{yp3}、{xp4}、{yp4});
矩阵P=A.solve(XP);
变换=新矩阵(新双[][]{
{P.get(0,0),P.get(1,0),P.get(2,0)},
{P.get(3,0),P.get(4,0),P.get(5,0)},
{P.get(6,0),P.get(7,0),1}
});
用法:以下方法执行最终转换:

public Point2D.Double变换(Point2D.Double point){
矩阵p=新矩阵(新的双[][{{point.getX()},{point.getY()},{1}});
矩阵结果=变换次数(p);
double z=result.get(2,0);
返回新的Point2D.Double(result.get(0,0)/z,result.get(1,0)/z);
}
矩阵
类依赖关系来自

许可证
  • Wii互动
  • 贾马

  • 在实际尝试之后,我得到了一组无法求解的方程。似乎支持这一点——梯形不能通过线性变换由矩形构成。@Marijn您好,您的输入数据是什么?在简单的情况下,我想将(0,0)和(1,1)之间的矩形变换为梯形(0,0)(0,1)(1,a)(1,B),因此a和B是输入参数。如果我解决了这个问题,我得到B=A+1,也就是说,得到的矩阵只会产生平行四边形。起初,我还试图将左边(X=0)点的Y作为一个参数,这使我得到了一个无法求解的系统——尽管可能是我在简化方程时犯了一个错误(我没有太多的实践经验)。关于你提到的平行四边形:关键点是,一旦你知道了
    H
    ,你通常会从
    a
    alpha
    ,并使用非线性函数<代码>a=[x1,y1,1]α=[x1,y1,1]其中
    x1=(x1*h1+y1*h2+h3)/(x1*h7+y1*h8+h9)
    y1=(x1*h4+y1*h5+h6)/(x1*h7+y1*h8+h9)
    感谢您的澄清。我试图创建一个3×3矩阵,用于CSS转换规则。据我所见,这种技术在那里不适用。