Google के मशीन लर्निंग एसडीके के साथ छवियों से पाठ कैसे निकालें

लेखक: John Stephens
निर्माण की तारीख: 27 जनवरी 2021
डेट अपडेट करें: 5 जुलाई 2024
Anonim
Learn Cloud Basics & Cloud Career Path Selection | Career Switch Training EP 1
वीडियो: Learn Cloud Basics & Cloud Career Path Selection | Career Switch Training EP 1

विषय


आप टेक्स्ट रिकॉग्निशन API का उपयोग अनुवाद ऐप्स, या एक्सेसिबिलिटी सेवाओं के आधार के रूप में भी कर सकते हैं, जहाँ उपयोगकर्ता अपने कैमरे को किसी भी ऐसे टेक्स्ट से इंगित कर सकते हैं, जिनसे वे संघर्ष कर रहे हैं, और यह उनके लिए जोर से पढ़ा है।

इस ट्यूटोरियल में, हम एक नई श्रेणी की नई सुविधाओं के लिए आधारशिला रखते हैं, एक ऐप बनाकर, जो उपयोगकर्ता की गैलरी में किसी भी छवि से पाठ को निकाल सकता है। हालाँकि हम इसे इस ट्यूटोरियल में शामिल नहीं कर रहे हैं, आप इस एप्लिकेशन को डिवाइस के कैमरे से जोड़कर, वास्तविक समय में उपयोगकर्ता के परिवेश से पाठ कैप्चर कर सकते हैं।

डिवाइस पर या क्लाउड में?

एमएल किट एपीआई में से कुछ केवल ऑन-डिवाइस उपलब्ध हैं, लेकिन कुछ टेक्स्ट रिकग्निशन एपीआई सहित ऑन-डिवाइस और क्लाउड में उपलब्ध हैं।

क्लाउड-आधारित टेक्स्ट एपीआई भाषाओं और पात्रों की एक विस्तृत श्रृंखला की पहचान कर सकता है, और इसके ऑन-डिवाइस समकक्ष की तुलना में अधिक सटीकता का वादा करता है। हालांकि यह कर देता है एक सक्रिय इंटरनेट कनेक्शन की आवश्यकता है, और यह केवल ब्लेज़-स्तरीय परियोजनाओं के लिए उपलब्ध है।


इस लेख में, हम स्थानीय रूप से टेक्स्ट रिकॉग्निशन API चला रहे हैं, इसलिए चाहे आप ब्लेज़ में अपग्रेड किए गए हों, या आप फ्री फायरबेस स्पार्क प्लान पर ध्यान दिए बिना इसका अनुसरण कर सकते हैं।

एमएल किट के साथ एक पाठ पहचान ऐप बनाना

अपनी पसंद की सेटिंग्स के साथ एक एप्लिकेशन बनाएं, लेकिन संकेत दिए जाने पर "खाली गतिविधि" टेम्पलेट चुनें।

ML किट SDK Firebase का हिस्सा है, इसलिए आपको अपने SHA-1 हस्ताक्षर प्रमाणपत्र का उपयोग करके अपने प्रोजेक्ट को Firebase से कनेक्ट करना होगा। अपने प्रोजेक्ट का SHA-1 प्राप्त करने के लिए:

  • Android Studio का "ग्रेड" टैब चुनें।
  • "ग्रैडल प्रोजेक्ट्स" पैनल में, अपनी परियोजना के "रूट" का विस्तार करने के लिए डबल-क्लिक करें और फिर "कार्य> एंड्रॉइड> साइनिंग रिपोर्ट" का चयन करें।
  • एंड्रॉइड स्टूडियो विंडो के नीचे के पैनल को इस प्रोजेक्ट के बारे में कुछ जानकारी प्रदर्शित करने के लिए अपडेट करना चाहिए - जिसमें इसके SHA-1 हस्ताक्षर प्रमाणपत्र शामिल हैं।


