Google च्या मशीन लर्निंग एसडीकेसह प्रतिमांमधून मजकूर कसा काढायचा

लेखक: John Stephens
निर्मितीची तारीख: 27 जानेवारी 2021
अद्यतन तारीख: 5 जुलै 2024
Anonim
अँड्रॉइड स्टुडिओमध्ये Google Vision API वापरून OCR इमेजमधून मजकूर काढा
व्हिडिओ: अँड्रॉइड स्टुडिओमध्ये Google Vision API वापरून OCR इमेजमधून मजकूर काढा

सामग्री


आपण भाषांतर अ‍ॅप्स किंवा ibilityक्सेसीबिलिटी सेवांसाठी आधारभूत मजकूर ओळख API देखील वापरू शकता ज्यात त्यांचा संघर्ष करीत असलेल्या कोणत्याही मजकूरावर वापरकर्ता त्यांचा कॅमेरा दर्शवू शकतो आणि त्यास त्यांना मोठ्याने वाचले पाहिजे.

या ट्यूटोरियलमध्ये, वापरकर्त्याच्या गॅलरीमधील कोणत्याही प्रतिमेतून मजकूर काढू शकेल असा अ‍ॅप तयार करुन आम्ही विस्तृत वैशिष्ट्यीकृत वैशिष्ट्यांचा पाया घालू. जरी आम्ही या ट्यूटोरियलमध्ये हे लपवित नाही, तरीही आपण या अनुप्रयोगास डिव्हाइसच्या कॅमेर्‍याशी कनेक्ट करुन वास्तविक वेळी वापरकर्त्याच्या सभोवतालच्या मजकूर देखील कॅप्चर करू शकता.

डिव्हाइसवर किंवा मेघ मध्ये?

काही एमएल किट एपीआय केवळ डिव्हाइसवर उपलब्ध आहेत, परंतु काही मजकूर ओळख API सह डिव्हाइसवर आणि मेघामध्ये उपलब्ध आहेत.

क्लाऊड-आधारित टेक्स्ट एपीआय भाषा आणि वर्णांची विस्तृत श्रेणी ओळखू शकते आणि डिव्हाइसवरील भागांपेक्षा अधिक अचूकतेचे आश्वासन देतो. तथापि, ते करते एक सक्रिय इंटरनेट कनेक्शन आवश्यक आहे आणि ते फक्त ब्लेझ-स्तरीय प्रकल्पांसाठी उपलब्ध आहे.


या लेखात, आम्ही स्थानिक पातळीवर मजकूर ओळख API चालवित आहोत, जेणेकरुन आपण ब्लेझमध्ये श्रेणीसुधारित केले आहे की नाही याची पर्वा न करता आपण अनुसरण करू शकता किंवा आपण विनामूल्य फायरबेस स्पार्क योजनेवर आहात.

एमएल किटसह मजकूर ओळख अॅप तयार करत आहे

आपल्या आवडीच्या सेटिंग्जसह अनुप्रयोग तयार करा, परंतु सूचित केल्यास “रिक्त क्रियाकलाप” टेम्पलेट निवडा.

एमएल किट एसडीके फायरबेसचा एक भाग आहे, म्हणून आपणास त्याचे प्रकल्प शेअ -1 स्वाक्षरी प्रमाणपत्र वापरून फायरबेसशी कनेक्ट करण्याची आवश्यकता आहे. आपल्या प्रोजेक्टचा SHA-1 मिळविण्यासाठी:

  • Android स्टुडिओचा “ग्रॅडल” टॅब निवडा.
  • “ग्रॅडल प्रोजेक्ट्स” पॅनेलमध्ये आपल्या प्रकल्पाच्या “रूट” विस्तृत करण्यासाठी डबल-क्लिक करा आणि नंतर “कार्ये> अँड्रॉइड> स्वाक्षरी अहवाल” निवडा.
  • या प्रकल्पाविषयी काही माहिती प्रदर्शित करण्यासाठी Android स्टुडिओ विंडोच्या तळाशी असलेल्या पॅनेलने अद्यतनित केले पाहिजे - त्यासह तिच्या SHA-1 स्वाक्षरी प्रमाणपत्रासह.


आपला प्रकल्प फायरबॅसशी जोडण्यासाठी:

  • आपल्या वेब ब्राउझरमध्ये, फायरबेस कन्सोल लाँच करा.
  • “प्रकल्प जोडा” निवडा.
  • आपल्या प्रोजेक्टला नाव द्या; मी “एमएल टेस्ट” वापरत आहे.
  • नियम आणि शर्ती वाचा आणि आपण पुढे जाण्यास आनंदी असाल तर “प्रकल्प तयार करा.” त्यानंतर “मी स्वीकारतो…” निवडा.
  • "आपल्या Android अॅपवर फायरबॅस जोडा" निवडा.
  • आपल्या प्रोजेक्टचे पॅकेज नाव प्रविष्ट करा जे आपल्याला मेनएक्टिव्हिटी फाइलच्या शीर्षस्थानी आणि मॅनिफेस्टच्या आत सापडतील.
  • आपल्या प्रोजेक्टचे SHA-1 स्वाक्षरी प्रमाणपत्र प्रविष्ट करा.
  • “अ‍ॅपची नोंदणी करा” क्लिक करा.
  • “गूगल-सर्व्हिसेस.जेसन डाउनलोड करा.” निवडा या फाईलमध्ये एपीआय की सह आपल्या प्रकल्पासाठी सर्व आवश्यक फायरबेस मेटाडेटा आहे.
  • अँड्रॉइड स्टुडिओमध्ये, आपल्या प्रकल्पाच्या “अ‍ॅप” निर्देशिकेत गुगल-सेवा.जेसन फाईल ड्रॅग आणि ड्रॉप करा.

  • आपली प्रोजेक्ट-स्तर बिल्ड.gradle फाईल उघडा आणि Google सेवा वर्गपथ जोडा:

