Scanner OCR en android – En tiempo real

Scanner OCR en android – En tiempo real

Hoy vamos a mostrar un ejemplo de scanner OCR en android en tiempo real con la cámara del dispositivo, el objetivo de este post es mostrar la funcionalidad de reconocimiento de caracteres de Google Visión aplicada a un pequeño proyecto hola mundo en android.

Mediante esta api de Google podemos detectar y extraer texto de cualquier imagen.

En este proyecto utilizaremos esta herramienta para obtener texto mediante la cámara del dispositivo en tiempo real.

Puedes ver más información sobre Google Visión en su página web.


¿Sabías que?

¿Necesitas aprender algo nuevo ? Ve a Udemy, busca el tema del que quieres aprender, selecciona el curso para ti y continua con tu aprendizaje.

Udemy

Para comenzar creamos un nuevo proyecto en Android Studio, dejamos todo por default y elegimos una plantilla vacía.

Al finalizar el proyecto tendremos una app capaz de apuntar a cualquier objeto con algún texto y poder pasarlo a la app con una velocidad bastante aceptable.

Vamos a revisar el codigo fuente destacado del proyecto.

 

MainActivity.java

Declaramos variables

private CameraSource mCameraSource;
private SurfaceView mCameraView;
private TextView textview;

En nuestro onCreate
setContentView(R.layout.activity_main);

mCameraView = (SurfaceView) findViewById(R.id.surfaceView);
textview = (TextView) findViewById(R.id.text_view);

iniciarCamara();

En el metodo iniciarCamara
final TextRecognizer textRecognizer = new TextRecognizer.Builder(getApplicationContext()).build();

        if (!textRecognizer.isOperational()) {
            Log.w("JMR", "Detector dependencies not loaded yet");
        } else {

            mCameraSource = new CameraSource.Builder(getApplicationContext(), textRecognizer)
                    .setFacing(CameraSource.CAMERA_FACING_BACK)
                    .setRequestedPreviewSize(1280, 1024)
                    .setAutoFocusEnabled(true)
                    .setRequestedFps(2.0f)
                    .build();


            mCameraView.getHolder().addCallback(new SurfaceHolder.Callback() {
                @Override
                public void surfaceCreated(SurfaceHolder holder) {
                    try {

                        if (ActivityCompat.checkSelfPermission(getApplicationContext(),
                                Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {

                            ActivityCompat.requestPermissions(MainActivity.this,
                                    new String[]{Manifest.permission.CAMERA},
                                    2517);
                            return;
                        }
                        mCameraSource.start(mCameraView.getHolder());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                }


                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {
                    mCameraSource.stop();
                }
            });

            textRecognizer.setProcessor(new Detector.Processor<TextBlock>() {
                @Override
                public void release() {

                }


                @Override
                public void receiveDetections(Detector.Detections<TextBlock> detections) {
                    final SparseArray<TextBlock> items = detections.getDetectedItems();
                    if (items.size() != 0 ){

                        textview.post(new Runnable() {
                            @Override
                            public void run() {
                                StringBuilder stringBuilder = new StringBuilder();
                                for(int i=0;i<items.size();i++){
                                    TextBlock item = items.valueAt(i);
                                    stringBuilder.append(item.getValue());
                                    stringBuilder.append("\n");
                                }
                                textview.setText(stringBuilder.toString());
                            }
                        });
                    }
                }
            });
        }

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="5"
    tools:context="com.easycodigo.ocrdemo.MainActivity">
    <SurfaceView
        android:id="@+id/surfaceView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4" />
    <TextView
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_margin="8dp"
        android:layout_weight="1"
        android:gravity="center"
        android:textStyle="bold"
        android:text="@string/txt_message"
        android:textColor="@android:color/black"
        android:textSize="20sp" />
</LinearLayout>

Necesitamos además agregar una etiqueta a nuestros strings
<string name="txt_message">TEXTO</string>

En nuestro build.gradle de App implementamos
implementation 'com.google.android.gms:play-services-vision:11.0.4'

Y por último en nuestro android manifest no olvidamos agregar permisos de cámara y una meta de Google Vision.
<uses-permission android:name="android.permission.CAMERA"/>

...

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

Al ejecutar el proyecto veremos nuestro scanner OCR en android en funcionamiento.

scanner ocr en android ejemplo

Si esta información sobre cómo programar un scanner OCR en android te ha sido de utilidad no olvides compartirla en tus redes sociales favoritas y dejarnos un comentario en la sección de abajo si tienes cualquier duda al respecto, será un placer ayudarte.

¡Hasta luego!

Clic para valorar esta información
[Total: 1 Promedio: 5]