Como leer palabras con la cámara del móvil en android

Hola amigos hoy veremos un ejercicio interesante  como leer palabras con la cámara del móvil en android, la idea de este ejercicio es utilizar la cámara escanear con la cámara una frase o muchas oraciones y estas pasar en letras a nuestro móvil.

Como leer palabras con la cámara del móvil en android

Cosas que deberías saber sobre el escaneo con cámara en android 
Tener un pdf o un word y pasar tu celular por encima y que este pueda registrar todas las palabras no es nada nuevo hay un monton de aplicacion en el playstore que lo hacen.
Este maravilla nos lo permite una api de la cámara y dentro esta una clase llamada CamereSource la cual al igual que la lectura de códigos de barra o QR puede leer párrafos enteros que podríamos utilizar en algún proyecto.

Fuente:  Camera API 

Ahora empezaremos con la parte gráfica donde veremos como se muestra en la imagen que esta arriba, solo utilizaremos:

  • 1 surface_view
  • 1 editText

 

A continuación te dejo el código de la parte gráfica:

activity_main

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="MainActivity">

    <SurfaceView
        android:id="@+id/surface_view"

        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/txtMostrar"
        android:text="No Text"
        android:layout_alignParentBottom="true"
        android:textColor="@android:color/white"
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</RelativeLayout>

 

Ahora nos vamos a la parte del código en nuestro MainActivity:

MainActivity

 

public class MainActivity extends AppCompatActivity {

    SurfaceView camara;
    TextView mostrar;
    CameraSource cameraSource;
    final int RequestCameraPermissionID = 1001;


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case RequestCameraPermissionID: {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                    try {
                        cameraSource.start(camara.getHolder());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }
            }
            break;
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        camara = (SurfaceView) findViewById(R.id.surface_view);
        mostrar = (TextView) findViewById(R.id.txtMostrar);

        TextRecognizer textoReconocido = new TextRecognizer.Builder(getApplicationContext()).build();
        if (!textoReconocido.isOperational()) {
            Log.w("MainActivity", "Las dependencias del detector aún no están disponibles");
        } else {

            cameraSource = new CameraSource.Builder(getApplicationContext(), textoReconocido)
                    .setFacing(CameraSource.CAMERA_FACING_BACK)
                    .setRequestedPreviewSize(1280, 1024)
                    .setRequestedFps(2.0f)
                    .setAutoFocusEnabled(true)
                    .build();
            camara.getHolder().addCallback(new SurfaceHolder.Callback() {
                @Override
                public void surfaceCreated(SurfaceHolder surfaceHolder) {

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

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

                @Override
                public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

                }

                @Override
                public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
                    cameraSource.stop();
                }
            });

            textoReconocido.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)
                    {
                        mostrar.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");
                                }
                                mostrar.setText(stringBuilder.toString());
                            }
                        });
                    }
                }
            });
        }
    }
}

 

Ahora debemos agregar una librería en nuestro build.gradle dentro de dependencies

build.gradle

 

compile 'com.google.android.gms:play-services-vision:9.8.0'

 

Ahora un permiso dentro de nuestro AndroidManifest

AndroidManifest

 

 <uses-permission android:name="android.permission.CAMERA" />

El producto final seria el siguiente, donde estoy leyendo un articulo antiguo de la web, la cámara lo detecta y lo pasa a letras dentro del móvil.

Enlace de Interés:  Como utilizar la cámara de tu celular en android studio

4 comentarios en «Como leer palabras con la cámara del móvil en android»

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

WhatsApp chat