क्लासपाथ com.google.gms: गूगल सेवा: 4.0.०.१

  • आपली अ‍ॅप-स्तरीय बिल्ड.gradle फाईल उघडा आणि फायरबॅस कोअर, फायरबेस एमएल व्हिजन आणि मॉडेल इंटरप्रिटर तसेच Google सेवा प्लगइनसाठी अवलंबन जोडा:

प्लगइन लागू करा: com.google.gms.google-Services ... ... ... अवलंबन {अंमलबजावणी फाईल वृक्ष (dir: libs, समाविष्ट:) अंमलबजावणी com.google.firebase: फायरबेस-कोर: 16.0.1 अंमलबजावणी कॉम. google.firebase: फायरबेस-एमएल-व्हिजन: 16.0.0 अंमलबजावणी com.google.firebase: फायरबेस-एमएल-मॉडेल-इंटरप्रीटर: 16.0.0

या क्षणी, आपल्याला आपला प्रकल्प चालविणे आवश्यक आहे जेणेकरून ते फायरबेस सर्व्हरशी कनेक्ट होऊ शकेल:

  • एकतर भौतिक Android स्मार्टफोन किंवा टॅब्लेटवर किंवा Android आभासी डिव्हाइसवर (एव्हीडी) आपला अॅप स्थापित करा.
  • फायरबेस कन्सोलमध्ये, इंस्टॉलेशन सत्यापित करण्यासाठी “अ‍ॅप चालवा” निवडा.
  • काही क्षणांनंतर, आपण एक "अभिनंदन" पहावे; “कन्सोल वर सुरू ठेवा” निवडा.

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

डीफॉल्टनुसार, एमएल किट केवळ जेव्हा आवश्यक असतात तेव्हाच मॉडेल डाउनलोड करतात, जेव्हा जेव्हा वापरकर्ता प्रथमच मजकूर काढण्याचा प्रयत्न करतो तेव्हा आमचा अ‍ॅप ओसीआर मॉडेल डाउनलोड करेल.

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

आमच्या अॅपसह हे होणार नाही हे सुनिश्चित करण्यासाठी, मी स्थापित वेळेत आवश्यक ओसीआर मॉडेल डाउनलोड करणार आहे, ज्यास मॅनिएस्टमध्ये काही बदल आवश्यक आहेत.

आम्ही मॅनिफेस्ट उघडे असताना, मी WRITE_EXTERNAL_STORAGE परवानगी देखील जोडणार आहे, जी आम्ही नंतर या ट्यूटोरियलमध्ये वापरणार आहोत.

// WRITE_EXTERNAL_STORAGE परवानगी जोडा // // खालील जोडा //

लेआउट तयार करत आहे

चला सुलभ सामग्री बाहेर पडू आणि त्यात एक लेआउट तयार करूः

  • एक प्रतिमा पहा. प्रारंभी, हे प्लेसहोल्डर दर्शवेल, परंतु वापरकर्त्याने त्यांच्या गॅलरीमधून एखादी प्रतिमा निवडल्यानंतर हे अद्यतनित होईल.
  • एक बटण, जे मजकूर माहितीला ट्रिगर करते.
  • एक टेक्स्ट व्ह्यू, जिथे आम्ही काढलेला मजकूर प्रदर्शित करू.
  • एक स्क्रोल व्ह्यू. काढलेला मजकूर ऑनस्क्रीन व्यवस्थित बसू शकेल याची शाश्वती नसल्यामुळे मी मजकूर दृश्य स्क्रोल दृश्यात ठेवणार आहे.

येथे तयार केलेली क्रियाकलाप_मेन.एक्सएमएल फाइल आहे:

हा लेआउट एका "आयसी_ प्लेसहोल्डर" च्या रेखांकनास संदर्भित करतो, म्हणून आता हे तयार करूयाः

  • Android स्टुडिओ टूलबार वरून “फाइल> नवीन> प्रतिमा मालमत्ता” निवडा.
  • “चिन्ह प्रकार” ड्रॉपडाउन उघडा आणि “अ‍ॅक्शन बार आणि टॅब चिन्हे” निवडा.
  • “क्लिप आर्ट” रेडिओ बटण निवडलेले असल्याची खात्री करा.
  • “क्लिप आर्ट” बटणावर क्लिक करा.
  • आपण आपला प्लेसहोल्डर म्हणून वापरू इच्छित असलेली प्रतिमा निवडा; मी वापरत आहे “फोटो जोडा”.
  • “ओके” वर क्लिक करा.
  • “थीम” ड्रॉपडाउन उघडा आणि “HOLO_LIGHT” निवडा.
  • “नेम,” फील्डमध्ये, “आयक_ प्लेसहोल्डर” प्रविष्ट करा.
  • “पुढील” क्लिक करा. माहिती वाचा आणि तुम्हाला पुढे करण्यास आनंद झाला असेल तर “समाप्त” वर क्लिक करा.

अ‍ॅक्शन बार चिन्हः गॅलरी अ‍ॅप लाँच करीत आहे

पुढे, मी actionक्शन बार आयटम तयार करणार आहे जे वापरकर्त्याची गॅलरी लॉन्च करेल, त्यांच्यासाठी प्रतिमा निवडण्यासाठी तयार आहे.

आपण मेनू स्त्रोत फाइलमध्ये कृती बार चिन्हे परिभाषित करता, जी “रेस / मेनू” निर्देशिकेत राहते. आपल्या प्रकल्पात ही निर्देशिका नसल्यास आपल्याला ती तयार करण्याची आवश्यकता असेल:

  • आपल्या प्रोजेक्टच्या “रेस” निर्देशिका नियंत्रित करा आणि “नवीन> Android संसाधन निर्देशिका” निवडा.
  • “स्त्रोत प्रकार” ड्रॉपडाऊन उघडा आणि “मेनू” निवडा.
  • “निर्देशिका नाव” आपोआप “मेनू” वर अद्यतनित व्हायला हवे, परंतु ते तसे न झाल्यास आपणास त्यास व्यक्तिचलितपणे नाव देणे आवश्यक आहे.
  • “ओके” वर क्लिक करा.

आपण आता मेनू स्त्रोत फाइल तयार करण्यास सज्ज आहात:

  • आपल्या प्रोजेक्टची “मेनू” निर्देशिका नियंत्रित करा आणि “नवीन> मेनू स्त्रोत फाइल” निवडा.
  • या फाईलला “माय_मेनू” नाव द्या.
  • “ओके” वर क्लिक करा.
  • “My_menu.xML” फाईल उघडा आणि खालील जोडा:

// तयार करा प्रत्येक क्रियेसाठी घटक //

मेनू फाईल “एक्शन_गलरी” स्ट्रिंगचा संदर्भ देते, म्हणून आपल्या प्रोजेक्टची रेस / व्हॅल्यूज / स्ट्रिंग.एक्सएमएल फाइल उघडा आणि हे स्रोत तयार करा. मी येथे असताना, मी या प्रकल्पात वापरत असलेल्या इतर तारांची व्याख्या देखील करीत आहे.

गॅलरी या अ‍ॅपला आपल्या डिव्हाइसवरील फायलींमध्ये प्रवेश करण्याची आवश्यकता आहे. मजकूर आढळला नाही

पुढे, अ‍ॅक्शन बारचे “आयक_गलरी” चिन्ह तयार करण्यासाठी प्रतिमा मालमत्ता स्टुडिओ वापरा:

  • “फाइल> नवीन> प्रतिमा मालमत्ता” निवडा.
  • “Typeक्शन बार आणि टॅब चिन्हे” वर “चिन्ह प्रकार” ड्रॉपडाउन सेट करा.
  • “क्लिप आर्ट” बटणावर क्लिक करा.
  • एक ड्रॉएबल निवडा; मी “प्रतिमा” वापरत आहे.
  • “ओके” वर क्लिक करा.
  • हे चिन्ह अ‍ॅक्शन बारमध्ये स्पष्टपणे दिसत आहे हे सुनिश्चित करण्यासाठी, “थीम” ड्रॉपडाउन उघडा आणि “HOLO_DARK” निवडा.
  • या चिन्हास नाव द्या "आयक_गॅलरी."
  • “समाप्त” नंतर “पुढील” क्लिक करा.

परवानगी विनंत्या हाताळणे आणि कार्यक्रम क्लिक करा

मेन्यू इन्स्टंट करणे, अ‍ॅक्शन बार क्लिक इव्हेंट्स हाताळणे आणि डिव्हाइसच्या स्टोरेजमध्ये प्रवेशाची विनंती करण्यासह मी वेगळ्या बेसअॅक्टिव्हिटी क्लासमध्ये मजकूर ओळख API शी थेट संबंधित नसलेली सर्व कार्ये मी करणार आहे.

  • Android स्टुडिओच्या टूलबार वरुन “फाईल> नवीन> जावा वर्ग” निवडा.
  • या वर्गाचे नाव “बेसएक्टिव्हिटी”.
  • “ओके” वर क्लिक करा.
  • बेसअॅक्टिव्हिटी उघडा आणि खालील जोडा:

android.app.Activity आयात करा; android.support.v4.app.ActivityCompat आयात करा; android.support.v7.app.ActionBar आयात करा; android.support.v7.app.AlertDialog आयात करा; android.support.v7.app.appCompatActivity आयात करा; android.os.Bundle आयात करा; android.content.DialogInterface आयात करा; android.content.Inttent आयात करा; आयात android.Manifest; android.provider.MediaStore आयात करा; android.view.Menu आयात करा; android.view.MenuItem आयात करा; android.content.pm.PackageManager आयात करा; android.net.Uri आयात करा; android.provider.Settings आयात करा; android.support.annotation.NonNull आयात करा; आयात करा android.support.annotation.Nlalable; java.io.File आयात करा; पब्लिक क्लास बेसएक्टिव्हिटीने Cप कॉम्पॅटएक्टिव्हिटी वाढविली {पब्लिक स्टॅटिक फायनल इन्ट WRITE_STORAGE = 100; सार्वजनिक स्थिर अंतिम SELECT_PHOTO = १०२; सार्वजनिक स्थिर अंतिम स्ट्रिंग ACTION_BAR_TITLE = "कृती_बार_ शीर्षक"; सार्वजनिक फाइल फोटो; @ ओव्हरराइड संरक्षित शून्य ऑन क्रीएट (@ न्युलेबल बंडल सेव्हिडइन्स्टान्सस्टेट) {सुपर.ऑनक्रिएट (सेव्हिडइन्स्टान्सस्टेट); अ‍ॅक्शनबार अ‍ॅक्शनबार = getSupportActionBar (); if (अ‍ॅक्शनबार! = नल) {एक्शनबार.सेटडिस्प्लेहोमेअसअप (सक्षम); अ‍ॅक्शनबार.सेटटिटल (गेटइंटेंट (). गेटस्ट्रिंगएक्स्ट्रा (ACTION_BAR_TITLE)); Re} @CreateOptionsMenu (मेनू मेनू) वर ओव्हरराइड पब्लिक बुलियन {getMenuInflater (). फुगवणे (R.menu.my_menu, मेनू); खरे परत येणे; } @ ऑपरेशन आयटेलसिलेक्टेड (मेनू आयटम आयटम) वर ओव्हरराइड पब्लिक बुलियन {स्विच (आयटम.गेट आयटम आयडी ()) {// जर “गॅलरी_अॅक्शन” निवडली असेल तर ... // केस आर.आय.डी.गलरी_अॅक्शन: //... चेक करा WRITE_STORAGE परवानगी // चेकपर्मिशन (WRITE_STORAGE); ब्रेक super सुपर.ऑनऑप्शन आयटमसेलेक्टेड (आयटम) परत करा; E @RequestPerferencesResult (ऑर रिकॉर्डेपिडरेशन्सराईट (INT रिक्तकोड, @ नॉनल स्ट्रिंग परवानग्या, @ नॉननुल इंट ग्रांट रेश्ट्स)) ver सुपरऑन रेकरेस्टपेरिमिशनरेसल्ट (विनंतीकोड, परवानग्या, अनुदान परिणाम); स्विच (विनंती कोड) {केस WRITE_STORAGE: // परवानगी विनंती मंजूर झाल्यास, ... // तर (अनुदान / परिणाम.सामर्थ्य> 0 && अनुदान परिणाम == पॅकेजमेनेज.पी.आर.एम.एस.एस.आय.एस.एन._ ग्रॅन्टीड) .. //... सर्व निवडलेले चित्र / निवडचित्र (निवडलेले चित्र) ); // जर परवानगी विनंती नाकारली गेली असेल तर ... //} अन्यथा {//... "परवानग्या_सुरक्षा" स्ट्रिंग // विनंती // विनंतीपेरिमिशन (ही, विनंतीकोड, आर .स्ट्रिंग.परमिशन_प्रेक्स्ट); } ब्रेक; }} // परवानगी विनंती संवाद प्रदर्शित करा // सार्वजनिक स्थीर शून्य विनंतीपेरिमिशन (अंतिम क्रियाकलाप, अंतिम INTOSTCode, INT) {AlertDialog.Builder सतर्कता = नवीन AlertDialog.Builder (क्रियाकलाप); सतर्कता.सेट (संदेश); चेतावणी .setData (Uri.parse ("पॅकेज:" + गतिविधि.getPackageName ())); પ્રવૃત્તિ.स्टार्टअॅक्टिव्हिटी फोररसुल्ट (परमिसनइंटेंट, रिक्वेस्ट कोड);}}); सतर्कता.सेटनेजेटिव्ह बट्टन (android.R.string.cancel, नवीन DialogInterface.OnClickListener () {@Override सार्वजनिक शून्य onClick (DialogInterface डायलॉगइंटरफेस, इंट i) {डायलॉगइंटरफेस.डिस्मिस ();}})); सतर्क.सेटकेन्सॅबल (खोटे); सतर्क.शो (); } // वापरकर्त्याने WRITE_STORAGE परवानगी दिली आहे की नाही ते तपासा / सार्वजनिक शून्य चेकपर्मिशन (इंटरेस्टकोड कोड) {स्विच (विनंतीकोड) {केस WRITE_STORAGE: int hasWritExternStoragePermission = ActivityCompat.checkSelfPermission (हे, मॅनिफेस्ट.पर्मीशन. WRITE_EXTERNALGP; // आमच्याकडे बाह्य संचयनामध्ये प्रवेश असल्यास ... // if (hasWriteExternStoragePermission == PackageManager.PERMISSION_GRANTED) {//...Call निवडलेले चित्र, ज्यामध्ये एखादी क्रियाकलाप प्रक्षेपित केली जाते जिथे वापरकर्ता एखादी प्रतिमा // निवडलेले चित्र () निवडू शकतो; // जर परवानगी दिली गेली नसेल तर ... //} else {//... परवानगीची विनंती करा // ActivityCompat.requestPerifications (हे, नवीन स्ट्रिंग {मॅनिफेस्ट.पर्मिशन.डब्ल्यूआरआयटी. एक्स्टर्नेरनेलप्रूपरेज request, रिक्वेस्ट कोड); } ब्रेक; }} खाजगी शून्य सिलेक्टपिक्चर () {फोटो = मायहेल्पर.क्रीटेटम्प फाईल (फोटो); हेतू हेतू = नवीन हेतू (हेतू.अक्शन_पिक, मीडियास्टोअर.आयमेजेस.मेडिया.एक्सटर्नल_कॉन्टआययूआरआय); // एखादी क्रियाकलाप प्रारंभ करा जिथे वापरकर्ता एखादी प्रतिमा // स्टार्टअॅक्टिव्हिटी फोर रिझल्ट (हेतू, SELECT_PHOTO) निवडू शकेल; }}

या क्षणी, आपल्या प्रोजेक्टची तक्रार असावी की ती MyHelper.createTempFile निराकरण करू शकत नाही. चला आता याची अंमलबजावणी करूया!

क्रिएटिम्प फाईलसह प्रतिमेचे आकार बदलत आहे

नवीन “मायहेल्पर” वर्ग तयार करा. या वर्गात, आम्ही वापरकर्त्याच्या निवडलेल्या प्रतिमेचा आकार बदलणार आहोत, मजकूर ओळख API वर प्रक्रिया करण्यास तयार.

android.ographicics.Bitmap आयात करा; android.ographicics.BitmapFactory आयात करा; android.content.Context आयात करा; android.datedia.Cursor आयात करा; android.os.En वातावरण आयात करा; आयात करा android.widget.ImageView; android.provider.MediaStore आयात करा; android.net.Uri आयात करा; स्टॅटिक एंड्रॉइड.ग्रॅफिक्स.बिटमॅपफैक्टरी.डिकोडफाईल आयात करा; स्थिर android.ographicics.BitmapFactory.decodeStream आयात करा; java.io.File आयात करा; java.io.FileNotFoundException आयात करा; java.io.FileOutputStream आयात करा; java.io.IOException आयात करा; पब्लिक क्लास मायहेल्पर {पब्लिक स्टॅटिक स्ट्रिंग गेटपाथ (संदर्भ, उरी उरी) ring स्ट्रिंग पथ = ""; स्ट्रिंग प्रोजेक्शन = {MediaStore.Images.Media.DATA}; कर्सर कर्सर = संदर्भ .getContentResolver (). क्वेरी (uri, प्रोजेक्शन, शून्य, शून्य, शून्य); इंट कॉलम_इन्डेक्स; if (कर्सर! = निरर्थक) {कॉलम_इंडॅक्स = कर्सर.गेट कॉलमइंडেক্সऑरथ्रॉ (मीडियास्टोर.इमेजेस.मिडिया.डाटा); कर्सर.मोव्ह टू फर्स्ट (); पथ = कर्सर.जेटस्ट्रिंग (कॉलम_इन्डेक्स); कर्सर.कॉलोज (); } परतीचा मार्ग; } पब्लिक स्टॅटिक फाईल क्रिएटिम्प फाईल (फाईल फाइल) {फाईल निर्देशिका = नवीन फाईल (पर्यावरण .getExternStorageDirectory (). getPath () + "/com.jessicathornsby.myapplication"); जर (! निर्देशिका.exists () ||! निर्देशिका.isDirectory ()). निर्देशिका.mkdirs (); } if (file == null) {file = new file (निर्देशिका, "original.jpg"); फाइल परत करा; } पब्लिक स्टॅटिक बिटमैप रीसाइज फोटो (फाइल प्रतिमाफाइल, संदर्भ संदर्भ, उरी उरी, इमेज व्ह्यू दृश्य) it बिटमैप फॅक्टरी.ऑप्शन नवीन ऑप्शन = नवीन बिटमैपफैक्टरी.ऑप्शन (); {डीकोडस्ट्रीम (संदर्भ .getContentResolver (). ओपनइंटपुटस्ट्रीम (uri), शून्य, नवीन ऑप्शन) वापरून पहा; इंट फोटोहाइट = newOptions.outHeight; इंट फोटोविड्थ = newOptions.outWidth; newOptions.inSampleSize = मॅथ.माईन (फोटोविड्थ / व्ह्यू.विटविड्थ (), फोटोहाइट / व्ह्यू.गेटहाइट ()); रिटर्न कॉम्प्रेसफोटो (इमेजफाईल, बिटमैपफैक्टरी.डिकोडस्ट्रीम (कॉन्टॅक्ट.. बीट कॉन्टेन्टरेसोल्व्हर (). ओपनइंटपुटस्ट्रीम (उरी), नल, न्यूऑप्शन)); } कॅच (फाईलनाटफाऊंडएक्सप्शन अपवाद) {अपवाद.प्रिंटस्टॅकट्रेस (); रिटर्न शून्य }} पब्लिक स्टॅटिक बिटमैप रीसाइज फोटो (फाइल प्रतिमाफाइल, स्ट्रिंग पथ, इमेज व्ह्यू व्ह्यू) it बिटमैप फॅक्टरी.ऑप्शन पर्याय = नवीन बिटमैप फॅक्टरी.ऑप्शन (); डिकोड फाईल (पथ, पर्याय); इंट फोटोहाइट = ऑप्शन्स.आउटहिट; इंट फोटोविड्थ = विकल्प.आउटविड्थ; विकल्प.inSampleSize = मॅथ.मिनि (फोटोविड्थ / व्ह्यू.विटविड्थ (), फोटोहाइट / व्ह्यू.जीटहाइट ()); रिटर्न कॉम्प्रेसफोटो (इमेजफाईल, बिटमैपफैक्टरी.डिकोड फाईल (पथ, पर्याय)); } खाजगी स्थिर बिटमॅप कॉम्प्रेस फोटो (फाइल फोटोफाइल, बिटमैप बिटमैप) {प्रयत्न करा {फाइलऑटपुटस्ट्रीम fOutput = नवीन फाइलऑटपुटस्ट्रीम (फोटो फाइल); बिटमैप.कॉमप्रेस (बिटमैप.कंप्रेस फॉरमॅट.जेपीईजी, 70, एफआउटपुट); fOutput.close (); } कॅच (आयओएक्सप्शन अपवाद) {अपवाद.प्रिंटस्टॅकट्रेस (); bit रिटर्न बिटमॅप; }}

इमेज व्ह्यू वर प्रतिमा सेट करा

पुढे, आम्हाला आमच्या मेनएक्टिव्हिटी क्लासमध्ये cक्टिव्हिटी रिझल्ट () अंमलात आणण्याची आणि वापरकर्त्याची निवडलेली प्रतिमा आमच्या प्रतिमा व्ह्यूवर सेट करण्याची आवश्यकता आहे.

android.ographicics.Bitmap आयात करा; android.os.Bundle आयात करा; आयात करा android.widget.ImageView; android.content.Inttent आयात करा; android.widget.TextView आयात करा; android.net.Uri आयात करा; सार्वजनिक वर्ग मेनएक्टिविटीने बेसअॅक्टिव्हिटी tivity खासगी बिटमैप मायबिटमॅप वाढविला; खासगी इमेजव्यू खाजगी मजकूर दृश्य myTextView; @ ओव्हरराइड संरक्षित शून्य ऑनक्रिएट (बंडल सेव्हिडइन्स्टेन्सस्टेट). सुपर.ऑनक्रिएट (सेव्हिडइन्स्टेन्सस्टेट); सेट कॉन्टेन्ट व्ह्यू (आर.लेआउट.एक्टिव्हिटी_मेन); मायटेक्स्टव्यू = फाइंड व्ह्यूबायआयडी (आर. आयडी.टेक्स्टव्ह्यू); मायआयमेजव्यू = फाइंड व्ह्यूबायआयडी (आर.आयडी.आयमेजव्यूव्ह); C @Averride संरक्षित शून्य onActivityResult (इंट रिक्वेस्ट कोड, इंट रिझल्ट कोड, इन्टेंट डेटा) {सुपर.ऑन अ‍ॅक्टिव्हिटी रिझल्ट (रिक्वेस्ट कोड, रिझल्ट कोड, डेटा); जर (परिणाम कोड == RESULT_OK) {स्विच (विनंती कोड) {प्रकरण WRITE_STORAGE: चेकपर्मिशन (विनंती कोड); ब्रेक केस SELECT_PHOTO: उरी डेटा Uri = डेटा.getData (); स्ट्रिंग पथ = MyHelper.getPath (हा, डेटायूरी); if (पथ == शून्य) {मायबीटमैप = मायहेल्पर.रेसाइफोटो (फोटो, हा, डेटायूरी, मायआयमेझ व्ह्यू); } अन्यथा {मायबीटमैप = मायहेल्पर.रेसाइफोटो (फोटो, पथ, मायआयमेझ व्ह्यू); } if (myBitmap! = null) {myTextView.setText (शून्य); मायआयमेझव्यू.सेटआयमेजबिटमॅप (मायबिटमॅप); } ब्रेक; }}}}

हा प्रकल्प प्रत्यक्ष Android डिव्हाइस किंवा एव्हीडी वर चालवा आणि अ‍ॅक्शन बार चिन्हावर क्लिक द्या. सूचित केल्यास, WRITE_STORAGE परवानगी द्या आणि गॅलरीमधून एक प्रतिमा निवडा; ही प्रतिमा आता आपल्या अॅपच्या UI मध्ये दर्शविली जावी.

आता आम्ही आधार तयार केला आहे, आम्ही काही मजकूर काढण्यास तयार आहोत!

मजकूर ओळखण्यासाठी अॅप शिकवित आहे

मला एका क्लिक इव्हेंटच्या प्रतिसादात मजकूर ओळख ट्रिगर करायची आहे, म्हणून आम्हाला ऑनक्लिकलिस्टनर लागू करण्याची आवश्यकता आहे:

android.ographicics.Bitmap आयात करा; android.os.Bundle आयात करा; आयात करा android.widget.ImageView; android.content.Inttent आयात करा; android.widget.TextView आयात करा; android.view.View आयात करा; android.net.Uri आयात करा; पब्लिक क्लास मेनएक्टिव्हिटीने बेसअॅक्टिव्हिटी अवजारे विस्तारित केली. व्यू.ऑनक्लिकलिस्टर {खासगी बिटमैप मायबिटमॅप; खासगी इमेजव्यू खाजगी मजकूर दृश्य myTextView; @ ओव्हरराइड संरक्षित शून्य ऑनक्रिएट (बंडल सेव्हिडइन्स्टेन्सस्टेट). सुपर.ऑनक्रिएट (सेव्हिडइन्स्टेन्सस्टेट); सेट कॉन्टेन्ट व्ह्यू (आर.लेआउट.एक्टिव्हिटी_मेन); मायटेक्स्टव्यू = फाइंड व्ह्यूबायआयडी (आर. आयडी.टेक्स्टव्ह्यू); मायआयमेजव्यू = फाइंड व्ह्यूबायआयडी (आर.आयडी.आयमेजव्यूव्ह); FindViewById (R.id.checkText) .setOnClickListener (हे); } @ ओव्हरराइड पब्लिक शून्य ऑनक्लिक (दृश्य पहा) {स्विच (व्ह्यू .आइडआयडी ()) {केस आर.आय.डी.केकटेक्स्ट: जर (मायबिटमॅप! = शून्य) We // आम्ही पुढच्या चरणात रनटेक्स्टरॅकॉग लागू करणार आहोत // रनटेक्स्टरॅकॉग (); } ब्रेक; }}

एमएल किट केवळ फायरबेसव्हिजनआयमेज स्वरूपात असतानाच प्रतिमाांवर प्रक्रिया करू शकते, म्हणून आम्हाला आमची प्रतिमा फायरबेसव्हिजनआयमेज ऑब्जेक्टमध्ये रुपांतरित करण्याची आवश्यकता आहे. आपण बिटमॅप, मिडिया.आयमेज, बाइटबफर किंवा बाइट अ‍ॅरेमधून फायरबेसविझन प्रतिमा तयार करू शकता. आम्ही बिटमैप्ससह कार्य करीत असल्याने आम्हाला फायरबेसव्हिजनआयमेज वर्गाच्या बिटमैप () युटिलिटी पध्दतीवर कॉल करणे आणि ते आमचा बिटमैप पास करणे आवश्यक आहे.

खाजगी शून्य रनटेक्स्टरॅकॉग () {फायरबेसविझनइमेज प्रतिमा = फायरबेसव्हिजनआयमेज.फ्रॅमबिटमैप (मायबिटमॅप);

एमएल किटमध्ये त्याच्या प्रत्येक प्रतिमा ओळखण्याच्या कार्यासाठी भिन्न डिटेक्टर वर्ग आहेत. मजकूरासाठी, आम्हाला फायरबेसविजनटेक्स्टडिटेक्टर वर्ग वापरण्याची आवश्यकता आहे, जो प्रतिमेवर ऑप्टिकल कॅरेक्टर रिकग्निशन (ओसीआर) करते.

आम्ही getVisionTextDetector वापरून फायरबेसविजनटेक्स्ट डिटेक्टरचा एक उदाहरण तयार करतो:

फायरबेसविझनटेक्स्टडिटेक्टर डिटेक्टर = फायरबेसविजन.गेटइन्स्टन्स (). GetVisionTextDetector ();

पुढे, डिटेक्टइनीआयमेज () मेथडवर कॉल करून आणि फायरबेसव्हिजनआयमेज ऑब्जेक्ट पाठवून मजकूरासाठी आपल्याला फायरबेसव्हीजनआयमेज तपासण्याची गरज आहे. आम्हाला onSuccess आणि onFailure कॉलबॅकची अंमलबजावणी करण्याची आवश्यकता आहे, तसेच संबंधित श्रोता देखील जेणेकरून परिणाम उपलब्ध झाल्यावर आमच्या अ‍ॅपला सूचित केले जाईल.

डिटेक्टर.डिटेक्टइनिमेज (प्रतिमा) .एडऑनसुकेसलिझरर (नवीन ऑनसुकसलिस्टेनर() {@Override // करण्यासाठी //}}). OOFFureureListener (new OnFailureListener () {@Override सार्वजनिक शून्य onFailure (@ नॉनल अपवाद अपवाद) {// अपवाद // failed}) सह अयशस्वी झाले) }

जर हे ऑपरेशन अयशस्वी झाले, तर मी एक टोस्ट प्रदर्शित करणार आहे, परंतु जर ऑपरेशन यशस्वी झाले तर मी प्रतिसादासह प्रोसेसएक्स्ट्राक्स्ट टेक्स्टला कॉल करेन.

याक्षणी, माझा मजकूर शोध कोड असा दिसतो:

// फायरबेसव्हिजनआयमॅजेशन // खाजगी शून्य रनटेक्स्टरॅकॉग () तयार करा {फायरबेसविझन प्रतिमा प्रतिमा = फायरबेसविझनआयमेज.फ्रॅमबिटमैप (मायबिटमैप); // फायरबेसव्हिजनक्लॉडटेक्स्टडिटेक्टर // फायरबेसविज़नटेक्स्टडिटेक्टर डिटेक्टर = फायरबेसव्हीजन.गेटइन्स्टन्स (). GetVisionTextDetector () मिळवा; // ऑनस्क्सेसलिस्टनर नोंदणी करा // डिटेक्टर.डिटेक्टइन्इमेज (प्रतिमा) .अॅडऑनसुकसेलिस्टनर (नवीन ऑनसुकसलिस्टनर)() {@ ओव्हरराइड // ऑनसुकस कॉलबॅकची अंमलबजावणी करा // पब्लिक शून्य ऑनसकसेस (फायरबेसविझनटेक्स्ट मजकूर) {// प्रतिसादासह कॉल प्रक्रियाएक्स्ट्रेक्ट टेक्स्ट (प्रोसेसएक्स्ट्राक्ड टेक्स्ट) (ग्रंथ); O}). Oऑन फेलरलिस्टनर (नवीन ऑनफाईलरलिस्टनर () {@ ओव्हरराइड // ऑनफेलर कॅलबॅक // सार्वजनिक शून्य ऑनफेलर लागू करा (@ नॉनल अपवाद अपवाद) ast टोस्ट.मॅकटेक्स्ट (मेनएक्टिविटी.थिस, "अपवाद", टोस्ट. एलएनजीएचएल)). );}}); }

आमच्या अ‍ॅपला जेव्हा ऑनसक्सेस सूचना प्राप्त होते तेव्हा आम्हाला परीणामांचे विश्लेषण करणे आवश्यक आहे.

फायरबेसविजनटेक्स्ट ऑब्जेक्टमध्ये घटक, रेषा आणि ब्लॉक्स असू शकतात, जिथे प्रत्येक ब्लॉक सामान्यत: मजकूराच्या एकाच परिच्छेदाचे समतुल्य असतो. जर फायरबेसविजनटेक्स्टने 0 ब्लॉक्स परत केले तर आम्ही “No_text” स्ट्रिंग प्रदर्शित करू, परंतु त्यात एक किंवा अधिक ब्लॉक्स असल्यास आम्ही आपल्या टेक्स्ट व्ह्यूचा भाग म्हणून पुनर्प्राप्त केलेला मजकूर प्रदर्शित करू.

खाजगी शून्य प्रक्रियाएक्स्टेक्टेड टेक्स्ट (फायरबेसविझनटेक्स्ट फायरबेसविझनटेक्स्ट) {मायटेक्स्टव्यू.सेटसेट (नल); if (फायरबेसविजनटेक्स्ट.टेटब्लॉक्स (). आकार () == 0) {मायटेक्स्टव्यू.सेटसेट (आर. स्ट्रिंग.नो_टेक्स्ट); परत; Fire साठी (फायरबेसविझनटेक्स्ट. ब्लॉक ब्लॉक: फायरबेसविझनटेक्स्ट.बेटब्लॉक्स ()) T मायटेक्स्टव्यू.अपेन्ड (block.getText ()); }}}

येथे पूर्ण केलेला क्रियाकलाप कोड आहे:

android.ographicics.Bitmap आयात करा; android.os.Bundle आयात करा; आयात करा android.widget.ImageView; android.content.Inttent आयात करा; android.widget.TextView आयात करा; android.widget.Toast आयात करा; android.view.View आयात करा; android.net.Uri आयात करा; 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 आयात करा; पब्लिक क्लास मेनएक्टिव्हिटीने बेसअॅक्टिव्हिटी अवजारे विस्तारित केली. व्यू.ऑनक्लिकलिस्टर {खासगी बिटमैप मायबिटमॅप; खासगी इमेजव्यू खाजगी मजकूर दृश्य myTextView; @ ओव्हरराइड संरक्षित शून्य ऑनक्रिएट (बंडल सेव्हिडइन्स्टेन्सस्टेट). सुपर.ऑनक्रिएट (सेव्हिडइन्स्टेन्सस्टेट); सेट कॉन्टेन्ट व्ह्यू (आर.लेआउट.एक्टिव्हिटी_मेन); मायटेक्स्टव्यू = फाइंड व्ह्यूबायआयडी (आर. आयडी.टेक्स्टव्ह्यू); मायआयमेजव्यू = फाइंड व्ह्यूबायआयडी (आर.आयडी.आयमेजव्यूव्ह); FindViewById (R.id.checkText) .setOnClickListener (हे); } @ ओव्हरराइड पब्लिक रिक्त ऑनक्लिक (दृश्य पहा) {स्विच (व्ह्यू .आइडआयडी ()) {केस आर.आयडी.केकटेक्स्ट: जर (मायबिटमॅप! = शून्य) {रनटेक्स्टरॅकॉग (); } ब्रेक; C} @Averride संरक्षित शून्य onActivityResult (इंटरेक्स्ट कोड, इंट रिझल्ट कोड, इन्टेंट डेटा). सुपर.ऑन अ‍ॅक्टिव्हिटी रिझल्ट (रिक्वेस्ट कोड, रिझल्ट कोड, डेटा); जर (परिणाम कोड == RESULT_OK) {स्विच (विनंती कोड) {प्रकरण WRITE_STORAGE: चेकपर्मिशन (विनंती कोड); ब्रेक केस SELECT_PHOTO: उरी डेटा Uri = डेटा.getData (); स्ट्रिंग पथ = MyHelper.getPath (हा, डेटायूरी); if (पथ == शून्य) {मायबीटमैप = मायहेल्पर.रेसाइफोटो (फोटो, हा, डेटायूरी, मायआयमेझ व्ह्यू); } अन्यथा {मायबीटमैप = मायहेल्पर.रेसाइफोटो (फोटो, पथ, मायआयमेझ व्ह्यू); } if (myBitmap! = null) {myTextView.setText (शून्य); मायआयमेझव्यू.सेटआयमेजबिटमॅप (मायबिटमॅप); } ब्रेक; }}} खाजगी शून्य रनटेक्स्टरॅकॉग () {फायरबेसविजनइमेज प्रतिमा = फायरबेसविजनइमेज.फ्रॅमबिटमॅप (मायबिटमैप); फायरबेसविझनटेक्स्टडिटेक्टर डिटेक्टर = फायरबेसविजन.गेटइन्स्टन्स (). GetVisionTextDetector (); डिटेक्टर.डिटेक्टइनिमेज (प्रतिमा) .एडऑनसुकेसलिझरर (नवीन ऑनसुकसलिस्टेनर() {@ ओव्हरसाइड पब्लिक रिक्त ऑनसुकस (फायरबेसविजनटेक्स्ट टेक्स्ट) {प्रोसेसएक्स्ट्राक्स्ट टेक्स्ट (ग्रंथ); }}) .अनऑफेलरलिस्टनर (नवीन ऑनफाईलरलिस्टनर () {@ ओव्हरराइड पब्लिक रिक्त ऑनफेलवर (@ नॉनल अपवाद अपवाद) ast टोस्ट.मेकटेक्स्ट (मुख्य क्रियाकलाप, "अपवाद", टोस्ट. एलएनजीएचटी_लॉन्ग .शॉ ();});} } खाजगी शून्य प्रक्रियाएक्स्टेक्टेड टेक्स्ट (फायरबेसविझनटेक्स्ट फायरबेसविजनटेक्स्ट) {मायटेक्स्टव्यू.सेटसेट (नल); if (फायरबेसविजनटेक्स्ट.टेटब्लॉक्स (). आकार () == 0) {मायटेक्स्टव्यू.सेटसेट (आर. स्ट्रिंग.नो_टेक्स्ट); परत; Fire साठी (फायरबेसविझनटेक्स्ट. ब्लॉक ब्लॉक: फायरबेसविझनटेक्स्ट.बेटब्लॉक्स ()) T मायटेक्स्टव्यू.अपेन्ड (block.getText ()); }}}

प्रकल्पाची चाचणी घेत आहे

आता कृती करताना एमएल किटची मजकूर ओळखण्याची वेळ आली आहे! हा प्रकल्प Android डिव्हाइस किंवा एव्हीडी वर स्थापित करा, गॅलरीमधून एखादी प्रतिमा निवडा आणि नंतर “मजकूर तपासा” बटणावर टॅप द्या. अ‍ॅपने प्रतिमेमधून सर्व मजकूर काढल्यानंतर आणि नंतर मजकूर दृश्यात प्रदर्शित करुन प्रतिसाद दिला पाहिजे.

लक्षात ठेवा की आपल्या प्रतिमेचा आकार आणि त्यातील मजकूराच्या प्रमाणात अवलंबून आपण काढलेले सर्व मजकूर पाहण्यासाठी स्क्रोल करण्याची आवश्यकता असू शकते.

आपण पूर्ण प्रकल्प गिटहब वरून डाउनलोड देखील करू शकता.

लपेटणे

एमएल किट वापरुन प्रतिमेमधून मजकूर कसा शोधायचा आणि तो कसा काढायचा हे आपल्याला आता ठाऊक आहे.

मजकूर ओळख API हा एमएल किटचा फक्त एक भाग आहे. हे एसडीके बारकोड स्कॅनिंग, फेस डिटेक्शन, इमेज लेबलिंग आणि लँडमार्क रिकग्निशनदेखील देते, स्मार्ट रिप्लाय आणि हाय डेन्सिटी फेस कॉन्टूर एपीआयसह सामान्य मोबाइल वापर प्रकरणांमध्ये अधिक एपीआय जोडण्याची योजना.

आपल्याला कोणत्या एमएल किट एपीआयचा प्रयत्न करण्यास सर्वात जास्त रस आहे? आम्हाला खाली टिप्पण्या कळू द्या!

मीझू आजूबाजूला सर्वात अंडररेटेड स्मार्टफोन ब्रँडपैकी एक असू शकतो, जो मोठ्या प्रमाणात एंड्रॉइडच्या आधी पैशासाठी महान मूल्य आणि जेश्चर-चालित वापरकर्ता इंटरफेस मार्ग वितरीत करतो. आता, कंपनीने आपला नवीनतम...

मेगाबिट वि मेगाबाइट गोंधळ इंटरनेट वापरकर्त्यांमध्ये व्यापक आहे. म्हणूनच आम्ही येथे काही अनिश्चितता दूर करण्यासाठी आणि मेगाबाइट्स मेगाबाईटमध्ये रूपांतरित करण्यात मदत करण्यासाठी येथे आहोत....

मनोरंजक