अपने प्रोजेक्ट को फायरबेस से जोड़ने के लिए:

  • अपने वेब ब्राउज़र में, फायरबेस कंसोल को लॉन्च करें।
  • "प्रोजेक्ट जोड़ें" चुनें।
  • अपने प्रोजेक्ट को एक नाम दें; मैं "एमएल टेस्ट" का उपयोग कर रहा हूं
  • नियम और शर्तें पढ़ें, और यदि आप आगे बढ़ना चाहते हैं, तो "मैं स्वीकार करता हूं ..." का चयन करें और उसके बाद "प्रोजेक्ट बनाएं।"
  • "अपने Android ऐप में फायरबेस जोड़ें" चुनें।
  • अपनी परियोजना का पैकेज नाम दर्ज करें, जिसे आप MainActivity फ़ाइल के शीर्ष पर और Manifest के अंदर पाएंगे।
  • अपनी परियोजना का SHA-1 हस्ताक्षर प्रमाणपत्र दर्ज करें।
  • "रजिस्टर ऐप" पर क्लिक करें।
  • "डाउनलोड करें google-services.json।" चुनें इस फ़ाइल में एपीआई कुंजी सहित आपकी परियोजना के लिए सभी आवश्यक फायरबेस मेटाडेटा हैं।
  • एंड्रॉइड स्टूडियो में, अपनी परियोजना की "एप्लिकेशन" निर्देशिका में google-services.json फ़ाइल को खींचें और छोड़ें।

  • अपनी प्रोजेक्ट-लेवल बिल्ड.ग्रेड फ़ाइल खोलें और Google सेवाओं को क्लासपाथ में जोड़ें:

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

  • अपनी ऐप-स्तरीय बिल्ड.ग्रेड फ़ाइल खोलें, और फायरबेस कोर, फायरबेस एमएल विजन और मॉडल दुभाषिया के लिए निर्भरताएं जोड़ें, और Google सेवाओं का प्लगइन:

