Text Recognition در برنامه نویسی اندروید

سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش Text Recognition در برنامه نویسی اندروید می پردازیم از Text Recognition به منظور تشخیص متن داخل عکس مورد استفاده قرار می گیرد این کار نام های مختلفی دارد همانند OCR و… در ادامه با ما همراه باشید تا نحوه Text Recognition در برنامه نویسی اندروید را یاد گیرید.
 
عمل Text Recognition (تشخیص متن) را با استفاده از Api مربوط به گوگل vision این کار را انجام می دهیم.
ابتدا باید وارد فایل Build.gradle از نوع Module شده سپس در بخش dependencies خط زیر را اضافه کنید.

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

پروژه را sync کنید قند شکن فراموش نشود.
دسترسی Camera را به AndroidManifest.xml اضافه کنید.

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

نکته : این آموزش شامل Run Time Permission نیست باید خودتان از آموزش های سایت آن را قرار دهید !
لینک آموزش
کد layout اکتیویتی اصلی (activity_main.xml) همانند زیر خواهد بود.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">
    <SurfaceView
        android:id="@+id/surface_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true" />
    <TextView
        android:id="@+id/text_value"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="No text"
        android:layout_alignParentBottom="true"
        android:textColor="@android:color/white"
        android:textSize="20sp" />
</RelativeLayout>

SurfaceView به منظور نمایش دوربین و عکس گرفته شده قرار گرفته است و TextView هم به منظور نمایش متن خارج شده از عکس مورد استفاده قرار می گیرد.
و در نهایت کد مربوط به MainActivity.java همانند زیر می شود.

package ir.programchi;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.util.SparseArray;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.TextView;
import com.google.android.gms.vision.CameraSource;
import com.google.android.gms.vision.Detector;
import com.google.android.gms.vision.text.TextBlock;
import com.google.android.gms.vision.text.TextRecognizer;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
    private SurfaceView cameraView;
    private TextView barcodeValue;
    private CameraSource cameraSource;
    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.activity_main);
        cameraView = (SurfaceView) findViewById(R.id.surface_view);
        barcodeValue = (TextView) findViewById(R.id.text_value);
        TextRecognizer textRecognizer = new TextRecognizer.Builder(getApplicationContext()).build();
        textRecognizer.setProcessor(new Detector.Processor<TextBlock>() {
            @Override
            public void release() {
            }
            @Override
            public void receiveDetections(Detector.Detections<TextBlock> detections) {
                Log.d("Main", "receiveDetections");
                final SparseArray<TextBlock> items = detections.getDetectedItems();
                if (items.size() != 0) {
                    barcodeValue.post(new Runnable() {
                        @Override
                        public void run() {
                            StringBuilder value = new StringBuilder();
                            for (int i = 0; i < items.size(); ++i) {
                                TextBlock item = items.valueAt(i);
                                value.append(item.getValue());
                                value.append("\n");
                            }
                            barcodeValue.setText(value.toString());
                        }
                    });
                }
            }
        });
        if (!textRecognizer.isOperational()) {
            Log.w("MainActivity", "Detector dependencies are not yet available.");
        }
        cameraSource = new CameraSource.Builder(getApplicationContext(), textRecognizer)
                .setFacing(CameraSource.CAMERA_FACING_BACK)
                .setRequestedPreviewSize(1280, 1024)
                .setRequestedFps(2.0f)
                .setAutoFocusEnabled(true)
                .build();
        cameraView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                try {
                    //noinspection MissingPermission
                    cameraSource.start(cameraView.getHolder());
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            }
            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                cameraSource.stop();
            }
        });
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        cameraSource.release();
    }
}

ابتدا در بالا بعد از اینکه View ها را find کردیم TextRecognizer را setup می کنیم برای اینکه متن را تشخیص دهد در ورودی مربوط به setProccessor مقدار آن را برابر با TextBlock قرار میدهیم این بخش تعیین کننده تشخیص متن است هر زمان که متنی detect یا تشخیص داده شود اتوماتیک وارد متد receiveDetections می شود در آنجا متن از داخل عکس Extract می شود از CameraSource.Builder به منظور دریافت عکس استفاده کردیم دقت کنید باید Run Time Permission در برنامه قرار کیرد در غیر اینصورت اگر اندروید 5 به بالا باشد با خطا مواجه خواهید هرچند که برنامه کرش نمی کند چون در try , catch قرار گرفته است در نهایت در متد onDestroy دوربین را قطع کردیم.
 
این آموزش هم به پایان رسید.
موفق و موید باشید.

مطالعه بیشتر