package Ġcom . vy w . t flite čĊč Ċ import Ġandroid . Manifest č Ċ import Ġandroid . content . pm . PackageManager č Ċ import Ġandroid . content . res . Asset Manager č Ċ import Ġandroid . graphics .* č Ċ import Ġandroid . media . Image . Plane č Ċ import Ġandroid . os . Bundle č Ċ import Ġandroid . util . Log č Ċ import Ġandroid . util . Size č Ċ import Ġandroid . widget . Toast č Ċ import Ġandroidx . appcompat . app . AppCompatActivity č Ċ import Ġandroidx . camera . core .* č Ċ import Ġandroidx . camera . core . Image Analysis . STR ATE GY _ KEEP _ ONLY _ LATE ST č Ċ import Ġandroidx . camera . lifecycle . Process Camera Provider č Ċ import Ġandroidx . core . app . Activity Compat č Ċ import Ġandroidx . core . content . Context Compat č Ċ import Ġkotlinx . android . synt hetic . main . activity _ object _ detection .* č Ċ import Ġjava . io . BufferedReader č Ċ import Ġjava . io . InputStream Reader č Ċ import Ġjava . util . concurrent . ExecutorService č Ċ import Ġjava . util . concurrent . Executors čĊč Ċ class ĠObject Detection Ġ: ĠAppCompatActivity (), ĠImage Analysis . Analyzer Ġ{ čĊčĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Object Detection " čĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ CODE _ PERMISSION S Ġ= Ġ 1 0 čĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠREQUIRED _ PERMISSION S Ġ= ĠarrayOf ( Manifest . permission . CAMERA ) čĊčĊĠĠĠĠĠĠĠ Ġinit Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . load Library (" native - lib ") čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcamera Executor : ĠExecutor Service čĊĠĠĠ Ġprivate Ġvar Ġimage Analyzer : ĠImage Analysis ? Ġ= Ġnull čĊĠĠĠ Ġprivate Ġvar Ġdetector Addr Ġ= Ġ 0 L čĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnv 2 1 : ĠByteArray čĊĠĠĠ Ġprivate Ġval Ġlabels Map Ġ= Ġarray ListOf < String >() čĊĠĠĠ Ġprivate Ġval Ġ_ paint Ġ= ĠPaint () čĊčĊčĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) čĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ object _ detection ) čĊčĊĠĠĠĠĠĠĠ Ġ// ĠRequest Ġcamera Ġpermissions čĊĠĠĠĠĠĠĠ Ġif Ġ( all Permissions Granted ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Camera () čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĠREQUIRED _ PERMISSION S , ĠREQUEST _ CODE _ PERMISSION S ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġcamera Executor Ġ= ĠExec utors . new Single Thread Executor () čĊčĊĠĠĠĠĠĠĠ Ġ// Ġinit Ġthe Ġpaint Ġfor Ġdrawing Ġthe Ġdetection s čĊĠĠĠĠĠĠĠ Ġ_ paint . color Ġ= ĠColor . RED čĊĠĠĠĠĠĠĠ Ġ_ paint . style Ġ= ĠPaint . Style . ST RO KE čĊĠĠĠĠĠĠĠ Ġ_ paint . stroke Width Ġ= Ġ 3 f čĊĠĠĠĠĠĠĠ Ġ_ paint . text Size Ġ= Ġ 5 0 f čĊĠĠĠĠĠĠĠ Ġ_ paint . textAlign Ġ= ĠPaint . Align . LEFT čĊčĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġdetection s Ġdraw ings Ġsurface Ġtransparent čĊĠĠĠĠĠĠĠ Ġsurface View . set Z Order On Top ( true ) čĊĠĠĠĠĠĠĠ Ġsurface View . holder . set Format ( PixelFormat . TRANSP ARENT ) čĊčĊĠĠĠĠĠĠĠ Ġload Labels () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġall Permissions Granted () Ġ= ĠREQUIRED _ PERMISSION S . all Ġ{ čĊĠĠĠĠĠĠĠ ĠContext Compat . check Self Permission ( base Context , Ġit ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( čĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , čĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < String >, čĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array čĊĠĠĠ Ġ) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠREQUEST _ CODE _ PERMISSION S ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( all Permissions Granted ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Camera () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Permissions Ġnot Ġgranted Ġby Ġthe Ġuser .", ĠToast . LENGTH _ SHORT ). show () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġstart Camera () Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġcamera Provider Future Ġ= ĠProcess Camera Provider . getInstance ( this ) čĊčĊĠĠĠĠĠĠĠ Ġcamera Provider Future . addListener ( Runnable Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUsed Ġto Ġbind Ġthe Ġlifecycle Ġof Ġcameras Ġto Ġthe Ġlifecycle Ġowner čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcamera Provider : ĠProcess Camera Provider Ġ= Ġcamera Provider Future . get () čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrotation Ġ= Ġview Finder . display . rotation čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPreview čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpreview Ġ= ĠPreview . Builder () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTarget AspectRatio ( AspectRatio . RATIO _ 4 _ 3 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTarget Rotation ( rotation ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Surface Provider ( view Finder . surface Provider ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠImage Analysis čĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Analyzer Ġ= ĠImage Analysis . Builder () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTarget Resolution ( Size ( 7 6 8 , Ġ 1 0 2 4 )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTarget Rotation ( rotation ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Back pressure Strategy ( STR ATE GY _ KEEP _ ONLY _ LATE ST ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġanalyzer Ġcan Ġthen Ġbe Ġassigned Ġto Ġthe Ġinstance čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Analyzer ( camera Executor , Ġthis ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠU nb ind Ġuse Ġcases Ġbefore Ġre binding čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Provider . unbind All () čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBind Ġuse Ġcases Ġto Ġcamera čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Provider . bind To Lifecycle ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Selector . DEFAULT _ BACK _ CAMERA , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Analyzer čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠException ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Use Ġcase Ġbinding Ġfailed ", Ġexc ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ}, ĠContext Compat . get Main Executor ( this )) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġanalyze ( image : ĠImage Proxy ) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( image . planes . size Ġ< Ġ 3 ) Ġ{ return } čĊĠĠĠĠĠĠĠ Ġif Ġ( detector Addr Ġ== Ġ 0 L ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetector Addr Ġ= Ġinit Detector ( this . assets ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġrotation Ġ= Ġimage . image Info . rotation Degrees čĊčĊĠĠĠĠĠĠĠ Ġval Ġplanes Ġ= Ġimage . planes čĊĠĠĠĠĠĠĠ Ġval Ġy Buffer Ġ= Ġplanes [ 0 ]. buffer čĊĠĠĠĠĠĠĠ Ġval Ġu Buffer Ġ= Ġplanes [ 1 ]. buffer čĊĠĠĠĠĠĠĠ Ġval Ġv Buffer Ġ= Ġplanes [ 2 ]. buffer čĊčĊĠĠĠĠĠĠĠ Ġval Ġy Size Ġ= Ġy Buffer . remaining () čĊĠĠĠĠĠĠĠ Ġval Ġu Size Ġ= Ġu Buffer . remaining () čĊĠĠĠĠĠĠĠ Ġval Ġv Size Ġ= Ġv Buffer . remaining () čĊčĊĠĠĠĠĠĠĠ Ġif Ġ(! :: nv 2 1 . isInitialized ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġnv 2 1 Ġ= ĠByteArray ( y Size Ġ+ Ġu Size Ġ+ Ġv Size ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ// U Ġand ĠV Ġare Ġsw apped čĊĠĠĠĠĠĠĠ Ġy Buffer . get ( nv 2 1 , Ġ 0 , Ġy Size ); čĊĠĠĠĠĠĠĠ Ġv Buffer . get ( nv 2 1 , Ġy Size , Ġv Size ); čĊĠĠĠĠĠĠĠ Ġu Buffer . get ( nv 2 1 , Ġy Size Ġ+ Ġv Size , Ġu Size ); čĊčĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġdetect ( detector Addr , Ġnv 2 1 , Ġimage . width , Ġimage . height , Ġrotation ) čĊčĊĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= Ġsurface View . holder . lock Canvas () čĊĠĠĠĠĠĠĠ Ġif Ġ( canvas Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Color ( Color . TRANSP ARENT , ĠPort er D uff . Mode . MULTI PLY ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDraw Ġthe Ġdetection s , Ġin Ġour Ġcase Ġthere Ġare Ġonly Ġ 3 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġres [ 0 ]. toInt ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . draw Detection ( canvas , Ġimage . width , Ġimage . height , Ġrotation , Ġres , Ġi ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface View . holder . unlock Canvas And Post ( canvas ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġimage . close () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġdraw Detection ( čĊĠĠĠĠĠĠĠ Ġcanvas : ĠCanvas , čĊĠĠĠĠĠĠĠ Ġframe Width : ĠInt , čĊĠĠĠĠĠĠĠ Ġframe Height : ĠInt , čĊĠĠĠĠĠĠĠ Ġrotation : ĠInt , čĊĠĠĠĠĠĠĠ Ġdetection s Arr : ĠFloat Array , čĊĠĠĠĠĠĠĠ Ġdetection Idx : ĠInt čĊĠĠĠ Ġ) Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġdetection Idx Ġ* Ġ 6 Ġ+ Ġ 1 čĊĠĠĠĠĠĠĠ Ġval Ġscore Ġ= Ġdetection s Arr [ pos Ġ+ Ġ 0 ] čĊĠĠĠĠĠĠĠ Ġval Ġclass Id Ġ= Ġdetection s Arr [ pos Ġ+ Ġ 1 ] čĊĠĠĠĠĠĠĠ Ġvar Ġxmin Ġ= Ġdetection s Arr [ pos Ġ+ Ġ 2 ] čĊĠĠĠĠĠĠĠ Ġvar Ġymin Ġ= Ġdetection s Arr [ pos Ġ+ Ġ 3 ] čĊĠĠĠĠĠĠĠ Ġvar Ġxmax Ġ= Ġdetection s Arr [ pos Ġ+ Ġ 4 ] čĊĠĠĠĠĠĠĠ Ġvar Ġymax Ġ= Ġdetection s Arr [ pos Ġ+ Ġ 5 ] čĊčĊĠĠĠĠĠĠĠ Ġ// ĠFilter Ġby Ġscore čĊĠĠĠĠĠĠĠ Ġif Ġ( score Ġ< Ġ 0 . 4 ) Ġreturn čĊčĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġframe Ġdimensions čĊĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġif Ġ( rotation Ġ== Ġ 0 Ġ|| Ġrotation Ġ== Ġ 1 8 0 ) Ġframe Width Ġelse Ġframe Height čĊĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġif Ġ( rotation Ġ== Ġ 0 Ġ|| Ġrotation Ġ== Ġ 1 8 0 ) Ġframe Height Ġelse Ġframe Width čĊčĊĠĠĠĠĠĠĠ Ġ// Ġdetection Ġcoords Ġare Ġin Ġframe Ġcoord Ġsystem , Ġconvert Ġto Ġscreen Ġcoords čĊĠĠĠĠĠĠĠ Ġval Ġscale X Ġ= Ġview Finder . width . toFloat () Ġ/ Ġw čĊĠĠĠĠĠĠĠ Ġval Ġscale Y Ġ= Ġview Finder . height . toFloat () Ġ/ Ġh čĊčĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġcamera Ġview Ġoffset Ġon Ġscreen čĊĠĠĠĠĠĠĠ Ġval Ġx off Ġ= Ġ 0 Ġ// Ġview Finder . left . toFloat () čĊĠĠĠĠĠĠĠ Ġval Ġy off Ġ= Ġ 0 Ġ// Ġview Finder . top . toFloat () čĊčĊĠĠĠĠĠĠĠ Ġxmin Ġ= Ġx off Ġ+ Ġxmin Ġ* Ġscale X čĊĠĠĠĠĠĠĠ Ġxmax Ġ= Ġx off Ġ+ Ġxmax Ġ* Ġscale X čĊĠĠĠĠĠĠĠ Ġymin Ġ= Ġy off Ġ+ Ġymin Ġ* Ġscale Y čĊĠĠĠĠĠĠĠ Ġymax Ġ= Ġy off Ġ+ Ġymax Ġ* Ġscale Y čĊčĊčĊĠĠĠĠĠĠĠ Ġ// ĠDraw Ġthe Ġrect čĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPath () čĊĠĠĠĠĠĠĠ Ġp . moveTo ( xmin , Ġymin ) čĊĠĠĠĠĠĠĠ Ġp . lineTo ( xmax , Ġymin ) čĊĠĠĠĠĠĠĠ Ġp . lineTo ( xmax , Ġymax ) čĊĠĠĠĠĠĠĠ Ġp . lineTo ( xmin , Ġymax ) čĊĠĠĠĠĠĠĠ Ġp . lineTo ( xmin , Ġymin ) čĊčĊĠĠĠĠĠĠĠ Ġcanvas . draw Path ( p , Ġ_ paint ) čĊčĊĠĠĠĠĠĠĠ Ġ// Ġclass Id Ġis Ġzero - based Ġ( mean ing Ġclass Ġid Ġ 0 Ġis Ġclass Ġ 1 ) čĊĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= Ġlabels Map [ class Id . toInt ()] čĊčĊĠĠĠĠĠĠĠ Ġval Ġtxt Ġ= Ġ"% s Ġ(% . 2 f ) ". format ( label , Ġscore ) čĊĠĠĠĠĠĠĠ Ġcanvas . draw Text ( txt , Ġxmin , Ġymin , Ġ_ paint ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġload Labels () Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġlabels Input Ġ= Ġthis . assets . open (" labels . txt ") čĊĠĠĠĠĠĠĠ Ġval Ġbr Ġ= ĠBufferedReader ( InputStream Reader ( labels Input )) čĊĠĠĠĠĠĠĠ Ġvar Ġline Ġ= Ġbr . readLine () čĊĠĠĠĠĠĠĠ Ġwhile Ġ( line Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabels Map . add ( line ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Ġ= Ġbr . readLine () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġbr . close () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġexternal Ġfun Ġinit Detector ( asset Manager : ĠAsset Manager ?): ĠLong čĊĠĠĠ Ġprivate Ġexternal Ġfun Ġdestroy Detector ( ptr : ĠLong ) čĊĠĠĠ Ġprivate Ġexternal Ġfun Ġdetect ( ptr : ĠLong , Ġsrc Addr : ĠByteArray , Ġwidth : ĠInt , Ġheight : ĠInt , Ġrotation : ĠInt ): ĠFloat Array č Ċ } čĊ