Building Business Cards Reader using android visio

2019-05-09 17:09发布

问题:

I am building an android app using google's android mobile vision OCR Text for entry of Business Cards as contacts in the phone.

So far i have able to recognize any Latin Generated Text and have been able to apply regex on the block of code

What i have done is that i have created a Contacts bean class for five Variables name,email,compnayname,website,adrs,phnno After applying regex on the live data being generated i am filtering the results and saving them in an object of type bean class and passing that object to the activity and extract the data stored in that object and display it in my text views.

The OCR graphic class detection method>>>

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 &&currentText.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 parceable class

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/#6

I have followed the above tutorial I have the following questions

a-) How to use Text Lines instead of text blocks?

b-) I am using Timer Task in the Graphic class how to kill it when it's done or should i use some other approach?

c-) Is there any app, i haven't found one which is using vision OCR for Business Card entry, they say it ca though?

d-) My regex exp are correct tested in a separate IDE for Java any suggestions?

e-) I am using intents extra to take the data stored in the contacts bean object and display it in the activity, it just goes like a snow ball never stops although i have put flags in my IF STATEMENTS .

f-) Can at some point,we can stop the OCR library from detecting any further text after all the flags have gone true. or just any way?

g-)It keeps overriding my variables regardless the condition is true or not?

All the help would be highly regarded. Thanks allot.

回答1:

I can help with some of these.

a-) How to use Text Lines instead of text blocks?

List<Line> lines = (List<Line>) textBlock.getComponents();

You may need to iterate over the TextBlock SparseArray to get each blocks lines. Additionally this approach works to get each Element from each line too. The getComponents() method is in the Text interface that all text items implement.

b-) I am using Timer Task in the Graphic class how to kill it when it's done or should i use some other approach?

You could count the number of detections received in your OcrDetectorProcessor, and kill it when it has received a set amount.

f-) Can at some point,we can stop the OCR library from detecting any further text after all the flags have gone true. or just any way?

You can stop the pipeline from detecting by stopping the CameraSource. In the CodeLabs example in OcrCaptureActivity this is being done in onPause and onDestroy. By stopping and releasing mPreview, the app stops and cleans up the hooks to the camera.

I hope this helps.



回答2:

for point a)- you can also use :

 List<Line> lines = (List<Line>) text.getComponents();
        for(Line elements : lines){
            Log.i("current lines ", ": " + elements.getValue());
        }