Calculating aspect ratio of Perspective Transform destination image

前端 未结 2 772
南笙
南笙 2020-12-30 11:27

I\'ve recently implemented Perspective Transform in OpenCV to my app in Android. Almost everything works without issues but one aspect nee

2条回答
  •  情话喂你
    2020-12-30 11:54

    Thanks to y300 and this post https://stackoverflow.com/a/1222855/8746860 I got it implemented in Java. I'll leave this here in case someone has the same problems I had converting it to Java...

    public float getRealAspectRatio(int imageWidth, int imageHeight) {
    
        double u0 = imageWidth/2;
        double v0 = imageHeight/2;
        double m1x = mTopLeft.x - u0;
        double m1y = mTopLeft.y - v0;
        double m2x = mTopRight.x - u0;
        double m2y = mTopRight.y - v0;
        double m3x = mBottomLeft.x - u0;
        double m3y = mBottomLeft.y - v0;
        double m4x = mBottomRight.x - u0;
        double m4y = mBottomRight.y - v0;
    
        double k2 = ((m1y - m4y)*m3x - (m1x - m4x)*m3y + m1x*m4y - m1y*m4x) /
                ((m2y - m4y)*m3x - (m2x - m4x)*m3y + m2x*m4y - m2y*m4x) ;
    
        double k3 = ((m1y - m4y)*m2x - (m1x - m4x)*m2y + m1x*m4y - m1y*m4x) /
                ((m3y - m4y)*m2x - (m3x - m4x)*m2y + m3x*m4y - m3y*m4x) ;
    
        double f_squared =
                -((k3*m3y - m1y)*(k2*m2y - m1y) + (k3*m3x - m1x)*(k2*m2x - m1x)) /
                        ((k3 - 1)*(k2 - 1)) ;
    
        double whRatio = Math.sqrt(
                (Math.pow((k2 - 1),2) + Math.pow((k2*m2y - m1y),2)/f_squared + Math.pow((k2*m2x - m1x),2)/f_squared) /
                        (Math.pow((k3 - 1),2) + Math.pow((k3*m3y - m1y),2)/f_squared + Math.pow((k3*m3x - m1x),2)/f_squared)
        ) ;
    
        if (k2==1 && k3==1 ) {
            whRatio = Math.sqrt(
                    (Math.pow((m2y-m1y),2) + Math.pow((m2x-m1x),2)) /
                            (Math.pow((m3y-m1y),2) + Math.pow((m3x-m1x),2)));
        }
    
        return (float)(whRatio);
    }
    

提交回复
热议问题