androidandroid-visiontext-recognition

Google Mobile Vision Text API Example


I am currently writing code that should be able to view a picture of text and then extract the text from the picture for android based devices. I did some research online and found that Google provides their own API called "Mobile Vision" (a package with many items i.e. text recognition, facial recognition, etc). However, in their demos they only demonstrate live text recognition. I was wondering if anyone could give me an example of text recognition on a still image using the Mobile Vision API. Any help is welcome. Thanks.


Solution

  • The Google Play Services Mobile Vision API Documentation describes how to do this, you can use the TextRecognizer class to detect text in Frames. Once you have the Bitmap image you can then convert it into a frame and do processing on it. See below for an example.

    // imageBitmap is the Bitmap image you're trying to process for text
    if(imageBitmap != null) {
    
        TextRecognizer textRecognizer = new TextRecognizer.Builder(this).build();
    
        if(!textRecognizer.isOperational()) {
            // Note: The first time that an app using a Vision API is installed on a
            // device, GMS will download a native libraries to the device in order to do detection.
            // Usually this completes before the app is run for the first time.  But if that
            // download has not yet completed, then the above call will not detect any text,
            // barcodes, or faces.
            // isOperational() can be used to check if the required native libraries are currently
            // available.  The detectors will automatically become operational once the library
            // downloads complete on device.
            Log.w(LOG_TAG, "Detector dependencies are not yet available.");
    
            // Check for low storage.  If there is low storage, the native library will not be
            // downloaded, so detection will not become operational.
            IntentFilter lowstorageFilter = new IntentFilter(Intent.ACTION_DEVICE_STORAGE_LOW);
            boolean hasLowStorage = registerReceiver(null, lowstorageFilter) != null;
    
            if (hasLowStorage) {
                Toast.makeText(this,"Low Storage", Toast.LENGTH_LONG).show();
                Log.w(LOG_TAG, "Low Storage");
            }
        }
    
    
        Frame imageFrame = new Frame.Builder()
                .setBitmap(imageBitmap)
                .build();
    
        SparseArray<TextBlock> textBlocks = textRecognizer.detect(imageFrame);
    
        for (int i = 0; i < textBlocks.size(); i++) {
            TextBlock textBlock = textBlocks.get(textBlocks.keyAt(i));
    
            Log.i(LOG_TAG, textBlock.getValue()); 
            // Do something with value
        }
    }
    

    You also need to ensure you include the mobile vision dependency in the module's build.gradle

    dependencies {
        compile 'com.google.android.gms:play-services-vision:9.4.0'
    } 
    

    And also include the following in the app's Android Manifest

    <meta-data
        android:name="com.google.android.gms.vision.DEPENDENCIES"
        android:value="ocr" />