square to trapezoid

后端 未结 3 2034
死守一世寂寞
死守一世寂寞 2021-01-04 13:09

I know that transforming a square into a trapezoid is a linear transformation, and can be done using the projective matrix, but I\'m having a little trouble figuring out how

3条回答
  •  太阳男子
    2021-01-04 14:10

    Java implementation with minimal dependencies

    For those with limited knowledge and time looking for a quick and dirty solution there is a working and quite reliable Java implementation in the Wii-interact project.

    The transormation is in the The Homography source file. It boils down to constructing and solving the matrix:

    /**
    * 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, 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}
            });
    
            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, 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}
            });
    

    Usage: the following method does the final transformation:

    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);
    }
    

    The Matrix class dependency comes from JAMA: Java Matrix Package

    License

    1. Wii-interact GNU GPL v3
    2. JAMA public domain

提交回复
热议问题