package Ġcom . ts iem ens . android script er . script Ċ Ċ import Ġandroid . graphics .* Ċ import Ġandroid . util . Log Ċ import Ġorg . opencv . core . Mat Ċ import Ġorg . opencv . core . Mat Of Float 4 Ċ import Ġjava . security . Message Digest Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . h ypot Ċ import Ġkotlin . math . min Ċ Ċ data Ġclass ĠScreen Signature ( val Ġwidth : ĠInt , Ġval Ġheight : ĠInt , Ġval Ġhash : ĠString ) Ċ Ċ @ Suppress (" UNUSED ") Ċ class ĠScreen Util Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠTAG Ġ= ĠScreen Util :: class . java . simple Name ĊĊĠĠĠĠĠĠĠ Ġfun Ġmake Point ( x : ĠInt , Ġy : ĠInt ): ĠPoint Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPoint ( x , Ġy ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UNUSED ") ĊĠĠĠĠĠĠĠ Ġfun Ġscaled Coords ( coord : ĠPoint , Ġref Coord : ĠPoint , Ġbitmap : ĠBitmap ): ĠPoint Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPoint ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoord . x Ġ* Ġbitmap . getWidth () Ġ/ Ġref Coord . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoord . y Ġ* Ġbitmap . getHeight () Ġ/ Ġref Coord . y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠHelper Ġto Ġget Ġa Ġsubset Ġof Ġpixels Ġfrom Ġa Ġregion Ġof Ġa Ġbitmap . ĊĠĠĠĠĠĠĠĠ Ġ* ĠProvide Ġthe Ġupper Ġleft Ġand Ġlower Ġright Ġpoints Ġof Ġa Ġrectangle Ġon Ġthe Ġscreen . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturned Ġis Ġa ĠSequence Ġfor Ġpixel Ġcoordinates Ġthat Ġare Ġto Ġbe Ġsampled . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠUses Ġa Ġd umb Ġsampling Ġalgorithm Ġright Ġnow , Ġbased Ġon Ġa Ġpercentage . ĠDefaults Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġ 1 Ġsample Ġper Ġ 2 0 Ġpixels Ġ( 5 % Ġsample ). ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġfilter , Ġif Ġprovided , Ġshould Ġreturn Ġtrue Ġif Ġa Ġpixel Ġis Ġto Ġbe Ġused . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UNUSED ") ĊĠĠĠĠĠĠĠ Ġfun Ġget Pixel Sample Coords ( upper Left : ĠPoint , Ġlower Right : ĠPoint , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpix Per Sample : ĠInt Ġ= Ġ 2 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter : Ġ(( Point )-> Boolean )? Ġ= Ġnull ): ĠSequence < Point > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġul Ġ= Ġupper Left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlr Ġ= Ġlower Right ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġlr . x Ġ- Ġul . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġlr . y Ġ- Ġul . y ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpixels Ġ= Ġwidth Ġ* Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Samples Ġ= Ġ( pixels / pix Per Sample ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal P xs Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġp xs Used Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġy Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn Samples ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal P xs ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= ĠPoint ( x Ġ+ Ġul . x , Ġy Ġ+ Ġul . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filter Ġ== Ġnull Ġ|| Ġfilter ( point )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp xs Used ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( point ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġ( x Ġ+ Ġpix Per Sample ) Ġ% Ġwidth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ+= Ġ(( x Ġ+ Ġpix Per Sample ) Ġ/ Ġwidth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" get Pixel Sample Coords : Ġy ielded Ġ$ px s Used /$ total P xs Ġsamples ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcombine Sample Coord Sequences ( var arg Ġseq s : ĠSequence < Point >): ĠSequence < Point > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsequence { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( seq Ġin Ġseq s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield All ( seq ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġpixel Exclude Filter From Win Dim en ( wd : ĠApi . Win Dim en , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Width : ĠInt , Ġscreen Height : ĠInt ): Ġ( Point ) Ġ-> ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfun ( px : ĠPoint ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ! wd . contains ( px , Ġscreen Width , Ġscreen Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Bitmap Screen Sig From Seq ( bm : ĠBitmap , Ġseq : ĠSequence < Point >): ĠScreen Signature Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmd Ġ= ĠMessage Digest . getInstance (" MD 5 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( sample Ġin Ġseq ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Val Ġ= Ġbm . get Pixel ( sample . x , Ġsample . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmd . update (( color Val Ġand Ġ 0 xFF ). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmd . update ((( color Val . shr ( 8 )) Ġand Ġ 0 xFF ). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmd . update ((( color Val . shr ( 1 6 )) Ġand Ġ 0 xFF ). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmd . update ((( color Val . shr ( 2 4 )) Ġand Ġ 0 xFF ). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhex Ġ= Ġmd . digest (). join ToString ("") Ġ{ Ġ"% 0 2 x ". format ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠScreen Signature ( bm . width , Ġbm . height , Ġhex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ************************* ****** ĠUtils Ġfor Ġfinding ĠX Ġbuttons Ġ************************* **** ĊĊĠĠĠĠĠĠĠ Ġfun Ġto Gray ( bm : ĠBitmap ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgray Mat Ġ= Ġto Gray Mat ( bm ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Bm Ġ= ĠBitmap . create Bitmap ( bm . width , Ġbm . height , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorg . opencv . android . Utils . mat To Bitmap ( gray Mat , Ġout Bm ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġout Bm ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġto Gray With Lines ( bm : ĠBitmap ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgray Mat Ġ= Ġto Gray Mat ( bm ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Mat Ġ= Ġdraw Lines ( gray Mat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Bm Ġ= ĠBitmap . create Bitmap ( bm . width , Ġbm . height , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorg . opencv . android . Utils . mat To Bitmap ( out Mat , Ġout Bm ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġout Bm ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġto Gray Mat ( bm : ĠBitmap ): ĠMat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmat Ġ= ĠMat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgray Mat Ġ= ĠMat () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Bitmap Ġconfig : Ġ" Ġ+ Ġbm . config . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorg . opencv . android . Utils . bitmap To Mat ( bm , Ġmat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorg . opencv . img proc . Img proc . cvt Color ( mat , Ġgray Mat , Ġorg . opencv . img proc . Img proc . COLOR _ RGB 2 GRAY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgray Mat ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġmat To Gray Mat ( mat : ĠMat ): ĠMat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgray Mat Ġ= ĠMat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorg . opencv . img proc . Img proc . cvt Color ( mat , Ġgray Mat , Ġorg . opencv . img proc . Img proc . COLOR _ RGB 2 GRAY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgray Mat ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdraw Lines ( img : ĠMat ): ĠMat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl sd Ġ= Ġorg . opencv . x img proc . X img proc . create Fast Line Detector () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= ĠMat Of Float 4 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl sd . detect ( img , Ġlines ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" lines : Ġ${ lines . elem Size ()} Ġ${ lines . size ()} Ġ${ lines . rows ()} Ġ${ lines . cols () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelem 1 Ġ= Ġlines [ 0 , Ġ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" elem 1 : Ġ${ elem 1 . toString ()} Ġ${ elem 1 . content ToString () }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Bm Ġ= ĠBitmap . create Bitmap ( img . width (), Ġimg . height (), ĠBitmap . Config . RGB _ 5 6 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Bm . erase Color ( Color . WHITE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġout Mat Ġ= ĠMat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorg . opencv . android . Utils . bitmap To Mat ( tmp Bm , Ġout Mat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Mat Ġ= Ġmat To Gray Mat ( out Mat ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" mat : Ġ${ out Mat . channels ()} Ġ${ out Mat . empty () }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġl sd . draw Segments ( out Mat , Ġlines ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġout Mat ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfind Xs ( img : ĠBitmap ): ĠX Detect Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmat Ġ= Ġto Gray Mat ( img ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfind Xs In Mat ( mat , Ġimg . width , Ġimg . height ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfind Xs In Mat ( img : ĠMat , Ġimg Width : ĠInt , Ġimg Height : ĠInt ): ĠX Detect Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlen Th resh Ġ= Ġ 7 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThese Ġare Ġjust Ġdefault Ġvalues Ġspecified Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// docs . opencv . org / master / df / ded / group __ x img proc __ fast __ line __ detector . html ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdist Th resh Ġ= Ġ 1 . 4 1 4 2 1 3 5 6 2 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcan ny Th 1 Ġ= Ġ 5 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcan ny Th 2 Ġ= Ġ 5 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcan ny A perture Size Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdo Merge Ġ= Ġfalse Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl sd Ġ= Ġorg . opencv . x img proc . X img proc . create Fast Line Detector () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl sd Ġ= Ġorg . opencv . x img proc . X img proc . create Fast Line Detector ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlen Th resh , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdist Th resh , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan ny Th 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan ny Th 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan ny A perture Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Merge ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Mat Ġ= ĠMat Of Float 4 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl sd . detect ( img , Ġlines Mat ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcross Side A prox Ġ= Ġ 2 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcross Side Variance Ġ= Ġ 1 5 . 0 ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= ĠMat Of Lines ( lines Mat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsz Ġ= Ġlines . size () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines For Debug Ġ= ĠArrayList < Line >( sz ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn C andi Lines Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc andi Lines Ġ= ĠarrayOf Null s < Line >( sz ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsz ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġlines . get ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines For Debug . add ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġval Ġstr Ġ= Ġline . line Vec . content ToString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLog . d ( TAG , Ġ"$ i /$ sz ĠLine Ġ$ str ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġis Ġline Ġabout Ġthe Ġright Ġsize ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġabs ( line . x 1 () Ġ- Ġline . x 2 ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġabs ( line . y 1 () Ġ- Ġline . y 2 ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( cross Side A prox Ġ- Ġx ) Ġ> Ġcross Side Variance Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabs ( cross Side A prox Ġ- Ġy ) Ġ> Ġcross Side Variance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLog . d ( TAG , Ġ" Ġ ĠInc orrect Ġsize ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġslope Ġ= Ġif Ġ( y Ġ!= Ġ 0 . 0 ) Ġabs ( x Ġ/ Ġy ) Ġelse ĠDouble . MAX _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( slope Ġ> Ġ 1 . 5 Ġ|| Ġslope Ġ< Ġ 0 . 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLog . d ( TAG , Ġ" Bad Ġslope ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLog . d ( TAG , Ġ" Good Ġsegment ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc andi Lines [ n C andi Lines ] Ġ= Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn C andi Lines ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Done Ġfinding Ġsegments . ĠFound Ġ$ n C andi Lines ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġxs Ġ= Ġarray ListOf < Cross >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn C andi Lines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġc andi Lines [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Type Ġ= Ġline !!. type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line Type Ġ!= ĠLine . Line Type . NW _ SE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMax Ġdistance Ġbetween Ġthe Ġline Ġpoints Ġat Ġthe Ġcenter Ġof Ġthe Ġcandidate ĠX . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Center Dist Ġ= Ġmin ( 1 5 . 0 , Ġline . len () Ġ* Ġ 0 . 7 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcross Ġ= ĠCross ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġline Ġ-> Ġ\ Ġ/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠ Ġ/ Ġ\ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ**/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmaybe AddTo Cross Ġ= Ġfun ( other Line : ĠLine ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdist : ĠDouble ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Line . type () Ġ== Ġline Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDiag onal Ġcandidate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdist Ġ= Ġpoint Dist ( line . east X (), Ġline . east Y (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Line . west X (), Ġother Line . west Y ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dist Ġ<= Ġmax Center Dist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross . se Ġ= Ġother Line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOther Ġis Ġ/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdist Ġ= Ġpoint Dist ( line . east X (), Ġline . east Y (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Line . east X (), Ġother Line . east Y ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dist Ġ<= Ġmax Center Dist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross . sw Ġ= Ġother Line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdist Ġ= Ġpoint Dist ( line . east X (), Ġline . east Y (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Line . west X (), Ġother Line . west Y ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dist Ġ<= Ġmax Center Dist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross . ne Ġ= Ġother Line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġn C andi Lines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġj ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( maybe AddTo Cross ( c andi Lines [ j ] !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cross . ne Ġ!= Ġnull Ġ&& Ġcross . se Ġ!= Ġnull Ġ&& Ġcross . sw Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠF illed Ġcross ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġxs . add ( cross ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Add Ġcross : Ġ$ cross ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠX Detect Result ( xs , Ġlines For Debug , Ġimg Width , Ġimg Height ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Lines From Xs ( xs : ĠList < Cross >): ĠArrayList < Line > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= ĠArrayList < Line >( xs . size Ġ* Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( cross Ġin Ġxs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( cross . nw ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( cross . sw !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( cross . ne !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( cross . se !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlines ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġpoint Dist ( x 1 : ĠDouble , Ġy 1 : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx 2 : ĠDouble , Ġy 2 : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġh ypot ( abs ( x 1 Ġ- Ġx 2 ), Ġabs ( y 1 Ġ- Ġy 2 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdraw Lines To Bm ( lines : ĠArrayList < Line >, Ġbm : ĠBitmap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor : ĠInt Ġ= ĠColor . RED , ĠstrokeWidth : ĠFloat Ġ= Ġ 3 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( bm ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPaint () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . color Ġ= Ġcolor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . stroke Width Ġ= ĠstrokeWidth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( line Ġin Ġlines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . x 1 (). toFloat (), Ġline . y 1 (). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . x 2 (). toFloat (), Ġline . y 2 (). toFloat (), Ġp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠX Detect Result ( val Ġxs : ĠList < Cross >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Lines : ĠList < Line >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimg Width : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimg Height : ĠInt ) ĊĊĠĠĠ Ġclass ĠCross ( val Ġnw : ĠLine ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġne : ĠLine ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġse : ĠLine ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġsw : ĠLine ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġcenter (): Ġorg . opencv . core . Point Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġorg . opencv . core . Point ( nw . east X (), Ġnw . east Y ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" center : Ġ${ center () }\ nn w : Ġ$ nw \ n ne : Ġ${ ne . toString () }\ n se : Ġ${ se . toString () }\ n sw : Ġ${ sw . toString () }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠLine ( val Ġline Vec : ĠDouble Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWhere ĠVec 4 f Ġis Ġ( x 1 , Ġy 1 , Ġx 2 , Ġy 2 ), Ġpoint Ġ 1 Ġis Ġthe Ġstart , Ġpoint Ġ 2 Ġ- Ġend . ĊĠĠĠĠĠĠĠ Ġfun Ġx 1 (): ĠDouble Ġ= Ġline Vec [ 0 ] ĊĠĠĠĠĠĠĠ Ġfun Ġy 1 (): ĠDouble Ġ= Ġline Vec [ 1 ] ĊĠĠĠĠĠĠĠ Ġfun Ġx 2 (): ĠDouble Ġ= Ġline Vec [ 2 ] ĊĠĠĠĠĠĠĠ Ġfun Ġy 2 (): ĠDouble Ġ= Ġline Vec [ 3 ] ĊĊĠĠĠĠĠĠĠ Ġenum Ġclass ĠLine Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN W _ SE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSW _ NE , ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwest X (): ĠDouble Ġ= Ġif Ġ( x 1 () Ġ< Ġx 2 ()) Ġ{ Ġx 1 () Ġ} Ġelse Ġ{ Ġx 2 () Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġwest Y (): ĠDouble Ġ= Ġif Ġ( x 1 () Ġ< Ġx 2 ()) Ġ{ Ġy 1 () Ġ} Ġelse Ġ{ Ġy 2 () Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġeast X (): ĠDouble Ġ= Ġif Ġ( x 1 () Ġ< Ġx 2 ()) Ġ{ Ġx 2 () Ġ} Ġelse Ġ{ Ġx 1 () Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġeast Y (): ĠDouble Ġ= Ġif Ġ( x 1 () Ġ< Ġx 2 ()) Ġ{ Ġy 2 () Ġ} Ġelse Ġ{ Ġy 1 () Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġtype (): ĠLine Type Ġ= Ġif Ġ( west Y () Ġ< Ġeast Y ()) Ġ{ ĠLine Type . NW _ SE Ġ} Ġelse Ġ{ ĠLine Type . SW _ NE Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġlen (): ĠDouble Ġ= ĠMath . sqrt ( Math . pow ( abs ( x 1 () Ġ- Ġx 2 ()), Ġ 2 . 0 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . pow ( abs ( x 1 () Ġ- Ġx 2 ()), Ġ 2 . 0 )) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("[ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġline Vec . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( line Vec [ i ]. toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġline Vec . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠMat Of Lines ( val Ġlines Mat : ĠMat Of Float 4 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġsize (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlines Mat . rows () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget ( i : ĠInt ): ĠLine Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġda Ġ= Ġlines Mat . get ( i , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLine ( da ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