Како извући текст са слика помоћу Гоогле-овог СДК-а за машинско учење

Аутор: John Stephens
Датум Стварања: 27 Јануар 2021
Ажурирати Датум: 5 Јули 2024
Anonim
MJC Stream: Видишь енота? А он есть! Главное об ML и компьютерном зрении
Видео: MJC Stream: Видишь енота? А он есть! Главное об ML и компьютерном зрении

Садржај


Можете користити и АПИ за препознавање текста као основу за преводилачке апликације или услуге приступачности на којима корисник може усмјерити камеру било који текст са којим се бори и прочитати их наглас.

У овом туториалу ћемо поставити темеље за широк спектар иновативних функција, креирајући апликацију која може издвојити текст са било које слике у корисничкој галерији. Иако то нећемо покрити у овом туториалу, такође можете снимити текст из окружења корисника у реалном времену, повезивањем ове апликације на камеру уређаја.

На уређају или у облаку?

Неки АПИ-ји за МЛ Кит доступни су само на уређају, али неколико их је доступних на уређају и у облаку, укључујући АПИ за препознавање текста.

Текст АПИ-је утемељен на облаку може идентификовати шири спектар језика и знакова и обећава већу тачност од колеге на уређају. Међутим, то заиста захтевају активну интернетску везу и доступна је само за пројекте на нивоу Блазеа.


У овом ћемо чланку локално покренути АПИ за препознавање текста, тако да можете слиједити без обзира да ли сте надоградили на Блазе или сте на бесплатном плану Фиребасе Спарк.

Креирање апликације за препознавање текста помоћу МЛ Кит

Креирајте апликацију са подешавањима по вашем избору, али када се то од вас затражи изаберите предложак „Испразни активност“.

МЛ Кит СДК је део Фиребасе-а, тако да ћете морати да повежете свој пројекат са Фиребасе-ом, користећи свој СХА-1 цертификат за потписивање. Да бисте добили СХА-1 вашег пројекта:

  • Изаберите картицу „Градле“ за Андроид Студио.
  • На плочи „Пројекти Градле“ двапут кликните да бисте проширили „коријен“ пројекта, а затим изаберите „Задаци> Андроид> Извештај о потпису“.
  • Плоча дуж дна прозора Андроид Студио требало би да се ажурира како би се приказале неке информације о овом пројекту - укључујући и његов СХА-1 цертификат за потписивање.


Да бисте повезали свој пројекат са Фиребасе:

  • У свом веб претраживачу покрените Фиребасе Цонсоле.
  • Изаберите „Додај пројекат“.
  • Дајте име пројекту; Користим "МЛ Тест".
  • Прочитајте услове и одредбе, а ако сте задовољни наставите, одаберите „Прихватам…“, а затим „Креирај пројекат“.
  • Изаберите „Додај Фиребасе у Андроид апликацију“.
  • Унесите назив пакета вашег пројекта који ћете наћи на врху датотеке МаинАцтивити и унутар Манифеста.
  • Унесите СХА-1 потврду вашег пројекта.
  • Кликните на „Регистрирај апликацију.“
  • Изаберите „Преузми гоогле-сервицес.јсон.“ Ова датотека садржи све потребне метаподатке Фиребасе за ваш пројекат, укључујући АПИ кључ.
  • У Андроид студију превуците и испустите датотеку гоогле-сервицес.јсон у директориј „апликација“ вашег пројекта.

  • Отворите датотеку буилд.градле на нивоу пројекта и додајте класу Гоогле услуга:

цласспатх цом.гоогле.гмс: гоогле-сервицес: 4.0.1

  • Отворите датотеку буилд.градле на нивоу апликације и додајте зависности за Фиребасе Цоре, Фиребасе МЛ Висион и тумач модела, плус додатак за Гоогле услуге:

примените додатак: цом.гоогле.гмс.гоогле-сервицес ... ... ... зависности {имплементација филеТрее (дир: либс, укључују:) имплементација цом.гоогле.фиребасе: фиребасе-цоре: 16.0.1 цом. гоогле.фиребасе: фиребасе-мл-висион: 16.0.0 имплементација цом.гоогле.фиребасе: фиребасе-мл-модел-тумач: 16.0.0

У овом тренутку, покренућете пројекат тако да се може повезати са Фиребасе серверима:

  • Инсталирајте апликацију на физички Андроид паметни телефон или таблет или на Андроид виртуелни уређај (АВД).
  • На Фиребасе конзоли изаберите „Покрените апликацију да бисте проверили инсталацију“.
  • Након неколико тренутака требали бисте видети „Честитке“; изаберите „Настави до конзоле.“

Преузмите Гоогле-ове унапред обучене моделе машинског учења

Подразумевано, МЛ Кит преузима само моделе када и када је потребно, тако да ће наша апликација преузети ОЦР модел када корисник први пут покуша да извуче текст.

То може потенцијално да има негативан утицај на корисничко искуство - замислите да покушавате да приступите некој функцији, само да бисте открили да апликација мора да преузме више ресурса пре него што заиста може да пружи ту функцију. У најгорем случају, ваша апликација можда неће моћи ни преузети ресурсе који су јој потребни, на пример ако уређај нема интернетску везу.

Да би се осигурало да се то не догађа са нашом апликацијом, преузет ћу потребан ОЦР модел у време инсталације, што захтева неке промене Маниест-а.

Док је отворен Манифест, додаћу и дозволу ВРИТЕ_ЕКСТЕРНАЛ_СТОРАГЕ коју ћемо касније користити у овом туториалу.

// Додајте ВРИТЕ_ЕКСТЕРНАЛ_СТОРАГЕ дозволу // // Додајте следеће //

Изградња изгледа

Склонимо вам једноставне ствари и креирајте изглед који се састоји од:

  • ИмагеВиев. У почетку ће се приказати држач места, али ће се ажурирати када корисник одабере слику из своје галерије.
  • Дугме које активира вађење текста.
  • ТектВиев, где ћемо приказати извучени текст.
  • СцроллВиев. Будући да не постоји гаранција да ће се извучени текст уредно уклопити на екран, поставићу ТектВиев унутар СцроллВиев.

Ево готове датотеке Ацтивити_маин.кмл:

Овај изглед односи се на „иц_плацехолдер“ који се може нацртати, па сада направимо ово:

  • Изаберите „Датотека> Ново> Ассет слике“ на траци са алаткама Андроид Студио.
  • Отворите падајући изборник „Врста иконе“ и изаберите „Акције траке и иконе картице“.
  • Провјерите је ли одабран радио гумб "Цлип Арт".
  • Кликните на дугме "Цлип Арт".
  • Изаберите слику коју желите да користите као чувар места; Користим „Додај у фотографије“.
  • Кликните на „ОК“.
  • Отворите падајући мени „Тема“ и изаберите „ХОЛО_ЛИГХТ“.
  • У поље "Име" унесите "иц_плацехолдер."
  • Кликните на „Даље“. Прочитајте информације, а ако сте задовољни наставите, кликните на „Заврши“.

Иконе траке са радњама: Покретање апликације Галерија

Затим ћу креирати ставку радне траке која ће покренути корисничку галерију, спремна за њих да одаберу слику.

Дефинишете иконе траке акција унутар датотеке ресурса менија, која живи у директоријуму „рес / мену“. Ако ваш пројекат не садржи овај директориј, мораћете да га креирате:

  • Кликните контролним кликом на директоријум „рес“ вашег пројекта и изаберите „Ново> Андроид Ресоурце Дирецтори“.
  • Отворите падајући избор „Врста ресурса“ и одаберите „мени“.
  • Име именика требало би аутоматски да се ажурира на „мени“, али ако то не буде, морат ћете га преименовати ручно.
  • Кликните на „ОК“.

Сада сте спремни да направите датотеку са ресурсима менија:

  • Контролно кликните директоријум „менија“ вашег пројекта и изаберите „Ново> Датотека ресурса менија.
  • Назовите ову датотеку „ми_мену“.
  • Кликните на „ОК“.
  • Отворите датотеку „ми_мену.кмл“ и додајте следеће:

// Креирајте елемент за сваку радњу //

Датотека менија наводи низ „ацтион_галлери“, па отворите датотеку рес / валуес / стрингс.кмл вашег пројекта и направите овај ресурс. Док сам овде, дефинишем и остале жице које ћемо користити током овог пројекта.

Галерија Овој апликацији треба да приступи датотекама на вашем уређају. Није пронађен текст

Затим користите Имаге Ассет Студио да бисте креирали икону „иц_галлери“ траке акције:

  • Изаберите „Датотека> Ново> Имовина слике.“
  • Подесите падајући тип „Икона“ на „Иконе траке и картице“.
  • Кликните на „Цлип Арт“ дугме.
  • Изаберите цртеж; Користим "слику".
  • Кликните на „ОК“.
  • Да бисте били сигурни да је ова икона јасно видљива на радној траци, отворите падајући мени „Тема“ и изаберите „ХОЛО_ДАРК“.
  • Дајте назив овој икони „иц_галлери.“
  • „Кликните„ Даље “, а затим„ Заврши “.

Руковање захтевима за дозволу и кликните догађаје

Обавићу све задатке који нису директно повезани са АПИ-јем за препознавање текста у засебној класи БасеАцтивити, укључујући инстанцирање менија, руковање догађајима са кликом на акциону траку и захтевање приступа складишту уређаја.

  • Изаберите „Датотека> Ново> Јава класа“ на траци са алаткама Андроид Студио.
  • Назовите ову класу "БасеАцтивити."
  • Кликните на „ОК“.
  • Отворите БасеАцтивити и додајте следеће:

импорт андроид.апп.Ацтивити; импорт андроид.суппорт.в4.апп.АцтивитиЦомпат; импорт андроид.суппорт.в7.апп.АцтионБар; импорт андроид.суппорт.в7.апп.АлертДиалог; импорт андроид.суппорт.в7.апп.АппЦомпатАцтивити; импорт андроид.ос.Бундле; импорт андроид.цонтент.ДиалогИнтерфаце; импорт андроид.цонтент.Интент; импорт андроид.Манифест; импорт андроид.провидер.МедиаСторе; импорт андроид.виев.Мену; импорт андроид.виев.МенуИтем; импорт андроид.цонтент.пм.ПацкагеМанагер; импорт андроид.нет.Ури; импорт андроид.провидер.Сеттингс; импорт андроид.суппорт.аннотатион.НонНулл; импорт андроид.суппорт.аннотатион.Нуллабле; импорт јава.ио.Филе; Јавна класа БасеАцтивити проширује АппЦомпатАцтивити {јавни статички коначни инт ВРИТЕ_СТОРАГЕ = 100; јавни статички коначни инт СЕЛЕЦТ_ПХОТО = 102; јавни статички завршни низ АЦТИОН_БАР_ТИТЛЕ = "ацтион_бар_титле"; јавна слика датотеке; @Оверриде заштићена празнина онЦреате (@Нуллабле Бундле савеИнстанцеСтате) {супер.онЦреате (савеИнстанцеСтате); АцтионБар ацтионБар = гетСуппортАцтионБар (); иф (ацтионБар! = нулл) {ацтионБар.сетДисплаиХомеАсУпЕнаблед (истина); ацтионБар.сетТитле (гетИнтент (). гетСтрингЕктра (АЦТИОН_БАР_ТИТЛЕ)); }} @ Пребрисати јавни буоле онЦреатеОптионсМену (мени менија) {гетМенуИнфлатер (). Надувавање (Р.мену.ми_мену, мени); повратак истинит; } @Оверриде јавни боолеан онОптионсИтемСелецтед (ставка МенуИтем) {преклопник (итем.гетИтемИд ()) {// Ако је изабрано „Галлеригери“, онда ... // случај Р.ид.галлери васхинг: //...проверите да ли имамо ВРИТЕ_СТОРАГЕ дозволу // цхецкПермиссион (ВРИТЕ_СТОРАГЕ); пауза; } ретурн супер.онОптионсИтемСелецтед (ставка); } @ Пребрисати јавну неважећу онРекуестПермиссионсРесулт (инт рекуестЦоде, @НонНулл Стринг дозволе, @НонНулл инт грантРесултс) {супер.онРекуестПермиссионсРесулт (рекуестЦоде, дозволе, грантРесултс); Свитцх (рекуестЦоде) {цасе ВРИТЕ_СТОРАГЕ: // Ако је захтјев за дозволу одобрен, онда ... // ако (грантРесултс.ленгтх> 0 && грантРесултс == ПацкагеМанагер.ПЕРМИССИОН_ГРАНТЕД) {//...позови одабирСлика // одаберитеСлика ( ); // Ако је захтјев за дозволу одбијен, онда ... //} елсе {//...прикажите низ дозволе_рекуест // рекуестПермиссион (ово, рекуестЦоде, Р.стринг.пермиссион_рекуест); } пауза; }} // Прикажите дијалог са захтевом за дозволу // јавни статички захтев за неважећеПреузимање (коначна активност активности, коначни инт захтевЦоде, инт мсг) {АлертДиалог.Буилдер упозорење = нови АлертДиалог.Буилдер (активност); аларм.сет (мсг); аларм.сетПоситивеБуттон (андроид.Р.стринг.ок, нови ДиалогИнтерфаце.ОнЦлицкЛистенер () {@Оверриде публиц воид онЦлицк (ДиалогИнтерфаце диалогИнтерфаце, инт и) {диалогИнтерфаце.дисмисс (); Намера пермиссонИнтент = нова намера (подешавања.АЦТИОНТАП_АППЛИЦАТИОН_ПРОСТАВИТЕЉА) .сетДата (Ури.парсе ("пакет:" + Ацтивити.гетПацкагеНаме ())); Ацтивити.стартАцтивитиФорРесулт (пермиссонИнтент, рекуестЦоде);}}); аларм.сетНегативеБуттон (андроид.Р.стринг.цанцел, нови ДиалогИнтерфаце.ОнЦлицкЛистенер () {@Оверриде публиц воид онЦлицк (ДиалогИнтерфаце диалогИнтерфаце, инт и) {диалогИнтерфаце.дисмисс ();}}); аларм.сетЦанцелабле (лажно); аларм.схов (); } // Провјерите да ли је корисник одобрио дозволу ВРИТЕ_СТОРАГЕ // јавна неважећа провјераПример (инт захтјевЦоде) {свитцх (рекуестЦоде) {цасе ВРИТЕ_СТОРАГЕ: инт хасВритеЕктерналСторагеПермиссион = АцтивитиЦомпат.цхецкСелфПермиссион (ово, Манифест.пермиссион.ВРИТЕ_ЕКСТЕРНАЛ); // Ако имамо приступ спољној меморији ... // иф (хасВритеЕктерналСторагеПермиссион == ПацкагеМанагер.ПЕРМИССИОН_ГРАНТЕД) {//...позови селецтПицтуре, који покреће активност где корисник може одабрати слику // селецтПицтуре (); // Ако дозвола није дата, онда ... //} елсе {//... тражи дозволу // АцтивитиЦомпат.рекуестПермиссионс (ово је нови Стринг {Манифест.пермиссион.ВРИТЕ_ЕКСТЕРНАЛ_СТОРАГЕ}, цодеЦоде); } пауза; }} приватна празнина селецтПицтуре () {пхото = МиХелпер.цреатеТемпФиле (фотографија); Намера намера = нови намера (Интент.АЦТИОН_ПИЦК, МедиаСторе.Имагес.Медиа.ЕКСТЕРНАЛ_ЦОНТЕНТ_УРИ); // Покрените активност гдје корисник може одабрати слику // стартАцтивитиФорРесулт (намјера, СЕЛЕЦТ_ПХОТО); }}

У овом тренутку, ваш пројекат би се требао жалити да не може да реши МиХелпер.цреатеТемпФиле. Хајде да то сада имплементирамо!

Промјена величине слике помоћу цреатеТемпФиле

Креирајте нову класу "МиХелпер". У овој класи ћемо променити величину одабране слике корисника, спремну да буде обрађена помоћу АПИ-ја за препознавање текста.

импорт андроид.грапхицс.Битмап; импорт андроид.грапхицс.БитмапФацтори; импорт андроид.цонтент.Цонтект; импорт андроид.датабасе.Цурсор; импорт андроид.ос.Елвиронмент; импорт андроид.видгет.ИмагеВиев; импорт андроид.провидер.МедиаСторе; импорт андроид.нет.Ури; увоз статиц андроид.грапхицс.БитмапФацтори.децодеФиле; увоз статиц андроид.грапхицс.БитмапФацтори.децодеСтреам; импорт јава.ио.Филе; импорт јава.ио.ФилеНотФоундЕкцептион; импорт јава.ио.ФилеОутпутСтреам; импорт јава.ио.ИОЕкцептион; јавна класа МиХелпер {публиц статиц Стринг гетПатх (контекст контекста, Ури ури) {Стринг патх = ""; Стринг пројецтион = {МедиаСторе.Имагес.Медиа.ДАТА}; Цурсор цурсор = цонтект.гетЦонтентРесолвер (). Упит (ури, пројекција, нулл, нулл, нулл); инт цолумн_индек; иф (курзор! = нулл) {цолумн_индек = цурсор.гетЦолумнИндекОрТхров (МедиаСторе.Имагес.Медиа.ДАТА); цурсор.мовеТоФирст (); патх = цурсор.гетСтринг (цолумн_индек); цурсор.цлосе (); } повратни пут; } јавна статичка датотека цреатеТемпФиле (датотека датотеке) {директориј датотека = нова датотека (Енвиронмент.гетЕктерналСторагеДирецтори (). гетПатх () + "/цом.јессицатхорнсби.миапплицатион"); иф (! дирецтори.екистс () ||! дирецтори.исДирецтори ()) {дирецтори.мкдирс (); } иф (филе == нулл) {филе = нова датотека (директоријум, "ориг.јпг"); } повратна датотека; } јавна статичка битмап ресизеПхото (фајл имагеФиле, контекст контекста, Ури ури, приказ ИмагеВиев) {БитмапФацтори.Оптионс невОптионс = нова БитмапФацтори.Оптионс (); покушајте {децодеСтреам (цонтект.гетЦонтентРесолвер (). опенИнпутСтреам (ури), нулл, невОптионс); инт пхотоХеигхт = невОптионс.оутХеигхт; инт пхотоВидтх = невОптионс.оутВидтх; невОптионс.инСамплеСизе = Матх.мин (пхотоВидтх / виев.гетВидтх (), пхотоХеигхт / виев.гетХеигхт ()); узврати компресијуПхото (имагеФиле, БитмапФацтори.децодеСтреам (цонтект.гетЦонтентРесолвер (). опенИнпутСтреам (ури), нулл, невОптионс)); } цатцх (изнимка ФилеНотФоундЕкцептион) {изјем.принтСтацкТраце (); ретурн нулл; }} јавна статичка битмап ресизеПхото (датотека датотекеФила, стаза стаза, приказ сликеВиев) {БитмапФацтори.Оптионс опције = нова БитмапФацтори.Оптионс (); децодеФиле (путања, опције); инт пхотоХеигхт = оптионс.оутХеигхт; инт пхотоВидтх = оптионс.оутВидтх; оптионс.инСамплеСизе = Матх.мин (пхотоВидтх / виев.гетВидтх (), пхотоХеигхт / виев.гетХеигхт ()); узврати компресијуФото (имагеФиле, БитмапФацтори.децодеФиле (пут, опције)); } приватни статички Битмап цомпрессПхото (Филе пхотоФиле, Битмап битмап) {покушајте {ФилеОутпутСтреам фОутпут = нови ФилеОутпутСтреам (пхотоФиле); битмап.цомпресс (Битмап.ЦомпрессФормат.ЈПЕГ, 70, фОутпут); фОутпут.цлосе (); } цатцх (изузетак ИОЕкцептион) {изјем.принтСтацкТраце (); } ретурн битмап; }}

Подесите слику на ИмагеВиев

Затим морамо имплементирати онАцтивитиРесулт () у нашу класу МаинАцтивити и поставити изабрану слику корисника на наш ИмагеВиев.

импорт андроид.грапхицс.Битмап; импорт андроид.ос.Бундле; импорт андроид.видгет.ИмагеВиев; импорт андроид.цонтент.Интент; импорт андроид.видгет.ТектВиев; импорт андроид.нет.Ури; МаинАцтивити у јавној класи проширује БасеАцтивити {приватни Битмап миБитмап; приватни ИмагеВиев миИмагеВиев; приватни ТектВиев миТектВиев; @Оверриде заштићен воид онЦреате (Бундле савеИнстанцеСтате) {супер.онЦреате (савеИнстанцеСтате); сетЦонтентВиев (Р.лаиоут.ацтивити_маин); миТектВиев = финдВиевБиИд (Р.ид.тектВиев); миИмагеВиев = финдВиевБиИд (Р.ид.имагеВиев); } @Оверриде заштићена воид онАцтивитиРесулт (инт захтјевЦоде, инт ресултЦоде, подаци о намјерама) {супер.онАцтивитиРесулт (рекуестЦоде, ресултЦоде, подаци); иф (ресултЦоде == РЕСУЛТ_ОК) {свитцх (рекуестЦоде) {цасе ВРИТЕ_СТОРАГЕ: цхецкПермиссион (рекуестЦоде); пауза; случај СЕЛЕЦТ_ПХОТО: Ури датаУри = дата.гетДата (); Стринг патх = МиХелпер.гетПатх (ово, датаУри); иф (патх == нулл) {миБитмап = МиХелпер.ресизеПхото (фотографија, ово, датаУри, миИмагеВиев); } елсе {миБитмап = МиХелпер.ресизеПхото (фотографија, стаза, миИмагеВиев); } иф (миБитмап! = нулл) {миТектВиев.сетТект (нулл); миИмагеВиев.сетИмагеБитмап (миБитмап); } пауза; }}}}

Покрените овај пројекат на физичком Андроид уређају или АВД-у и кликните икону траке акције. Када се од вас затражи, дајте дозволу ВРИТЕ_СТОРАГЕ и изаберите слику из галерије; ова би слика сада требала бити приказана у корисничком сучељу ваше апликације.

Сада смо поставили темеље, спремни смо да почнемо са вађењем неког текста!

Подучавање апликације да препозна текст

Желим покренути препознавање текста као одговор на догађај клика, тако да морамо имплементирати ОнЦлицкЛистенер:

импорт андроид.грапхицс.Битмап; импорт андроид.ос.Бундле; импорт андроид.видгет.ИмагеВиев; импорт андроид.цонтент.Интент; импорт андроид.видгет.ТектВиев; импорт андроид.виев.Виев; импорт андроид.нет.Ури; МаинАцтивити јавне класе проширује БасеАцтивити реализује Виев.ОнЦлицкЛистенер {привате Битмап миБитмап; приватни ИмагеВиев миИмагеВиев; приватни ТектВиев миТектВиев; @Оверриде заштићен воид онЦреате (Бундле савеИнстанцеСтате) {супер.онЦреате (савеИнстанцеСтате); сетЦонтентВиев (Р.лаиоут.ацтивити_маин); миТектВиев = финдВиевБиИд (Р.ид.тектВиев); миИмагеВиев = финдВиевБиИд (Р.ид.имагеВиев); финдВиевБиИд (Р.ид.цхецкТект) .сетОнЦлицкЛистенер (ово); } @Оверриде публиц воид онЦлицк (Виев виев) {свитцх (виев.гетИд ()) {цасе Р.ид.цхецкТект: иф (миБитмап! = Нулл) {// Ми ћемо имплементирати рунТектРецог у следећем кораку // рунТектРецог (); } пауза; }}

МЛ Кит може обрадити слике само у формату ФиребасеВисионИмаге, тако да морамо претворити нашу слику у објект ФиребасеВисионИмаге. Можете креирати ФиребасеВисионИмаге из Битмап, медиа.Имаге, БитеБуффер или бите арраи. Будући да радимо са Битмап-овима, морамо позвати услужну методу фромБитмап () класе ФиребасеВисионИмаге и проследити је нашој Битмапи.

привате воид рунТектРецог () {ФиребасеВисионИмаге имаге = ФиребасеВисионИмаге.фромБитмап (миБитмап);

МЛ Кит има различите класе детектора за сваку од својих операција препознавања слике. За текст морамо користити класу ФиребасеВисионТектДетецтор која врши оптичко препознавање знакова (ОЦР) на слици.

Стварамо инстанцу ФиребасеВисионТектДетецтор, користећи гетВисионТектДетецтор:

Детектор ФиребасеВисионТектДетецтор = ФиребасеВисион.гетИнстанце (). ГетВисионТектДетецтор ();

Затим морамо проверити ФиребасеВисионИмаге за текст позивањем методе детецтИнИмаге () и просљеђивањем објекта ФиребасеВисионИмаге. Такође морамо имплементирати повратне позиве за онСуццесс и онФаилуре, као и одговарајуће слушаоце, тако да наша апликација буде обавештена кад год резултати постану доступни.

детецтор.детецтИнИмаге (слика) .аддОнСуццессЛистенер (нови ОнСуццессЛистенер() {@Оверриде // Да би урадио //}}). АддОнФаилуреЛистенер (нови ОнФаилуреЛистенер () {@Оверриде јавно неважеће стање онФаилуре (изузетак @НонНулл Екцептион) {// Задатак није успео са изузетком //}}); }

Ако ова операција не успе, приказат ћу здравицу, али ако је операција успела, назваћу процессЕктрацтедТект са одговором.

У овом тренутку мој код за откривање текста изгледа овако:

// Креирајте ФиребасеВисионИмаге // приватни воид рунТектРецог () {ФиребасеВисионИмаге имаге = ФиребасеВисионИмаге.фромБитмап (миБитмап); // Креирајте инстанцу ФиребасеВисионЦлоудТектДетецтор // ФиребасеВисионТектДетецтор детецтор = ФиребасеВисион.гетИнстанце (). ГетВисионТектДетецтор (); // Регистрирајте се на ОнСуццессЛистенер // детецтор.детецтИнИмаге (слика) .аддОнСуццессЛистенер (нови ОнСуццессЛистенер() {@Оверриде // Имплементира повратни позив онСуццесс // јавна воид онСуццесс (Текстови ФиребасеВисионТект) {// Поступак позиваЕктрацтедТект са одговором // процессЕктрацтедТект (текстови); }}). аддОнФаилуреЛистенер (нови ОнФаилуреЛистенер () {@Оверриде // Имплементирај повратну информацију онФаилуре // јавна воид онФаилуре (изузетак @НонНулл Екцептион) {Тоаст.макеТект (МаинАцтивити.тхис, "Изузетак", Тоаст.ЛЕНГТХ_ЛОНГ) );}}); }

Кад год наша апликација прими обавештење о успеху, морамо да анализирамо резултате.

Објект ФиребасеВисионТект може садржавати елементе, линије и блокове, при чему сваки блок обично представља један одломак текста. Ако ФиребасеВисионТект врати 0 блокова, приказаћемо низ "но_тект", али ако садржи један или више блокова, приказаћемо дохваћени текст као део нашег ТектВиев.

приватни воид процессЕктрацтедТект (ФиребасеВисионТект фиребасеВисионТект) {миТектВиев.сетТект (нулл); иф (фиребасеВисионТект.гетБлоцкс (). сизе () == 0) {миТектВиев.сетТект (Р.стринг.но_тект); повратак; } за (ФиребасеВисионТект.Блоцк блок: фиребасеВисионТект.гетБлоцкс ()) {миТектВиев.аппенд (блоцк.гетТект ()); }}}

Ево испуњеног кода МаинАцтивити:

импорт андроид.грапхицс.Битмап; импорт андроид.ос.Бундле; импорт андроид.видгет.ИмагеВиев; импорт андроид.цонтент.Интент; импорт андроид.видгет.ТектВиев; импорт андроид.видгет.Тоаст; импорт андроид.виев.Виев; импорт андроид.нет.Ури; импорт андроид.суппорт.аннотатион.НонНулл; импорт цом.гоогле.фиребасе.мл.висион.цоммон.ФиребасеВисионИмаге; импорт цом.гоогле.фиребасе.мл.висион.тект.ФиребасеВисионТект; импорт цом.гоогле.фиребасе.мл.висион.тект.ФиребасеВисионТектДетецтор; импорт цом.гоогле.фиребасе.мл.висион.ФиребасеВисион; импорт цом.гоогле.андроид.гмс.таскс.ОнСуццессЛистенер; импорт цом.гоогле.андроид.гмс.таскс.ОнФаилуреЛистенер; МаинАцтивити јавне класе проширује БасеАцтивити реализује Виев.ОнЦлицкЛистенер {привате Битмап миБитмап; приватни ИмагеВиев миИмагеВиев; приватни ТектВиев миТектВиев; @Оверриде заштићен воид онЦреате (Бундле савеИнстанцеСтате) {супер.онЦреате (савеИнстанцеСтате); сетЦонтентВиев (Р.лаиоут.ацтивити_маин); миТектВиев = финдВиевБиИд (Р.ид.тектВиев); миИмагеВиев = финдВиевБиИд (Р.ид.имагеВиев); финдВиевБиИд (Р.ид.цхецкТект) .сетОнЦлицкЛистенер (ово); } @ Пребрисати јавну неважећу онЦлицк (Прикажи приказ) {свитцх (виев.гетИд ()) {цасе Р.ид.цхецкТект: иф (миБитмап! = Нулл) {рунТектРецог (); } пауза; }} @ Пребрисана заштићена воид онАцтивитиРесулт (инт захтјевЦоде, инт ресултЦоде, подаци о намјерама) {супер.онАцтивитиРесулт (рекуестЦоде, ресултЦоде, подаци); иф (ресултЦоде == РЕСУЛТ_ОК) {свитцх (рекуестЦоде) {цасе ВРИТЕ_СТОРАГЕ: цхецкПермиссион (рекуестЦоде); пауза; случај СЕЛЕЦТ_ПХОТО: Ури датаУри = дата.гетДата (); Стринг патх = МиХелпер.гетПатх (ово, датаУри); иф (патх == нулл) {миБитмап = МиХелпер.ресизеПхото (фотографија, ово, датаУри, миИмагеВиев); } елсе {миБитмап = МиХелпер.ресизеПхото (фотографија, стаза, миИмагеВиев); } иф (миБитмап! = нулл) {миТектВиев.сетТект (нулл); миИмагеВиев.сетИмагеБитмап (миБитмап); } пауза; }}} приватни воид рунТектРецог () {ФиребасеВисионИмаге имаге = ФиребасеВисионИмаге.фромБитмап (миБитмап); Детектор ФиребасеВисионТектДетецтор = ФиребасеВисион.гетИнстанце (). ГетВисионТектДетецтор (); детецтор.детецтИнИмаге (слика) .аддОнСуццессЛистенер (нови ОнСуццессЛистенер() {@ Овервериде публиц воид онСуццесс (Текстови ФиребасеВисионТект) {процессЕктрацтедТект (текстови); }}). аддОнФаилуреЛистенер (нови ОнФаилуреЛистенер () {@Оверриде јавна неважећа функцијаФаилуре (изузетак @НонНулл Екцептион) {Тоаст.макеТект (МаинАцтивити.тхис, "Изузетак", Тоаст.ЛЕНГТХ_ЛОНГ) .схов ();}}}); } приватни воид процессЕктрацтедТект (ФиребасеВисионТект фиребасеВисионТект) {миТектВиев.сетТект (нулл); иф (фиребасеВисионТект.гетБлоцкс (). сизе () == 0) {миТектВиев.сетТект (Р.стринг.но_тект); повратак; } за (ФиребасеВисионТект.Блоцк блок: фиребасеВисионТект.гетБлоцкс ()) {миТектВиев.аппенд (блоцк.гетТект ()); }}}

Тестирање пројекта

Сада је време да видите препознавање текста МЛ Кит-а у акцији! Инсталирајте овај пројекат на Андроид уређај или АВД, изаберите слику из галерије, а затим додирните дугме „Провери текст“. Апликација би требало да одговори тако што ће извући сав текст са слике, а затим га приказати у ТектВиев-у.

Имајте на уму да ће, зависно од величине ваше слике и количине текста у њој, можда бити потребно да се померите да бисте видели сав извучени текст.

Такође можете да преузмете комплетан пројекат са ГитХуб-а.

Окончање

Сада знате како да откријете и издвојите текст са слике, користећи МЛ Кит.

АПИ за препознавање текста само је један део МЛ комплета. Овај СДК такође нуди скенирање баркода, препознавање лица, означавање слике и препознавање оријентира, са плановима за додавање више АПИ-ја за уобичајене случајеве мобилне употребе, укључујући Смарт Репли и АПИ обриса лица високе густине.

Који МЛ Кит АПИ највише занимате? Јавите нам у коментарима испод!

Аппле Мацбоок Про са додирном траком.Федерална управа за ваздухопловство (ФАА) саопштила је да забрањује одабир Мацбоок Про модела за летове у име сигурности....

Машине преузимају свет! Па, можда још не сасвим, али АИ и машинско учење већ покрећу много више света него што то можда схватате. Ти би могао покренути каријеру пионири ових технолошких иновација паке...

Саветујемо Вам Да Прочитате