Paano kunin ang teksto mula sa mga imahe gamit ang SDK ng Pag-aaral ng Machine ng Google

May -Akda: John Stephens
Petsa Ng Paglikha: 27 Enero 2021
I -Update Ang Petsa: 5 Hulyo 2024
Anonim
How to Build a Google Site (The Ultimate Tutorial)
Video.: How to Build a Google Site (The Ultimate Tutorial)

Nilalaman


Maaari mo ring gamitin ang Text Recognition API bilang batayan para sa mga application ng pagsasalin, o mga serbisyo sa pag-access kung saan maaaring ituro ng gumagamit ang kanilang camera sa anumang teksto na pinaglaban nila, at ipabasa ito nang malakas sa kanila.

Sa tutorial na ito, ilalagay namin ang pundasyon para sa isang malawak na hanay ng mga makabagong tampok, sa pamamagitan ng paglikha ng isang app na maaaring kunin ang teksto mula sa anumang imahe sa gallery ng gumagamit. Kahit na hindi namin ito sakop sa tutorial na ito, maaari mo ring makuha ang teksto mula sa paligid ng gumagamit sa real time, sa pamamagitan ng pagkonekta sa application na ito sa camera ng aparato.

Sa aparato o sa ulap?

Ang ilan sa mga ML Kit API ay magagamit lamang sa aparato, ngunit ang ilan ay magagamit sa aparato at sa ulap, kasama ang Text Recognition API.

Ang mai-based na API ng Teksto ay maaaring makilala ang isang mas malawak na hanay ng mga wika at character, at nangangako ng higit na katumpakan kaysa sa katapat nitong nasa aparato. Gayunpaman, ito ay nangangailangan ng isang aktibong koneksyon sa Internet, at magagamit lamang para sa mga proyekto na antas ng Blaze.


Sa artikulong ito, tatakbo kami sa Text Recognition API sa lokal, kaya maaari kang sumunod kahit na kung na-upgrade ka na sa Blaze, o nasa plano ka ng libreng Firebase Spark.

Lumilikha ng isang app ng pagkilala sa teksto gamit ang ML Kit

Lumikha ng isang application kasama ang mga setting ng iyong napili, ngunit kapag sinenyasan piliin ang template na "Walang laman na Gawain".

Ang ML Kit SDK ay bahagi ng Firebase, kaya kakailanganin mong ikonekta ang iyong proyekto sa Firebase, gamit ang sertipiko ng pag-sign SHA-1. Upang makuha ang SHA-1 ng iyong proyekto:

  • Piliin ang tab na "Gradle" ng Android Studio.
  • Sa panel na "Mga proyekto ng Gradle", i-double-click upang mapalawak ang "ugat" ng iyong proyekto, at pagkatapos ay piliin ang "Mga Gawain> Android> Pag-sign Report."
  • Ang panel sa ilalim ng window ng Android Studio ay dapat i-update upang ipakita ang ilang impormasyon tungkol sa proyektong ito - kasama na ang sertipiko ng pag-sign SHA-1.


Upang ikonekta ang iyong proyekto sa Firebase:

  • Sa iyong web browser, ilunsad ang Firebase Console.
  • Piliin ang "Magdagdag ng proyekto."
  • Bigyan ang iyong proyekto ng isang pangalan; Gumagamit ako ng "ML Test."
  • Basahin ang mga termino at kundisyon, at kung natutuwa kang magpatuloy pagkatapos piliin ang "Tanggapin ko ..." kasunod ng "Lumikha ng proyekto."
  • Piliin ang "Magdagdag ng Firebase sa iyong Android app."
  • Ipasok ang pangalan ng package ng iyong proyekto, na makikita mo sa tuktok ng file ng MainActivity, at sa loob ng Manifest.
  • Ipasok ang sertipiko ng pag-sign SHA-1 ng iyong proyekto.
  • I-click ang "Magrehistro app."
  • Piliin ang "I-download ang google-services.json." Ang file na ito ay naglalaman ng lahat ng kinakailangang Firebase metadata para sa iyong proyekto, kasama ang API key.
  • Sa Android Studio, i-drag at i-drop ang google-services.json file sa direktoryo na "app" ng iyong proyekto.

  • Buksan ang iyong file na antas ng build.gradle ng proyekto at idagdag ang classpath ng mga serbisyo ng Google:

