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
Contenidos
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
Hola soy Alex Céspedes fundador de ANDROFAST, programo algunas cosas por diversión, me gusta aprender cosas nuevas y estoy pendiente de todo lo que tenga que ver con tecnología. Este blog lo cree para todas las personas que tengan dificultades en la programación, para ser sincero nunca fui bueno y reprobé algunos cursos de programación, pero mis ganas de aprender pudieron más. SI YO PUEDO TU PUEDES ANIMO!
oye no tendras el ejemplo del codigo por que creo que me faltan cosas que implementar
o algun video para seguir las instrucciones
Cuéntanos que problema tienes Alberto
ya lo pude armar pero al momento de leer no me reconoce los textos solo letras sueltas