如何解决梯形的正方形
| 我知道将正方形转换成梯形是线性转换,可以使用投影矩阵来完成,但是我在弄清楚如何构造矩阵方面遇到了一些麻烦。 使用投影矩阵进行平移,缩放,旋转和剪切很简单。是否有一个简单的投影矩阵将正方形转换成梯形?解决方法
a,b,c,d是2D正方形的四个角。
a,b,c,d用齐次坐标表示,因此它们是3x1矩阵。
alpha,beta,gamma和delta是2D梯形的四个角。
alpha,beta,gamma和delta用齐次坐标表示,因此它们是3x1矩阵。
H是您要寻找的3x3矩阵,也称为单应性
h1 h2 h3
H = h4 h5 h6
h7 h8 h9
H将a,b,c,d映射为alpha,beta,gamma,delta,因此您具有以下四个方程式
alpha=H*a
beta=H*b
gamma=H*c
delta=H*d
假设您知道a,b,c,d和alpha,beta,gamma,delta,则可以为9个未知数h1,h2,h3,h4,h5,h6,h7,h8,h9求解前面的四个方程组。
在这里,我刚刚描述了该问题的“原始”解决方案,该解决方案原则上可以起作用;有关上述方法的详细说明,您可以参见例如以下页面:http://www.corrmap.com/features/homography_transformation.php,其中将h9=1
放进去(因为H
只能用8个参数表示),然后求解八个未知数中的八个方程的线性系统。您可以在Elan Dubrofsky的Homography Estimation论文第二部分中找到类似的解释。
另一种解释是David Austin在2013年3月发行的AMS的Feature Column中的《使用射影几何来校正相机》。
上述方法有其缺点,在Richard Hartley和Andrew Zissermann的第二版计算机视觉中的多视图几何第二版的第4章“估计-2D投影变换”中进行了介绍,其中还描述了不同的更好的算法。您可以查看此链接http://www.cse.iitd.ac.in/~suban/vision/geometry/node24.html,该链接似乎与这本书相同。
您可以在Simon J.D. Prince撰写的《计算机视觉:模型,学习和推理》一书的15.1.4节“投影变换模型”中找到有关单应性的另一种解释。算法手册15.4:投影变换(单应性)的最大似然学习在其算法手册中进行了概述:通过非线性最小化解决了问题。
, 也许您可以使用四边形?在这里查看我的答案:
https://stackoverflow.com/a/12820877/202451
然后,您将完全控制每个点,并且可以轻松地制作任何四角形状。 :)
, 最小依赖的Java实现
对于那些知识和时间有限的人来说,寻找一种快速而又肮脏的解决方案的方法是,在Wii-interact项目中有一个可行且相当可靠的Java实现。
转换位于The Homography源文件中。归结为构造和求解矩阵:
/**
* Please note that Dr. John Zelle assisted us in developing the code to
* handle the matrices involved in solving for the homography mapping.
*
**/
Matrix A = new Matrix(new double[][]{
{x1,y1,1,-xp1*x1,-xp1*y1},{0,x1,-yp1*x1,-yp1*y1},{x2,y2,-xp2*x2,-xp2*y2},x2,-yp2*x2,-yp2*y2},{x3,y3,-xp3*x3,-xp3*y3},x3,-yp3*x3,-yp3*y3},{x4,y4,-xp4*x4,-xp4*y4},x4,-yp4*x4,-yp4*y4}
});
Matrix XP = new Matrix(new double[][]
{{xp1},{yp1},{xp2},{yp2},{xp3},{yp3},{xp4},{yp4}});
Matrix P = A.solve(XP);
transformation = new Matrix(new double[][]{
{P.get(0,0),P.get(1,P.get(2,0)},{P.get(3,P.get(4,P.get(5,{P.get(6,P.get(7,1}
});
用法:以下方法进行最终转换:
public Point2D.Double transform(Point2D.Double point) {
Matrix p = new Matrix(new double[][]{{point.getX()},{point.getY()},{1}});
Matrix result = transformation.times(p);
double z = result.get(2,0);
return new Point2D.Double(result.get(0,0) / z,result.get(1,0) / z);
}
Matrix
类依赖项来自JAMA:Java Matrix包
执照
Wii互动式GNU GPL v3
JAMA公共领域
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。