Создание считывателя визиток с использованием android vision Text OCR
Я создаю приложение для Android, используя текстовое распознавание текста от Google для мобильных устройств для ввода визитных карточек в качестве контактов в телефоне.
До сих пор я смог распознать любой текст, сгенерированный латиницей, и смог применить регулярные выражения к блоку кода.
Я создал класс bean-компонента Contacts для пяти переменных: name, email, compnayname, website, adrs, phnno. После применения регулярных выражений к сгенерированным живым данным я фильтрую результаты и сохраняю их в объекте типа bean. класс и передача этого объекта в действие и извлекать данные, хранящиеся в этом объекте, и отображать его в моих текстовых представлениях.
Метод определения графического класса OCR >>>
List<? extends Text> textComponents = text.getComponents();
for(final Text currentText : textComponents) {
float left = translateX(currentText.getBoundingBox().left);
float bottom = translateY(currentText.getBoundingBox().bottom);
canvas.drawText(currentText.getValue(), left, bottom, sTextPaint);
if (currentText != null && currentText.getValue() != null) {
//stringList.add(currentText.getValue());
Log.e("OCrGraphic", "Text detected! " + currentText.getValue());
if (isCompany== false && currentText.getValue().matches(".[A-Z].[^@$#/-<>!]+")) {
Log.e("currentTextcompanyName", currentText.getValue());
companyName = "";
companyName = currentText.getValue();
isCompany = true;
contactsBeans.setCompanyName(companyName);
}
if (isEmail == false && currentText.getValue().matches("^[_A-Za-z0-9-\\\\+]+(\\\\.[_A-Za-z0-9-]+)*@\"\n" +
"\t\t+ \"[A-Za-z0-9-]+(\\\\.[A-Za-z0-9]+)*(\\\\.[A-Za-z]{2,})$") || currentText.getValue().contains("@")) {
Log.e("currentTextemail", currentText.getValue());
email = "";
email = currentText.getValue();
isEmail = true;
contactsBeans.setEmail(email);
}
// Patterns.WEB_URL.matcher(currentText.getValue()).matches();
if (isWebsite == false && currentText.getValue().matches("^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]") || currentText.getValue().startsWith("www") || currentText.getValue().contains("Website") || currentText.getValue().contains("www")) {
Log.e("currentTextWebsite", currentText.getValue());
website = "";
website = currentText.getValue();
isWebsite = true;
contactsBeans.setWebsite(website);
}
if (isName== false && currentText.getValue().matches("[a-zA-z]+([ '-][a-zA-Z]+)*")) {
Log.e("name", currentText.getValue());
name = "";
name = currentText.getValue();
isName = true;
contactsBeans.setName(name);
}
if (isPhone == false && !currentText.getValue().contains("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") && currentText.getValue().startsWith("+") || currentText.getValue().startsWith("0") && currentText.getValue().contains("+-0123456789/-#") ) {
Log.e("currentTextphone", currentText.getValue());
phone = "";
phone = currentText.getValue();
isPhone = true;
contactsBeans.setPhone(phone);
}
if (isAdrs == false &¤tText.getValue().matches("[a-zA-z]+([ '-][a-zA-Z]+)*") && currentText.getValue().contains("Address") || currentText.getValue().contains("Office") || currentText.getValue().contains("Floor") || currentText.getValue().contains("Plaza") || currentText.getValue().contains("office") || currentText.getValue().contains("Floor")|| currentText.getValue().contains("Floors")|| currentText.getValue().contains("floors")|| currentText.getValue().contains("floor")|| currentText.getValue().contains("Street")|| currentText.getValue().contains("Road")) {
address = "";
address = currentText.getValue();
isAdrs = true;
contactsBeans.setAddress(address);
Log.e("currentTextaddress", currentText.getValue());
}
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
context = ApplicationController.getContext();
Intent intent = new Intent(context,ContactsEditActivity.class);
/* Log.e("CBname",contactsBeans.getName());
Log.e("CBemail",contactsBeans.getEmail());
Log.e("CBadrs",contactsBeans.getAddress());
Log.e("CBwebsite",contactsBeans.getWebsite());
Log.e("CBcomp",contactsBeans.getCompanyName());
Log.e("CBphone",contactsBeans.getPhone());*/
intent.putExtra("contactsList",contactsBeans);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
// intent.putStringArrayListExtra("contactsList",stringList);
context.startActivity(intent);
}
},6000,6000);
/*
*/
}
Contacs Bean доступный класс
public class ContactsBeans implements Parcelable {
String name;
String phone;String email;String companyName;
String address; String website;
public List<ContactsBeans> selectedContactsAttribute;
public ContactsBeans() {
}
public ContactsBeans(List<ContactsBeans> selectedContactsAttribute) {
this.selectedContactsAttribute = selectedContactsAttribute;
}
public ContactsBeans(String name, String phone, String email, String companyName, String address, String website) {
this.name = name;
this.phone = phone;
this.email = email;
this.companyName = companyName;
this.address = address;
this.website = website;
}
protected ContactsBeans(Parcel in) {
name = in.readString();
phone = in.readString();
email = in.readString();
companyName = in.readString();
address = in.readString();
website = in.readString();
selectedContactsAttribute = in.createTypedArrayList(ContactsBeans.CREATOR);
}
public static final Creator<ContactsBeans> CREATOR = new Creator<ContactsBeans>() {
@Override
public ContactsBeans createFromParcel(Parcel in) {
return new ContactsBeans(in);
}
@Override
public ContactsBeans[] newArray(int size) {
return new ContactsBeans[size];
}
};
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getWebsite() {
return website;
}
public void setWebsite(String website) {
this.website = website;
}
public List<ContactsBeans> getSelectedContactsAttribute() {
return selectedContactsAttribute;
}
public void setSelectedContactsAttribute(List<ContactsBeans> selectedContactsAttribute) {
this.selectedContactsAttribute = selectedContactsAttribute;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(phone);
dest.writeString(email);
dest.writeString(companyName);
dest.writeString(address);
dest.writeString(website);
dest.writeTypedList(selectedContactsAttribute);
}
}
https://developers.google.com/android/reference/com/google/android/gms/vision/text/Text
https://codelabs.developers.google.com/codelabs/mobile-vision-ocr/
Я следовал приведенному выше уроку, у меня есть следующие вопросы
а-) Как использовать текстовые строки вместо текстовых блоков?
б) Я использую Timer Task в классе Graphic, как убить его, когда это будет сделано, или я должен использовать какой-то другой подход?
в) Есть ли какое-нибудь приложение, я не нашел ни одного, который бы использовал визуальное распознавание текста для входа в визитную карточку?
d-) Мои выражения regex правильно протестированы в отдельной IDE для Java. Есть предложения?
e-) Я использую намерение extra для того, чтобы взять данные, хранящиеся в объекте bean-компонента "Контакты", и отобразить их в действии. Это просто происходит, как снежный ком, который никогда не останавливается, хотя я поместил флаги в свои ЗАЯВЛЕНИЯ IF.
f-) Может, в какой-то момент мы можем остановить библиотеку OCR от обнаружения какого-либо дополнительного текста после того, как все флаги сбудутся. или просто так?
g-) Он продолжает переопределять мои переменные независимо от того, является ли условие истинным или нет?
Вся помощь будет высоко оценена. Спасибо всем.
2 ответа
Для пункта а)- вы также можете использовать:
List<Line> lines = (List<Line>) text.getComponents();
for(Line elements : lines){
Log.i("current lines ", ": " + elements.getValue());
}
Я могу помочь с некоторыми из них.
а-) Как использовать текстовые строки вместо текстовых блоков?
List<Line> lines = (List<Line>) textBlock.getComponents();
Возможно, вам придется перебрать TextBlock SparseArray, чтобы получить строки каждого блока. Кроме того, этот подход работает, чтобы получить каждый элемент из каждой строки тоже. Метод getComponents() находится в текстовом интерфейсе, который реализуют все текстовые элементы.
б) Я использую Timer Task в классе Graphic, как убить его, когда это будет сделано, или я должен использовать какой-то другой подход?
Вы можете посчитать количество обнаружений, полученных в вашем OcrDetectorProcessor, и убить его, когда оно получит заданную сумму.
f-) Может, в какой-то момент мы можем остановить библиотеку OCR от обнаружения какого-либо дополнительного текста после того, как все флаги сбудутся. или просто так?
Вы можете остановить обнаружение конвейера, остановив CameraSource. В примере CodeLabs в OcrCaptureActivity это делается в onPause и onDestroy. Остановив и выпустив mPreview, приложение останавливается и очищает крючки для камеры.
Надеюсь, это поможет.