प्लगइन लागू करें: com.google.gms.google-services ... ... ... निर्भरताएँ {कार्यान्वयन फ़ाइलट्री (dir: libs, शामिल हैं:) कार्यान्वयन com.google.firebase: firebase-core: 16.0.1 कार्यान्वयन कॉम। google.firebase: firebase-ml-vision: 16.0.0 कार्यान्वयन com.google.firebase: firebase-ml-model-दुभाषिया: 16.0.0

इस बिंदु पर, आपको अपनी परियोजना चलाने की आवश्यकता होगी ताकि वह फायरबेस सर्वर से कनेक्ट हो सके:

  • अपने एप्लिकेशन को किसी भौतिक Android स्मार्टफ़ोन या टैबलेट, या Android वर्चुअल डिवाइस (AVD) पर इंस्टॉल करें।
  • फायरबेस कंसोल में, इंस्टॉलेशन को सत्यापित करने के लिए "रन ऐप चुनें"।
  • कुछ क्षणों के बाद, आपको "बधाई" देखना चाहिए; "कंसोल पर जारी रखें" चुनें।

Google के पूर्व-प्रशिक्षित मशीन लर्निंग मॉडल डाउनलोड करें

डिफ़ॉल्ट रूप से, एमएल किट केवल तब और जब वे आवश्यक मॉडल डाउनलोड करते हैं, इसलिए जब उपयोगकर्ता पहली बार पाठ निकालने का प्रयास करता है, तो हमारा ऐप ओसीआर मॉडल डाउनलोड करेगा।

यह संभावित रूप से उपयोगकर्ता के अनुभव पर नकारात्मक प्रभाव डाल सकता है - एक सुविधा तक पहुंचने की कोशिश करने की कल्पना करें, केवल यह पता लगाने के लिए कि ऐप को वास्तव में इस सुविधा को वितरित करने से पहले अधिक संसाधन डाउनलोड करना होगा। सबसे खराब स्थिति में, आपका ऐप उन संसाधनों को डाउनलोड करने में भी सक्षम नहीं हो सकता है, जिनकी आवश्यकता है, जब उन्हें इसकी आवश्यकता होती है, उदाहरण के लिए यदि डिवाइस में कोई इंटरनेट कनेक्शन नहीं है।

यह सुनिश्चित करने के लिए कि यह हमारे ऐप के साथ नहीं होता है, मैं आवश्यक OCR मॉडल को इंस्टॉल-टाइम पर डाउनलोड करने जा रहा हूं, जिसके लिए Maniest में कुछ बदलाव करने की आवश्यकता है।

जबकि हमारे पास मेनिफेस्ट खुला है, मैं WRITE_EXTERNAL_STORAGE अनुमति भी जोड़ने जा रहा हूं, जिसका उपयोग हम बाद में इस ट्यूटोरियल में करेंगे।

// WRITE_EXTERNAL_STORAGE अनुमति जोड़ें // // निम्नलिखित जोड़ें //

लेआउट का निर्माण

चलो आसान सामान बाहर निकालते हैं, और एक लेआउट बनाते हैं:

  • एक छवि दृश्य। प्रारंभ में, यह एक प्लेसहोल्डर प्रदर्शित करेगा, लेकिन उपयोगकर्ता द्वारा अपनी गैलरी से एक छवि का चयन करने के बाद यह अपडेट होगा।
  • एक बटन, जो पाठ निष्कर्षण को ट्रिगर करता है।
  • एक टेक्स्ट व्यू, जहां हम निकाले गए टेक्स्ट को प्रदर्शित करेंगे।
  • एक स्क्रॉल दृश्य। चूंकि निकाले गए पाठ की कोई गारंटी नहीं है, यह बड़े पैमाने पर ऑनस्क्रीन फिट होगा, मैं एक स्क्रॉल दृश्य के अंदर TextView को रखने जा रहा हूं।

यहां तैयार गतिविधि_main.xml फ़ाइल है:

यह लेआउट एक "ic_placeholder" को संदर्भित करता है, इसलिए अब इसे बनाएं:

  • Android स्टूडियो टूलबार से "फ़ाइल> नया> छवि परिसंपत्ति" चुनें।
  • "आइकन प्रकार" ड्रॉपडाउन खोलें और "एक्शन बार और टैब आइकन" चुनें।
  • सुनिश्चित करें कि "क्लिप आर्ट" रेडियो बटन चुना गया है।
  • "क्लिप आर्ट" बटन पर क्लिक करें।
  • उस छवि का चयन करें जिसे आप अपने प्लेसहोल्डर के रूप में उपयोग करना चाहते हैं; मैं "फ़ोटो में जोड़ें" का उपयोग कर रहा हूँ
  • ओके पर क्लिक करें।"
  • "थीम" ड्रॉपडाउन खोलें, और "HOLO_LIGHT" चुनें।
  • "नाम," फ़ील्ड में, "ic_placeholder" दर्ज करें।
  • "अगला" पर क्लिक करें, जानकारी पढ़ें, और यदि आप आगे बढ़ना चाहते हैं तो "समाप्त" पर क्लिक करें।

एक्शन बार आइकन: गैलरी ऐप लॉन्च करना

इसके बाद, मैं एक एक्शन बार आइटम बनाने जा रहा हूँ, जो उपयोगकर्ता की गैलरी को लॉन्च करेगा, एक छवि का चयन करने के लिए उनके लिए तैयार।

आप मेनू संसाधन फ़ाइल के अंदर एक्शन बार आइकन को परिभाषित करते हैं, जो "रिस / मेनू" निर्देशिका के अंदर रहता है। यदि आपकी परियोजना में यह निर्देशिका नहीं है, तो आपको इसे बनाने की आवश्यकता होगी:

  • अपनी परियोजना की "रिस" निर्देशिका को नियंत्रित करें और "नया> Android संसाधन निर्देशिका" चुनें।
  • "संसाधन प्रकार" ड्रॉपडाउन खोलें और "मेनू" चुनें।
  • "निर्देशिका नाम" को "मेनू" में स्वचालित रूप से अपडेट होना चाहिए, लेकिन अगर यह नहीं है तो आपको इसे मैन्युअल रूप से नाम बदलने की आवश्यकता होगी।
  • ओके पर क्लिक करें।"

अब आप मेनू संसाधन फ़ाइल बनाने के लिए तैयार हैं:

  • अपनी परियोजना की "मेनू" निर्देशिका को नियंत्रित करें और "नया> मेनू संसाधन फ़ाइल" चुनें।
  • इस फ़ाइल को "my_menu" नाम दें।
  • ओके पर क्लिक करें।"
  • "My_menu.xml" फ़ाइल खोलें, और निम्नलिखित जोड़ें:

//बनाओ हर कार्य के लिए तत्व //

मेनू फ़ाइल एक "एक्शन_गैलरी" स्ट्रिंग का संदर्भ देती है, इसलिए अपनी परियोजना के रिज / मान / स्ट्रिंग्स.xml फ़ाइल को खोलें और इस संसाधन को बनाएं। जब तक मैं यहां नहीं हूं, मैं इस पूरे प्रोजेक्ट में उपयोग किए जा रहे अन्य तारों को भी परिभाषित कर रहा हूं।

गेलरी इस एप्लिकेशन को आपके डिवाइस पर फ़ाइलों तक पहुंचने की आवश्यकता है। कोई पाठ नहीं मिला

अगला, एक्शन बार के "ic_gallery" आइकन बनाने के लिए इमेज एसेट स्टूडियो का उपयोग करें:

  • "फ़ाइल> नया> छवि संपत्ति" चुनें।
  • "आइकन प्रकार" ड्रॉपडाउन को "एक्शन बार और टैब आइकॉन" पर सेट करें।
  • "क्लिप आर्ट" बटन पर क्लिक करें।
  • एक ड्रॉबल चुनें; मैं "छवि" का उपयोग कर रहा हूं
  • ओके पर क्लिक करें।"
  • यह सुनिश्चित करने के लिए कि यह आइकन एक्शन बार में स्पष्ट रूप से दिखाई दे रहा है, "थीम" ड्रॉपडाउन खोलें और "HOLO_DARK" चुनें।
  • इस आइकन का नाम "ic_gallery।"
  • "समाप्त" पर क्लिक करें, उसके बाद "समाप्त" करें।

अनुमति अनुरोधों को हैंडल करना और ईवेंट पर क्लिक करना

मैं उन सभी कार्यों को करने जा रहा हूं, जो सीधे एक अलग बेसएक्टिविटी क्लास में टेक्स्ट रिकॉग्निशन एपीआई से संबंधित हैं, जिसमें मेनू को तत्काल बनाना, एक्शन बार क्लिक इवेंट्स को हैंडल करना और डिवाइस के स्टोरेज तक पहुंच का अनुरोध करना शामिल है।

  • Android स्टूडियो के टूलबार से "फ़ाइल> नया> जावा वर्ग" चुनें।
  • इस वर्ग का नाम "बेसएक्टिविटी" है।
  • ओके पर क्लिक करें।"
  • BaseActivity खोलें, और निम्नलिखित जोड़ें:

आयात android.app.Activity; import android.support.v4.app.ActivityCompat; आयात android.support.v7.app.ActionBar; आयात android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; आयात android.os.Bundle; आयात android.content.DialogInterface; आयात android.content.ntent; आयात android.Manifest; आयात android.provider.MediaStore; आयात android.view.Menu; आयात android.view.MenuItem; आयात android.content.pm.ackageManager; आयात android.net.Uri; आयात android.provider.Settings; import android.support.annotation.NonNull; आयात android.support.annotation.Nullable; आयात java.io.File; सार्वजनिक वर्ग बेसऐक्टिविटी का विस्तार AppCompatActivity {सार्वजनिक स्थैतिक अंतिम int WRITE_STORAGE = 100; सार्वजनिक स्थिर अंतिम int SELECT_PHOTO = 102; सार्वजनिक स्थैतिक अंतिम स्ट्रिंग ACTION_BAR_TITLE = "एक्शन_बार_टाइटल"; सार्वजनिक फाइल फोटो; @Override संरक्षित शून्य onCreate (@Nullable बंडल saveInstanceState) {super.onCreate (saveInstanceState); ActionBar actionBar = getSupportActionBar (); if (actionBar! = null) {actionBar.setDisplayHomeAsUpEnabled (सच); actionBar.setTitle (getIntent () getStringExtra (ACTION_BAR_TITLE)।); }} @Override सार्वजनिक बूलियन onCreateOptionsMenu (मेनू मेनू) {getMenuInflater () इनफ्लो करें (R.menu.my_menu, मेनू); सच लौटना; } @Override सार्वजनिक बूलियन onOptionsItemSelected (MenuItem आइटम) {स्विच (item.getItemId ()) {// यदि "गैलरी_एक्शन" चुना गया है, तो ... // मामला R.id.gallery_action: //...check हमारे पास है। WRITE_STORAGE अनुमति // checkPermission (WRITE_STORAGE); टूटना; } वापसी super.onOptionsItemSelected (आइटम); } @Override public void onRequestPeaksResult (int requestCode, @NonNull स्ट्रिंग अनुमतियां, @NonNull int allowResults) {super.onRequestPcriResult (अनुरोधकोड, अनुमतियाँ, अनुदान); स्विच (अनुरोधकोड) {मामला WRITE_STORAGE: // यदि अनुमति का अनुरोध दिया गया है, तो ... // (अगर (ResResults.length> 0 && allowResults == PackageManager.PERMISSION_GRANTED) {...Call selectPicture // selectPicture ( ); // यदि अनुमति अनुरोध से इनकार किया जाता है, तो ... //} बाकी {//..प्लीज "अनुमति_श्रेणी" स्ट्रिंग // अनुरोधप्रदर्शन (यह, अनुरोधकोड, R.string.permission_request); } टूटना; }} // अनुमति अनुरोध प्रदर्शित करें संवाद // public static void requestPermission (अंतिम गतिविधि गतिविधि, अंतिम int अनुरोधकोड, int संदेश) {AlertDialog.Builder अलर्ट = नया AlertDialog.Builder (गतिविधि); alert.set (एमएसजी); alert.setPositiveButton (android.R.string.ok, new DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {dialogInterface.dismiss (); Intent permissonIntent = new Intent (Settings)। Settings (सेटिंग्स)। .setData (Uri.parse ("पैकेज:" + activity.getPackageName ());) गतिविधि ?startActivityForResult (permissonIntent, requestCode);}}); alert.setNegativeButton (android.R.string.cancel, new DialogInterface.OnClickListener () {@Override public void onClick (DialogInterface dialogInterface, int i) {DialInterface.dismiss ();}); alert.setCancelable (गलत); alert.show (); } // जाँच करें कि क्या उपयोगकर्ता ने WRITE_STORAGE अनुमति दी है / // सार्वजनिक शून्य चेकपर्मिशन (int requestCode) {स्विच (requestCode) {मामला WRITE_STORAGE: int hasWriteExternalStoragePormission = ActivityCompat.checkSelfPermission (यह, Manifest.permission.WRITE_EXNN_NN) // अगर हमारे पास बाह्य संग्रहण तक पहुँच है ... // अगर (hasWriteExternalStoragePermission == PackageManager.PERMISSION_GRANTED) {//.call चयन करें, जो एक गतिविधि शुरू करता है जहाँ उपयोगकर्ता एक छवि का चयन कर सकता है // selectPicture (); // अगर अनुमति नहीं दी गई है, तो ... //} वरना {//.request the अनुमति // ActivityCompat.requestPims (यह, नया स्ट्रिंग {Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); } टूटना; }} निजी शून्य selectPicture () {फोटो = MyHelper.createTempFile (फोटो); आशय अभिप्राय = नया आशय (Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // एक गतिविधि शुरू करें जहां उपयोगकर्ता एक छवि चुन सकता है // startActivityForResult (इरादा, SELECT_PHOTO); }}

इस बिंदु पर, आपकी परियोजना को यह शिकायत करनी चाहिए कि यह MyHelper.createTempFile को हल नहीं कर सकता है। अब इसे लागू करें!

CreateTempFile के साथ छवियों का आकार बदलना

एक नया “MyHelper” वर्ग बनाएँ। इस कक्षा में, हम उपयोगकर्ता की चुनी गई छवि का आकार बदलने जा रहे हैं, जो टेक्स्ट रिकग्निशन एपीआई द्वारा संसाधित होने के लिए तैयार है।

आयात android.graphics.Bitmap; आयात android.graphics.BitmapFactory; आयात android.content.Context; आयात android.database.Cursor; आयात android.os.nvironment; आयात android.widget.ImageView; आयात android.provider.MediaStore; आयात android.net.Uri; स्थैतिक android.graphics.BitmapFactory.decodeFile आयात करें; स्थैतिक android.graphics.BitmapFactory.decodeStream आयात करें; आयात java.io.File; आयात java.io.FileNotFoundException; आयात java.io.FileOutputStream; आयात java.io.IOException; सार्वजनिक वर्ग MyHelper {सार्वजनिक स्थैतिक स्ट्रिंग getPath (संदर्भ, उड़ी उड़ी) {स्ट्रिंग पथ = ""; स्ट्रिंग प्रोजेक्शन = {MediaStore.Images.Media.DATA}; कर्सर कर्सर = reference.getContentResolver ()। Query (uri, प्रोजेक्शन, null, null, null); int column_index; if (कर्सर! = null) {column_index = कर्सर.getColumnIndexOrThrow (MediaStore.Images.Media.DATA); cursor.moveToFirst (); पाथ = कर्सर.टगस्ट्रिंग (कॉलम_इंडेक्स); cursor.close (); } वापसी का पथ; } public static फ़ाइल createTempFile (फ़ाइल फ़ाइल) {फ़ाइल निर्देशिका = नई फ़ाइल (Environment.getExternalStorageDoryory ()। getPath () + "/com.jessicathornsby.myapplication"); if (directory.exists () ||! directory.isDirectory ()) {directory.mkdirs (); } अगर (फ़ाइल == नल) {फ़ाइल = नई फ़ाइल (निर्देशिका, "Origin.jpg"); } रिटर्न फाइल; } public static Bitmap resizePhoto (फ़ाइल इमेज फ़ाइल, संदर्भ, उड़ी उड़ी, इमेज व्यू देखें) {BitmapFactory.Options newOptions = new BitmapFactory.Options (); {decodeStream (reference.getContentResolver ()। openInputStream (uri), null, newOptions कोशिश करें; int photoHeight = newOptions.outHeight; int photoWidth = newOptions.outWidth; newOptions.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); वापसी compressPhoto (imageFile, BitmapFactory.decodeStream (Reference.getContentResolver) ()। OpenInputStream (uri), null, newOptions); } पकड़ (FileNotFoundException अपवाद) {अपवाद.printStackTrace (); वापसी शून्य; }} सार्वजनिक स्थिर बिटमैप आकार (फ़ाइल छवि फ़ाइल, स्ट्रिंग पथ, छवि दृश्य) {BitmapFactory.Options विकल्प = नया BitmapFactory.Options (); डिकोडाइल (पथ, विकल्प); int photoHeight = options.outHeight; int photoWidth = options.outWidth; options.inSampleSize = Math.min (photoWidth / view.getWidth (), photoHeight / view.getHeight ()); वापसी compressPhoto (imageFile, BitmapFactory.decodeFile (पथ, विकल्प)); } निजी स्थिर बिटमैप संपीड़ित (फ़ाइल फ़ोटो फ़ाइल, बिटमैप बिटमैप) {कोशिश {FileOutputStream fOutput = new FileOutputStream (photoFile); bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fOutput); fOutput.close (); } पकड़ (IOException अपवाद) {अपवाद.printStackTrace (); } बिटमैप वापस; }}

छवि को ImageView में सेट करें

इसके बाद, हमें अपने मुख्य वर्ग में onActivityResult () को लागू करना होगा, और उपयोगकर्ता की चुनी हुई छवि को हमारे ImageView पर सेट करना होगा।

आयात android.graphics.Bitmap; आयात android.os.Bundle; आयात android.widget.ImageView; आयात android.content.ntent; आयात android.widget.TextView; आयात android.net.Uri; सार्वजनिक वर्ग MainActivity का विस्तार BaseActivity {निजी बिटमैप myBitmap; निजी ImageView myImageView; निजी टेक्स्ट व्यू myTextView; @Override संरक्षित शून्य onCreate (बंडल सहेजी गई InstanceState) {super.onCreate (saveInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); } @Override संरक्षित शून्य onActivityResult (int requestCode, int resultCode, इंटेंट डेटा) {super.onActivityResult (अनुरोधकोड, परिणामकोड, डेटा); if (resultCode == RESULT_OK) {स्विच (requestCode) {केस WRITE_STORAGE: checkPermission (requestCode); टूटना; मामला SELECT_PHOTO: Uri dataUri = data.getData (); स्ट्रिंग पथ = MyHelper.getPath (यह, डेटायूरी); if (पाथ == नल) {myBitmap = MyHelper.resizePhoto (फोटो, यह, डेटायूरी, myImageView); } और {myBitmap = MyHelper.resizePhoto (फोटो, पथ, myImageView); } अगर (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } टूटना; }}}}}

इस प्रोजेक्ट को एक भौतिक Android डिवाइस या AVD पर चलाएँ, और एक्शन बार आइकन पर क्लिक करें। संकेत मिलने पर, WRITE_STORAGE अनुमति दें और गैलरी से एक छवि चुनें; यह छवि अब आपके ऐप के UI में प्रदर्शित होनी चाहिए।

अब हमने आधार तैयार कर लिया है, हम कुछ पाठ निकालने शुरू करने के लिए तैयार हैं!

टेक्स्ट को पहचानने के लिए एक ऐप सिखाना

मैं एक क्लिक ईवेंट के जवाब में टेक्स्ट रिकग्निशन को ट्रिगर करना चाहता हूं, इसलिए हमें एक ऑनक्लिस्टनर लागू करने की आवश्यकता है:

आयात android.graphics.Bitmap; आयात android.os.Bundle; आयात android.widget.ImageView; आयात android.content.ntent; आयात android.widget.TextView; आयात android.view.View; आयात android.net.Uri; सार्वजनिक वर्ग MainActivity, बेसएक्टिविटी को बढ़ाता है View.OnClickListener {निजी बिटमैप myBitmap; निजी ImageView myImageView; निजी टेक्स्ट व्यू myTextView; @Override संरक्षित शून्य onCreate (बंडल सहेजी गई InstanceState) {super.onCreate (saveInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); findViewById (R.id.checkText) .setOnClickListener (this); } @Override public void onClick (दृश्य देखें) {स्विच (view.getId ()) {case R.id.checkText: if (myBitmap! = Null) {// हम अगले चरण में runTextRecog लागू करेंगे // runTextRecog! (); } टूटना; }}

ML किट केवल छवियों को संसाधित कर सकती है जब वे FirebaseVisionImage प्रारूप में होती हैं, इसलिए हमें अपनी छवि को FirebaseVisionImage ऑब्जेक्ट में बदलने की आवश्यकता होती है। आप एक Bitmap, Media.Image, ByteBuffer, या एक बाइट ऐरे से FirebaseVisionImage बना सकते हैं। चूंकि हम बिटमैप्स के साथ काम कर रहे हैं, इसलिए हमें फायरबेससेशनइमेज वर्ग की उपयोगिता () उपयोगिता विधि से कॉल करने की आवश्यकता है, और इसे हमारे बिटमैप को पास करें।

निजी शून्य runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap);

एमएल किट में प्रत्येक छवि पहचान कार्यों के लिए अलग-अलग डिटेक्टर वर्ग हैं। पाठ के लिए, हमें FirebaseVisionTextDetector वर्ग का उपयोग करने की आवश्यकता है, जो एक छवि पर ऑप्टिकल चरित्र पहचान (OCR) करता है।

हम FirebaseVisionTextDetector का एक उदाहरण बनाते हैं, getVisionTextDetector का उपयोग करते हुए:

FirebaseVisionTextDetector डिटेक्टर = FirebaseVision.getInstance ()। GetVisionTextDetector ();

इसके बाद, हमें पता लगाने के लिए FireBaseVisionImage को जांचना होगा, पता लगाने के लिए InIage () विधि को कॉल करके और इसे FirebaseVisionImage ऑब्जेक्ट पास करके। हमें onSuccess और onFailure कॉलबैक को लागू करने की भी आवश्यकता है, साथ ही साथ श्रोताओं को भी हमारे एप्लिकेशन को सूचित किया जाता है जब भी परिणाम उपलब्ध होते हैं।

डिटेक्टर .etectInImage (छवि) .addOnSuccessListener (नया OnSuccessListener)() {@Override // To // //})। AddOnFailureListener (new OnFailureListener () {@Override public void onFailure (@NonNull अपवाद अपवाद) // // टास्क एक अपवाद के साथ विफल हो गया}}}; }

यदि यह ऑपरेशन विफल हो जाता है, तो मैं एक टोस्ट प्रदर्शित करने जा रहा हूं, लेकिन यदि ऑपरेशन सफल रहा है, तो मैं प्रतिक्रिया के साथ प्रक्रिया कॉल करूँगा।

इस बिंदु पर, मेरा पाठ पहचान कोड इस तरह दिखता है:

// एक FirebaseVisionImage बनाएँ। // Private void runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); // FirebaseVisionCloudTextDetector का उदाहरण बनाएं। FirebaseVisionTextDetector डिटेक्टर = FirebaseVision.getInstance ()। GetVisionTextDetector (); // एक OnSuccessListener पंजीकृत करें // डिटेक्टर ।etectInImage (छवि) ।addOnSuccessListener (नया OnSuccessListener)() {@Override // onSuccess callback को लागू करें // public void onSuccess (FirebaseVisionText ग्रंथों) {// कॉल processExtractedText प्रतिक्रिया के साथ // processExtractedText (ग्रंथों); }})। addOnFailureListener (नया OnFailureListener () {@Override // onFailure calback को लागू करें // public void onFailure (@NonNull एक्सेप्शन अपवाद) "iast.makeText (MainActivity.this," Exception ", Toast.LENGTH_LONG)। );}}); }

जब भी हमारे ऐप को एक ऑनसेट असफल सूचना मिलती है, हमें परिणामों को पार्स करने की आवश्यकता होती है।

एक FirebaseVisionText ऑब्जेक्ट में तत्व, लाइनें और ब्लॉक शामिल हो सकते हैं, जहां प्रत्येक ब्लॉक आमतौर पर टेक्स्ट के एक ही पैराग्राफ के बराबर होता है। यदि FirebaseVisionText 0 ब्लॉक देता है, तो हम "no_text" स्ट्रिंग प्रदर्शित करेंगे, लेकिन यदि इसमें एक या अधिक ब्लॉक हैं, तो हम अपने TextView के भाग के रूप में पुनर्प्राप्त किए गए पाठ को प्रदर्शित करेंगे।

निजी शून्य प्रक्रियाExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (नल); if (firebaseVisionText.getBlocks ()। size () == 0) {myTextView.setText (R.string.no_text); वापसी; } (FirebaseVisionText.Block ब्लॉक: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

यहाँ पूरा मुख्यता कोड है:

आयात android.graphics.Bitmap; आयात android.os.Bundle; आयात android.widget.ImageView; आयात android.content.ntent; आयात android.widget.TextView; आयात android.widget.Toast; आयात android.view.View; आयात android.net.Uri; import android.support.annotation.NonNull; आयात com.google.firebase.ml.vision.common.FirebaseVisionImage; आयात com.google.firebase.ml.vision.text.FirebaseVisionText; आयात com.google.firebase.ml.vision.text.FirebaseVisionTextDetector; आयात com.google.firebase.ml.vision.FirebaseVision; आयात com.google.android.gms.tasks.OnSuccessListener; आयात com.google.android.gms.tasks.OnFailureListener; सार्वजनिक वर्ग MainActivity, बेसएक्टिविटी को बढ़ाता है View.OnClickListener {निजी बिटमैप myBitmap; निजी ImageView myImageView; निजी टेक्स्ट व्यू myTextView; @Override संरक्षित शून्य onCreate (बंडल सहेजी गई InstanceState) {super.onCreate (saveInstanceState); setContentView (R.layout.activity_main); myTextView = findViewById (R.id.textView); myImageView = findViewById (R.id.imageView); findViewById (R.id.checkText) .setOnClickListener (this); } @Override public void onClick (दृश्य देखें) {स्विच (view.getId ()) {मामला R.id.checkText: if (myBitmap! = Null) {runTextRecog (); } टूटना; }} @ ऑवरराइड संरक्षित शून्य onActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (अनुरोधकोड, परिणामकोड, डेटा); if (resultCode == RESULT_OK) {स्विच (requestCode) {केस WRITE_STORAGE: checkPermission (requestCode); टूटना; मामला SELECT_PHOTO: Uri dataUri = data.getData (); स्ट्रिंग पथ = MyHelper.getPath (यह, डेटायूरी); if (पाथ == नल) {myBitmap = MyHelper.resizePhoto (फोटो, यह, डेटायूरी, myImageView); } और {myBitmap = MyHelper.resizePhoto (फोटो, पथ, myImageView); } अगर (myBitmap! = null) {myTextView.setText (null); myImageView.setImageBitmap (myBitmap); } टूटना; }}} निजी शून्य runTextRecog () {FirebaseVisionImage image = FirebaseVisionImage.fromBitmap (myBitmap); FirebaseVisionTextDetector डिटेक्टर = FirebaseVision.getInstance ()। GetVisionTextDetector (); डिटेक्टर .etectInImage (छवि) .addOnSuccessListener (नया OnSuccessListener)() {@Override सार्वजनिक शून्य onSuccess (FirebaseVisionText ग्रंथों) {processExtractedText (ग्रंथों); }})। addOnFailureListener (नया OnFailureListener () {@Override public void onFailure (@NonNull अपवाद अपवाद) {Toast.makeText (MainActivity .this, "Exception", Toast.LENGTH_Long) (.show;);}}}; } निजी void प्रक्रियाExtractedText (FirebaseVisionText firebaseVisionText) {myTextView.setText (null); if (firebaseVisionText.getBlocks ()। size () == 0) {myTextView.setText (R.string.no_text); वापसी; } (FirebaseVisionText.Block ब्लॉक: firebaseVisionText.getBlocks ()) {myTextView.append (block.getText ()); }}}

परियोजना का परीक्षण

अब एमएल किट के टेक्स्ट रिकॉग्निशन को देखने का समय आ गया है! इस प्रोजेक्ट को एंड्रॉइड डिवाइस या AVD पर स्थापित करें, गैलरी से एक छवि चुनें, और फिर "टेक्स्ट चेक करें" बटन को टैप करें। एप्लिकेशन को छवि से सभी पाठ निकालकर, और फिर उसे टेक्स्ट व्यू में प्रदर्शित करके जवाब देना चाहिए।

ध्यान दें कि आपकी छवि के आकार और उसके पाठ की मात्रा के आधार पर, आपको निकाले गए पाठ के सभी देखने के लिए स्क्रॉल करना पड़ सकता है।

आप पूरा प्रोजेक्ट GitHub से भी डाउनलोड कर सकते हैं।

समेट रहा हु

अब आप जानते हैं कि एमएल किट का उपयोग करके किसी छवि से टेक्स्ट का पता लगाना और निकालना कैसे है।

टेक्स्ट रिकग्निशन API ML किट का सिर्फ एक हिस्सा है। यह SDK बारकोड स्कैनिंग, फेस डिटेक्शन, इमेज लेबलिंग और लैंडमार्क रिकग्निशन की भी पेशकश करता है, जिसमें आम मोबाइल उपयोग के मामलों के लिए अधिक एपीआई जोड़ने की योजना है, जिसमें स्मार्ट रिप्लाई और एक हाई-डेंसिटी फेस कॉन्टूर एपीआई भी शामिल है।

आप किस एमएल किट एपीआई को आजमाना चाहते हैं? नीचे टिप्पणी करके हमें बताएं!

आपने शायद ए एक app के लिए अद्भुत विचार किन्हीं बिंदुओं पर। समस्या यह है कि, आप अपनी इच्छानुसार सब कुछ कैसे प्रोग्राम करते हैं? बुलबुला $ 1299 के लिए डेवलपर सबक के साथ, जहां बुलबुला आता है।...

ऐसा लगता है कि निर्माताओं के लोड इन दिनों पॉप-अप सेल्फी कैमरों के साथ स्मार्टफोन पेश कर रहे हैं, जिसमें Xiaomi Mi 9T, Realme X और OnePlu 7 Pro सभी फीचर दे रहे हैं।...

साइट पर लोकप्रिय