classpath com.google.gms: google-services: 4.0.1

  • Buksan ang iyong file na antas ng build.gradle ng app, at magdagdag ng mga dependencies para sa Firebase Core, Firebase ML Vision at tagasalin ng modelo, kasama ang plugin ng mga serbisyo ng Google:

mag-apply ng plugin: com.google.gms.google-services ... ... ... dependencies {implement fileTree (dir: libs, kasama ang:) pagpapatupad com.google.firebase: firebase-core: 16.0.1 pagpapatupad com. google.firebase: firebase-ml-vision: 16.0.0 pagpapatupad com.google.firebase: firebase-ml-model-tagasalin: 16.0.0

Sa puntong ito, kakailanganin mong patakbuhin ang iyong proyekto upang maaari itong kumonekta sa mga Firebase server:

  • I-install ang iyong app sa alinman sa isang pisikal na Android smartphone o tablet, o isang Android Virtual Device (AVD).
  • Sa Firebase Console, piliin ang "Run app upang i-verify ang pag-install."
  • Pagkaraan ng ilang sandali, dapat kang makakita ng isang "Binabati kita"; piliin ang "Magpatuloy sa console."

I-download ang mga pre-sanay na machine learning ng Google

Bilang default, mai-download lamang ng ML Kit ang mga modelo at kung kailan kinakailangan, kaya i-download ng aming app ang modelo ng OCR kapag sinubukan ng gumagamit na kunin ang teksto sa unang pagkakataon.

Ito ay maaaring magkaroon ng negatibong epekto sa karanasan ng gumagamit - isipin ang pagsisikap na mag-access sa isang tampok, lamang upang matuklasan na ang app ay kailangang mag-download ng higit pang mga mapagkukunan bago ito tunay na maihatid ang tampok na ito. Sa pinakapangit na sitwasyon ng kaso, maaaring hindi ma-download ng iyong app ang mga mapagkukunan na kailangan nito, kapag kailangan nito ang mga ito, halimbawa kung ang aparato ay walang koneksyon sa Internet.

Upang matiyak na hindi ito mangyayari sa aming app, i-download ko ang kinakailangang modelo ng OCR sa install-time, na nangangailangan ng ilang mga pagbabago sa Maniest.

Habang binubuksan namin ang Manifest, idadagdag ko rin ang pahintulot ng WRITE_EXTERNAL_STORAGE, na gagamitin namin ito sa paglaon sa tutorial na ito.

// Idagdag ang pahintulot sa WRITE_EXTERNAL_STORAGE // // Idagdag ang sumusunod na //

Pagbuo ng layout

Alisin natin ang madaling bagay, at lumikha ng isang layout na binubuo ng:

  • Isang LarawanView. Sa una, magpapakita ito ng isang placeholder, ngunit mai-update ito kapag napili ng gumagamit ang isang imahe mula sa kanilang gallery.
  • Isang Button, na nag-trigger sa pagkuha ng teksto.
  • Isang TextView, kung saan ipapakita namin ang nakuha na teksto.
  • Isang scroll. Dahil walang garantiya na ang nakuha na teksto ay magkasya nang maayos sa onscreen, ilalagay ko ang TextView sa loob ng isang scroll.

Narito ang natapos na activity_main.xml file:

Ang layout na ito ay tumutukoy sa isang "ic_placeholder" na iguhit, kaya't gawin ito ngayon:

  • Piliin ang "File> Bago> Image Asset" mula sa tool ng Android Studio.
  • Buksan ang "Icon Type" na pagbagsak at piliin ang "Mga Aksyon Bar at Mga Icon ng Tab."
  • Tiyaking napili ang pindutan ng "Clip Art" sa radio.
  • Bigyan ang isang pindutan ng "Clip Art" sa isang pag-click.
  • Piliin ang imahe na nais mong gamitin bilang iyong tagalalagyan; Gumagamit ako ng "Idagdag sa mga larawan."
  • I-click ang "OK."
  • Buksan ang "Tema" na pagbagsak, at piliin ang "HOLO_LIGHT."
  • Sa patlang na "Pangalan,", ipasok ang "ic_placeholder."
  • I-click ang "Susunod." Basahin ang impormasyon, at kung natutuwa kang magpatuloy pagkatapos ay i-click ang "Tapos na."

Mga icon ng aksyon sa bar: Inilunsad ang Gallery app

Susunod, gagawa ako ng isang item ng action bar na ilulunsad ang gallery ng gumagamit, handa na para sa kanila na pumili ng isang imahe.

Tinukoy mo ang mga icon ng aksyon ng bar sa loob ng isang file na mapagkukunan ng menu, na nakatira sa loob ng direktoryo na "res / menu". Kung ang iyong proyekto ay hindi naglalaman ng direktoryo na ito, kakailanganin mong likhain ito:

  • I-control-click ang direktoryo ng "res" ng iyong proyekto at piliin ang "Bago> Direktor ng Android mapagkukunan."
  • Buksan ang "Uri ng mapagkukunan" na pagbagsak at piliin ang "menu."
  • Ang "pangalan ng Direktoryo" ay dapat awtomatikong i-update sa "menu", ngunit kung hindi ito kakailanganin mong pangalanan nang manu-mano.
  • I-click ang "OK."

Handa ka na ngayong lumikha ng file file na mapagkukunan:

  • I-control-click ang direktoryo ng "menu" ng iyong proyekto at piliin ang "Bago> file na mapagkukunan ng Menu."
  • Pangalan ng file na ito "my_menu."
  • I-click ang "OK."
  • Buksan ang file na "my_menu.xml", at idagdag ang sumusunod:

// Lumikha ng isang elemento para sa bawat aksyon //

Ang menu file ay sumangguni sa isang "action_gallery" string, kaya buksan ang res / halaga / strings.xml file ng iyong proyekto at lumikha ng mapagkukunang ito. Habang narito ako, tinukoy ko rin ang iba pang mga string na gagamitin namin sa buong proyektong ito.

Gallery Ang app na ito ay kailangang ma-access ang mga file sa iyong aparato. Walang nahanap na teksto

Susunod, gamitin ang Image Asset Studio upang lumikha ng icon na "ic_gallery" ng bar ng aksyon:

  • Piliin ang "File> Bago> Image Asset."
  • Itakda ang pagbaba ng "Icon Type" sa "Aksyon Bar at Mga Icon ng Tab."
  • I-click ang pindutan ng "Art Art".
  • Pumili ng isang drawable; Gumagamit ako ng "imahe."
  • I-click ang "OK."
  • Upang matiyak na ang icon na ito ay malinaw na nakikita sa aksyon bar, buksan ang "Tema" na pagbagsak at piliin ang "HOLO_DARK."
  • Pangalanan ang icon na ito "ic_gallery."
  • "I-click ang" Susunod, "kasunod ng" Tapos na. "

Ang paghawak ng mga kahilingan sa pahintulot at i-click ang mga kaganapan

Gagampanan ko ang lahat ng mga gawain na hindi direktang nauugnay sa Text Recognition API sa isang hiwalay na klase ng BaseActivity, kabilang ang pag-uugali sa menu, paghawak ng mga pag-click sa aksyon sa bar ng aksyon, at humiling ng pag-access sa imbakan ng aparato.

  • Piliin ang "File> Bago> klase ng Java" mula sa toolbar ng Android Studio.
  • Pangalanan ang klase na "BaseActivity."
  • I-click ang "OK."
  • Buksan ang BaseActivity, at idagdag ang sumusunod:

i-import ang android.app.Activity; import ang android.support.v4.app.ActivityCompat; i-import ang android.support.v7.app.ActionBar; i-import ang android.support.v7.app.AlertDialog; i-import ang android.support.v7.app.AppCompatActivity; i-import ang android.os.Bundle; i-import ang android.content.DialogInterface; mag-import ng android.content.Intent; mag-import ng android.Manifest; i-import ang android.provider.MediaStore; i-import ang android.view.Menu; i-import ang android.view.MenuItem; i-import ang android.content.pm.PackageManager; i-import ang android.net.Uri; i-import ang android.provider.Settings; i-import ang android.support.annotation.NonNull; i-import ang android.support.annotation.Nullable; pag-import ng java.io.File; pampublikong klase na BaseActivity ay umaabot ng AppCompatActivity {public static final int WRITE_STORAGE = 100; pampublikong static na panghuling int SELECT_PHOTO = 102; pampublikong static na pangwakas na String ACTION_BAR_TITLE = "action_bar_title"; pampublikong larawan ng File; Protektado ng @Override na walang bisa saCreate (@Nullable Bundle saveInstanceState) {super.onCreate (saveInstanceState); AksyonBar actionBar = getSupportActionBar (); kung (aksyonBar! = null) {actionBar.setDisplayHomeAsUpEnabled (totoo); aksyonBar.setTitle (getIntent (). getStringExtra (ACTION_BAR_TITLE)); }} @Override public boolean onCreateOptionsMenu (menu ng menu) {getMenuInflater (). Inflate (R.menu.my_menu, menu); bumalik totoo; } @Override public boolean onOptionsItemSelected (MenuItem item) {switch (item.getItemId ()) {// Kung ang "gallery_action" ay napili, kung gayon ... // kaso R.id.gallery_action: //...check mayroon kami ang pahintulot ng WRITE_STORAGE // checkPermission (WRITE_STORAGE); pahinga; } ibalik ang super.onOptionsItemSelected (item); } @Override pampublikong walang bisa saRequestPermissionsResult (int requestCode, @NonNull String permiso, @NonNull int grantResults) {super.onRequestPermissionsResult (kahilinganCode, pahintulot, bigyanResults); lumipat (requestCode) {kaso WRITE_STORAGE: // Kung ang kahilingan ng pahintulot ay ipinagkaloob, pagkatapos ... // kung (bigyanResults.length> 0 && GrantResults == PackageManager.PERMISSION_GRANTED) {//...call selectPicture // selectPicture ( ); // Kung ang kahilingan sa pahintulot ay tinanggihan, pagkatapos ... //} iba pa {//..Paglarawan ang string ng "permiso_request" // kahilinganPermission (ito, kahilinganCode, R.stringpool_request); } pahinga; }} // Ipakita ang dialog ng kahilingan sa pahintulot // pampublikong static na walang kahilinganPagpasya (panghuling aktibidad ng Aktibidad, panghuling int requestCode, int msg) {AlertDialog.Builder alert = bagong AlertDialog.Builder (aktibidad); alerto.set (msg); alert.setPositive Button (android.R.string.ok, bagong DialogInterface.OnClickListener () {@Override pampublikong walang bisa saClick (DialogInterface DialInterface, int i) {dialogInterface.dismiss (); Intent permissonIntent = bagong intent (Settings.ACTION_APPLIC) .setData (Uri.parse ("package:" + aktibidad.getPackageName ())); activity.startActivityForResult (permissonIntent, requestCode);}}); alert.setNegativeButton (android.R.string.cancel, bagong DialogInterface.OnClickListener () {@Override pampublikong walang bisa saClick (DialogInterface DialInterface, int i) {dialogInterface.dismiss ();}}); alerto.setCancelable (maling); alerto.show (); } / Suriin kung binigyan ng gumagamit ang pahintulot ng WRITE_STORAGE // pampublikong walang bisa na tsekePermission (int requestCode) {switch (requestCode) {case WRITE_STORAGE: int hasWriteExternalStoragePermission = AktibidadCompat.checkSelfPermission (ito, Manifestilde.WRITE_EXTERNAL_STORAGE); // Kung mayroon kaming access sa panlabas na imbakan ... // kung (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//...call selectPicture, na naglulunsad ng isang Aktibidad kung saan ang gumagamit ay maaaring pumili ng isang imahe // selectPicture (); // Kung hindi binigyan ang pahintulot, kung gayon ... //} iba pa {//...request ang pahintulot // AktibidadCompat.requestPermissions (ito, bagong String {Manifestopher.WRITE_EXTERNAL_STORAGE}, kahilingan sa Code); } pahinga; }} pribadong walang bisa pilingPicture () {larawan = MyHelper.createTempFile (larawan); Layon ng intensyon = bagong Intent (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // Magsimula ng isang Aktibidad kung saan ang gumagamit ay maaaring pumili ng isang imahe // startActivityForResult (intensyon, SELECT_PHOTO); }}

Sa puntong ito, dapat magreklamo ang iyong proyekto na hindi nito malulutas ang MyHelper.createTempFile. Ipatupad ito ngayon!

Pagbabago ng mga imahe gamit ang createTempFile

Lumikha ng isang bagong "MyHelper" na klase. Sa klase na ito, susukat namin ang napiling imahe ng gumagamit, handa nang maproseso ng Text Recognition API.

mag-import ng android.graphics.Bitmap; i-import ang android.graphics.BitmapFactory; mag-import ng android.content.Context; i-import ang android.database.Cursor; i-import ang android.os.Eningaan; mag-import ng android.widget.ImageView; i-import ang android.provider.MediaStore; i-import ang android.net.Uri; i-import ang static na android.graphics.BitmapFactory.decodeFile; mag-import ng static na android.graphics.BitmapFactory.decodeStream; pag-import ng java.io.File; i-import ang java.io.FileNotFoundException; i-import ang java.io.FileOutputStream; pag-import ng java.io.IOException; pampublikong klase MyHelper {public static String getPath (Konteksto ng konteksto, Uri ng Uri) {String path = ""; String projection = {MediaStore.Images.Media.DATA}; Cursor cursor = konteksto.getContentResolver () query query (uri, projection, null, null, null); int column_index; kung (cursor! = null) {column_index = cursor.getColumnIndexOrThrow (MediaStore.Images.Media.DATA); cursor.moveToFirst (); landas = cursor.getString (haligi_index); cursor.close (); } landas ng pagbabalik; } pampublikong static na File lumikhaTempFile (File file) {File directory = new File (Environment.getExternalStorageDirectory (). getPath () + "/com.jessicathornsby.myapplication"); kung (! directory.exists () ||! direktoryo.isDirectory ()) {directory.mkdirs (); } kung (file == null) {file = bagong File (direktoryo, "origin.jpg"); } ibalik na file; } pampublikong static na Bitmap muling baguhin ang lakiPhoto (File imageFile, Konteksto ng konteksto, Uri ng Uri, view ng ImageView) {BitmapFactory.Options newOptions = bagong BitmapFactory.Options (); subukan ang {decodeStream (konteksto.getContentResolver (). openInputStream (uri), null, newOptions); int photoHeight = newOptions.outHeight; int photoWidth = newOptions.outWidth; newOptions.inSampleSize = Math.min (photoWidth / view.getWidth (), larawanHaba / view.getHeight ()); ibalik ang compressPhoto (imageFile, BitmapFactory.decodeStream (konteksto.getContentResolver (). openInputStream (uri), null, newOptions)); } mahuli (FileNotFoundException exception) {exception.printStackTrace (); bumalik null; }} pampublikong static na Bitmap baguhin ang lakiPhoto (File imageFile, String path, ImageView view) {Mga pagpipilian sa BitmapFactory.Options = bagong BitmapFactory.Options (); decodeFile (landas, mga pagpipilian); int photoHeight = options.outHeight; int photoWidth = options.outWidth; options.inSampleSize = Math.min (photoWidth / view.getWidth (), larawanHabang / view.getHeight ()); ibalik ang compressPhoto (imageFile, BitmapFactory.decodeFile (landas, mga pagpipilian)); } pribadong static na Bitmap compressPhoto (File photoFile, Bitmap bitmap) {subukan {FileOutputStream fOutput = bagong FileOutputStream (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } mahuli (pagbubukod ng IOException) {exception.printStackTrace (); } ibalik ang bitmap; }}

Itakda ang imahe sa isang ImageView

Susunod, kailangan nating ipatupad angActivityResult () sa aming klase sa MainActivity, at itakda ang napiling imahe ng gumagamit sa aming ImageView.

mag-import ng android.graphics.Bitmap; i-import ang android.os.Bundle; mag-import ng android.widget.ImageView; mag-import ng android.content.Intent; mag-import ng android.widget.TextView; i-import ang android.net.Uri; pampublikong klase MainActivity ay nagpapalawak ng BaseActivity {pribadong Bitmap myBitmap; pribadong LarawanView myImageView; pribadong TextView myTextView; Protektado ng @Override na walang bisa saCreate (Bundle saveInstanceState) {super.onCreate (saveInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); } @Override protektado walang bisa saActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (kahilinganCode, resultCode, data); kung (resultCode == RESULT_OK) {switch (requestCode) {kaso WRITE_STORAGE: checkPermission (requestCode); pahinga; kaso SELECT_PHOTO: Uri ng dataUri = data.getData (); String path = MyHelper.getPath (ito, dataUri); kung (path == null) {myBitmap = MyHelper.resizePhoto (larawan, ito, dataUri, myImageView); } iba pa {myBitmap = MyHelper.resizePhoto (larawan, landas, myImageView); } kung (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } pahinga; }}}}

Patakbuhin ang proyektong ito sa isang pisikal na aparato ng Android o AVD, at bigyan ang pag-click sa icon ng aksyon. Kapag sinenyasan, bigyan ng pahintulot ang WRITE_STORAGE at pumili ng isang imahe mula sa gallery; dapat ipakita ang imaheng ito sa UI ng iyong app.

Ngayon inilatag namin ang saligan, handa na kaming magsimulang mag-alis ng ilang teksto!

Nagtuturo ng isang app upang makilala ang teksto

Gusto kong mag-trigger ng pagkilala sa teksto bilang tugon sa isang kaganapan sa pag-click, kaya kailangan nating ipatupad ang isang OnClickListener:

mag-import ng android.graphics.Bitmap; i-import ang android.os.Bundle; mag-import ng android.widget.ImageView; mag-import ng android.content.Intent; mag-import ng android.widget.TextView; i-import ang android.view.View; i-import ang android.net.Uri; pampublikong klase na MainActivity ay nagpapalawak ng BaseActivity na nagpapatupad ng View.OnClickListener {private Bitmap myBitmap; pribadong LarawanView myImageView; pribadong TextView myTextView; Protektado ng @Override na walang bisa saCreate (Bundle saveInstanceState) {super.onCreate (saveInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); hanapinViewById (R.id.checkText) .setOnClickListener (ito); } @Override pampublikong walang bisa saMag-click (Tingnan ang view) {switch (view.getId ()) {case R.id.checkText: kung (myBitmap! = Null) {// Isasagawa namin ang pagpapatakbo ng runTextRecog sa susunod na hakbang // runTextRecog (); } pahinga; }}

Maaari lamang iproseso ng ML Kit ang mga imahe kapag nasa format sila ng FirebaseVisionImage, kaya kailangan nating i-convert ang aming imahe sa isang bagay na FirebaseVisionImage. Maaari kang lumikha ng isang FirebaseVisionImage mula sa isang Bitmap, media.Image, ByteBuffer, o isang byte na hanay. Dahil nakikipagtulungan kami sa Bitmaps, kailangan naming tawagan ang mula saBebyment () na paraan ng utility ng klase ng FirebaseVisionImage, at ipasa ito sa aming Bitmap.

pribadong walang bisa runTextRecog () {Larawan ng FirebaseVisionImage = FirebaseVisionImage.fromBitmap (myBitmap);

Ang ML Kit ay may iba't ibang klase ng detektor para sa bawat isa sa mga operasyon ng pagkilala sa imahe nito. Para sa teksto, kailangan nating gamitin ang klase ng FirebaseVisionTextDetector, na nagsasagawa ng pagkilala sa optical character (OCR) sa isang imahe.

Lumilikha kami ng isang halimbawa ng FirebaseVisionTextDetector, gamit ang getVisionTextDetector:

FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). MakakuhaVisionTextDetector ();

Susunod, kailangan nating suriin ang FirebaseVisionImage para sa teksto, sa pamamagitan ng pagtawag sa paraan ng tikmanInImage () at ipasa ang bagay na FirebaseVisionImage. Kailangan din nating ipatupad saSuccess at onFailure callbacks, kasama ang mga kaukulang tagapakinig upang ma-notify ang aming app tuwing magagamit ang mga resulta.

detector.detectInImage (imahe) .addOnSuccessListener (bagong OnSuccessListener() {@Override // To do //}}). AddOnFailureListener (bagong OnFailureListener () {@Override pampublikong walang bisa saFailure (@NonNull Pagbubukod ng pagbubukod) {// Task fail failed with a exception //}}); }

Kung nabigo ang operasyon na ito, pagkatapos ay magpapakita ako ng isang toast, ngunit kung ang operasyon ay isang tagumpay, tatawag ako ng prosesoExtractedText na may tugon.

Sa puntong ito, ang aking code ng deteksyon ng teksto ay ganito:

// Lumikha ng isang FirebaseVisionImage // pribadong walang bisa runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); // Lumikha ng isang halimbawa ng FirebaseVisionCloudTextDetector // FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). GetVisionTextDetector (); // Magrehistro ng isang OnSuccessListener // detector.detectInImage (imahe) .addOnSuccessListener (bagong OnSuccessListener() {@Override // Ipatupad ang onSuccess callback // public void onSuccess (FirebaseVisionText na teksto) {// Call processExtractedText with the response // processExtractedText (text); }}). addOnFailureListener (bagong OnFailureListener () {@Override // Ipatupad ang onFailure calback // public void onFailure (@NonNull Exception exception) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) .show ( );}}); }

Tuwing natatanggap ang aming app ng isang abiso sa onSuccess, kailangan nating i-parse ang mga resulta.

Ang isang FirebaseVisionText na bagay ay maaaring maglaman ng mga elemento, linya at bloke, kung saan ang bawat bloke ay karaniwang katumbas sa isang solong talata ng teksto. Kung ibabalik ng FirebaseVisionText ang 0 bloke, ipapakita namin ang string na "no_text", ngunit kung naglalaman ito ng isa o higit pang mga bloke ay ipapakita namin ang nakuha na teksto bilang bahagi ng aming TextView.

pribadong walang bisa na prosesoExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); kung (firebaseVisionText.getBlocks () laki ng () == 0) {myTextView.setText (R.string.no_text); bumalik; } para sa (FirebaseVisionText.Block block: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Narito ang nakumpletong code ng MainActivity:

mag-import ng android.graphics.Bitmap; i-import ang android.os.Bundle; mag-import ng android.widget.ImageView; mag-import ng android.content.Intent; mag-import ng android.widget.TextView; mag-import ng android.widget.Toast; i-import ang android.view.View; i-import ang android.net.Uri; i-import ang android.support.annotation.NonNull; import com.google.firebase.ml.vision.common.FirebaseVisionImage; import com.google.firebase.ml.vision.text.FirebaseVisionText; import com.google.firebase.ml.vision.text.FirebaseVisionTextDetector; import com.google.firebase.ml.vision.FirebaseVision; import com.google.android.gms.tasks.OnSuccessListener; import com.google.android.gms.tasks.OnFailureListener; pampublikong klase na MainActivity ay nagpapalawak ng BaseActivity na nagpapatupad ng View.OnClickListener {private Bitmap myBitmap; pribadong LarawanView myImageView; pribadong TextView myTextView; Protektado ng @Override na walang bisa saCreate (Bundle saveInstanceState) {super.onCreate (saveInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); hanapinViewById (R.id.checkText) .setOnClickListener (ito); } @Override pampublikong walang bisa saMag-click (Tingnan ang view) {switch (view.getId ()) {case R.id.checkText: kung (myBitmap! = Null) {runTextRecog (); } pahinga; }} @Override protektado walang bisa saActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (kahilinganCode, resultCode, data); kung (resultCode == RESULT_OK) {switch (requestCode) {kaso WRITE_STORAGE: checkPermission (requestCode); pahinga; kaso SELECT_PHOTO: Uri ng dataUri = data.getData (); String path = MyHelper.getPath (ito, dataUri); kung (path == null) {myBitmap = MyHelper.resizePhoto (larawan, ito, dataUri, myImageView); } iba pa {myBitmap = MyHelper.resizePhoto (larawan, landas, myImageView); } kung (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } pahinga; }}} pribadong walang bisa runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); FirebaseVisionTextDetector detector = FirebaseVision.getInstance (). MakakuhaVisionTextDetector (); detector.detectInImage (imahe) .addOnSuccessListener (bagong OnSuccessListener() {@Override pampublikong walang bisa saSuccess (FirebaseVisionText na teksto) {processExtractedText (mga teksto); }}). addOnFailureListener (bagong OnFailureListener () {@Override pampublikong walang bisa saFailure (@NonNull Exception exception) {Toast.makeText (MainActivity.this, "Exception", Toast.LENGTH_LONG) .show ();}}); } pribadong walang bisa na prosesoExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); kung (firebaseVisionText.getBlocks () laki ng () == 0) {myTextView.setText (R.string.no_text); bumalik; } para sa (FirebaseVisionText.Block block: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

Pagsubok sa proyekto

Ngayon na oras upang makita ang Pagkilala sa Teksto ng ML Kit na kumikilos! I-install ang proyektong ito sa isang aparato ng Android o AVD, pumili ng isang imahe mula sa gallery, at pagkatapos ay bigyan ang pindutang "Suriin ang teksto" sa isang tap. Ang app ay dapat tumugon sa pamamagitan ng pagkuha ng lahat ng teksto mula sa imahe, at pagkatapos ay ipakita ito sa isang TextView.

Tandaan na depende sa laki ng iyong imahe, at ang halaga ng teksto na nilalaman nito, maaaring kailangan mong mag-scroll upang makita ang lahat ng nakuha na teksto.

Maaari mo ring i-download ang nakumpletong proyekto mula sa GitHub.

Pagputol

Alam mo na kung paano makita at kunin ang teksto mula sa isang imahe, gamit ang ML Kit.

Ang Text Recognition API ay isang bahagi lamang ng ML Kit. Nag-aalok din ang SDK na ito ng barcode scanning, deteksyon ng mukha, pag-label ng imahe at pagkilala sa landmark, na may mga plano upang magdagdag ng higit pang mga API para sa mga karaniwang kaso ng mobile na paggamit, kabilang ang Smart Sumagot at isang high-density face contour API.

Aling ML Kit API ang pinaka interesado mong subukan? Ipaalam sa amin sa mga komento sa ibaba!

Mga modernong negoyo tumakbo a data, ngunit ang problema ay ang data ay maaaring mapurol. Ang iang abalang exec ay hindi nai na baahin ang mga pahina at mga pahina ng mga preadheet; guto nila mailaraw...

Kung papunta ka a ligaw o naghahanap ka lang ng bago emergency flahlight para a iyong puno ng kahoy, ang koponan ng AAPick ay natagpuan ang iang nagpapakilaw deal.Para a uunod na ilang araw a Tech Dea...

Fresh Publications.