package Ġme . sed lar . inv org Ċ Ċ import Ġme . sed lar . inv org . util .* Ċ import Ġnet . sourceforge . t ess 4 j . Tess er act Ċ import Ġorg . opencv . core . Mat Ċ import Ġorg . opencv . core . Size Ċ import Ġorg . opencv . img proc . Img proc Ċ import Ġjava . awt . Rectangle Ċ import Ġjava . awt . image . Buffered Image Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ Ċ val Ġt esseract : ĠT esseract Ġby Ġlazy Ġ{ ĊĠĠĠ Ġval Ġt esseract Ġ= ĠT esseract () ĊĠĠĠ Ġt esseract . set Tess Variable (" user _ defined _ dpi ", Ġ" 2 0 0 ") ĊĠĠĠ Ġt esseract . set Datap ath ( File ( Native Bund ler . SITE , Ġ" t esseract / "). absolute Path ) ĊĠĠĠ Ġt esseract . set Language (" eng ") ĊĠĠĠ Ġt esseract Ċ } Ċ Ċ val Ġmodel Invoice : ĠMat Ġby Ġlazy Ġ{ ĊĠĠĠ ĠOpenCV . mat (" invoice . png ") Ċ } Ċ Ċ class ĠInvoice Mat ( val Ġimage : ĠBufferedImage ) Ġ{ ĊĊĠĠĠ Ġval Ġmatrix Ġ= Ġimage . to Mat () ĊĊĠĠĠ Ġprivate Ġvar Ġnumber : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġfun Ġfind Number Bounds (): ĠRectangle ? Ġ{ ĊĠĠĠĠĠĠĠ Ġmatrix . findFirst Template ( model Invoice Ġto Ġ 0 . 5 1 5 )?. let Ġ{ Ġinvoice Bounds Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoice Bounds . x Ġ+= Ġmodel Invoice . width () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoice Bounds . width Ġ= Ġmatrix . px ( 1 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinvoice Bounds ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse Number (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( number . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnumber ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġn Ġ= Ġparse Number With Tess er act () ĊĠĠĠĠĠĠĠ Ġif Ġ( n Ġ== Ġnull Ġ|| Ġn . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ= Ġparse Number With OpenCV () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( n Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnumber Ġ= Ġn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnumber ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Number With Tess er act (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Number Bounds ()?. let Ġ{ Ġnumber Bounds Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnums Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . getSub image ( number Bounds . x , Ġnumber Bounds . y , Ġnumber Bounds . width , Ġnumber Bounds . height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Mat Ġ= Ġnums . to Mat () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠImg proc . threshold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Mat , Ġnum Mat , Ġ 1 2 7 . 0 , Ġ 2 5 5 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImg proc . THRESH _ BINARY Ġand ĠImg proc . THRESH _ OT SU ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcleaned Mat Ġ= ĠMat () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImg proc . Gaussian Blur ( num Mat , Ġcleaned Mat , ĠSize ( 5 . 0 , Ġ 5 . 0 ), Ġ 0 . 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġt esseract . do OCR ( cleaned Mat . to Image ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( Regex ("[ ^ 0 - 9 ] "), Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Number With OpenCV (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Number Bounds ()?. let Ġ{ Ġnumber Bounds Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Mat Ġ= Ġmatrix . sub mat ( number Bounds . to CV Rect ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber List Ġ= ĠArrayList < Pair < Int , ĠRectangle >>() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( invoice Number Ġin Ġinvoice Numbers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatches Ġ= Ġnumber Mat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findAll Templates ( invoice Number . mat Ġto Ġinvoice Number . precision ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reduce To Unique () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matches . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatches . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnumber List . add ( invoice Number . number Ġto Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnumber List . sortBy Ġ{ Ġit . second . x Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnumber Ġ= Ġnumber List . join ToString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Ġ= Ġ{ Ġit . first . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnumber ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ }