/** ĊĠĠĠ ĠCopyright Ġ 2 0 2 0 ĠZ yn k Software ĠS RL ĊĊĠĠĠ ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand ĊĠĠĠ Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , ĊĠĠĠ Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , ĊĠĠĠ Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis ĊĠĠĠ Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : ĊĊĠĠĠ ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor ĊĠĠĠ Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . ĊĊĠĠĠ ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĊĠĠĠ ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĊĠĠĠ ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĊĠĠĠ ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĊĠĠĠ ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . zyn k software . document scanner . common . utils Ċ Ċ import Ġcom . zyn k software . document scanner . common . utils . Math Utils . get Distance Ċ import Ġorg . opencv . core . Mat Ċ import Ġorg . opencv . core . Mat Of Point 2 f Ċ import Ġorg . opencv . core . Point Ċ import Ġorg . opencv . core . Size Ċ import Ġorg . opencv . img proc . Img proc Ċ import Ġjava . util .* Ċ Ċ internal Ġobject ĠPers pective Transformation Ġ{ ĊĊĠĠĠ Ġfun Ġtransform ( src : ĠMat , Ġcorners : ĠMat Of Point 2 f ): ĠMat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsorted C orners Ġ= Ġsort C orners ( corners ) ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġget Rectangle Size ( sorted C orners ) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠMat . zeros ( size , Ġsrc . type ()) ĊĠĠĠĠĠĠĠ Ġval Ġimage Outline Ġ= Ġget Outline ( result ) ĊĠĠĠĠĠĠĠ Ġval Ġtransformation Ġ= ĠImg proc . get Perspective Transform ( sorted C orners , Ġimage Outline ) ĊĠĠĠĠĠĠĠ ĠImg proc . warp Perspective ( src , Ġresult , Ġtransformation , Ġsize ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Rectangle Size ( rectangle : ĠMat Of Point 2 f ): ĠSize Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcorners Ġ= Ġrectangle . toArray () ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġget Distance ( corners [ 0 ], Ġcorners [ 1 ]) ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġget Distance ( corners [ 1 ], Ġcorners [ 2 ]) ĊĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġget Distance ( corners [ 2 ], Ġcorners [ 3 ]) ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġget Distance ( corners [ 3 ], Ġcorners [ 0 ]) ĊĠĠĠĠĠĠĠ Ġval Ġaverage Width Ġ= Ġ( top Ġ+ Ġbottom ) Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠ Ġval Ġaverage Height Ġ= Ġ( right Ġ+ Ġleft ) Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠ Ġreturn ĠSize ( Point ( average Width , Ġaverage Height )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Outline ( image : ĠMat ): ĠMat Of Point 2 f Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtop Left Ġ= ĠPoint ( 0 . toDouble (), Ġ 0 . toDouble ()) ĊĠĠĠĠĠĠĠ Ġval Ġtop Right Ġ= ĠPoint ( image . cols (). toDouble (), Ġ 0 . toDouble ()) ĊĠĠĠĠĠĠĠ Ġval Ġbottom Right Ġ= ĠPoint ( image . cols (). toDouble (), Ġimage . rows (). toDouble ()) ĊĠĠĠĠĠĠĠ Ġval Ġbottom Left Ġ= ĠPoint ( 0 . toDouble (), Ġimage . rows (). toDouble ()) ĊĠĠĠĠĠĠĠ Ġval Ġpoints Ġ= ĠarrayOf ( top Left , Ġtop Right , Ġbottom Right , Ġbottom Left ) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠMat Of Point 2 f () ĊĠĠĠĠĠĠĠ Ġresult . from Array (* points ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsort C orners ( corners : ĠMat Of Point 2 f ): ĠMat Of Point 2 f Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcenter Ġ= Ġget Mass Center ( corners ) ĊĠĠĠĠĠĠĠ Ġval Ġpoints Ġ= Ġcorners . toList () ĊĠĠĠĠĠĠĠ Ġval Ġtop Points : ĠMutable List < Point > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġbottom Points : ĠMutable List < Point > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġfor Ġ( point Ġin Ġpoints ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( point . y Ġ< Ġcenter . y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Points . add ( point ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Points . add ( point ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtop Left Ġ= Ġif Ġ( top Points [ 0 ]. x Ġ> Ġtop Points [ 1 ]. x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Points [ 1 ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Points [ 0 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtop Right Ġ= Ġif Ġ( top Points [ 0 ]. x Ġ> Ġtop Points [ 1 ]. x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Points [ 0 ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Points [ 1 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbottom Left Ġ= Ġif Ġ( bottom Points [ 0 ]. x Ġ> Ġbottom Points [ 1 ]. x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Points [ 1 ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Points [ 0 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbottom Right Ġ= Ġif Ġ( bottom Points [ 0 ]. x Ġ> Ġbottom Points [ 1 ]. x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Points [ 0 ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Points [ 1 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠMat Of Point 2 f () ĊĠĠĠĠĠĠĠ Ġval Ġsorted Points Ġ= ĠarrayOf ( top Left , Ġtop Right , Ġbottom Right , Ġbottom Left ) ĊĠĠĠĠĠĠĠ Ġresult . from Array (* sorted Points ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Mass Center ( points : ĠMat Of Point 2 f ): ĠPoint Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġx Sum Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġvar Ġy Sum Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġpoint List Ġ= Ġpoints . toList () ĊĠĠĠĠĠĠĠ Ġval Ġlen Ġ= Ġpoint List . size ĊĠĠĠĠĠĠĠ Ġfor Ġ( point Ġin Ġpoint List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Sum Ġ+= Ġpoint . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Sum Ġ+= Ġpoint . y ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPoint ( x Sum Ġ/ Ġlen , Ġy Sum Ġ/ Ġlen ) ĊĠĠĠ Ġ} Ċ }