Text Recognition در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش Text Recognition در برنامه نویسی اندروید می پردازیم از Text Recognition به منظور تشخیص متن داخل عکس مورد استفاده قرار می گیرد این کار نام های مختلفی دارد همانند OCR و… در ادامه با ما همراه باشید تا نحوه Text Recognition در برنامه نویسی اندروید را یاد گیرید.
عمل Text Recognition (تشخیص متن) را با استفاده از Api مربوط به گوگل vision این کار را انجام می دهیم.
ابتدا باید وارد فایل Build.gradle از نوع Module شده سپس در بخش dependencies خط زیر را اضافه کنید.
1 | implementation 'com.google.android.gms:play-services-vision:9.8.0' |
پروژه را sync کنید قند شکن فراموش نشود.
دسترسی Camera را به AndroidManifest.xml اضافه کنید.
1 | <uses-permission android:name="android.permission.CAMERA"/> |
نکته : این آموزش شامل Run Time Permission نیست باید خودتان از آموزش های سایت آن را قرار دهید !
لینک آموزش
کد layout اکتیویتی اصلی (activity_main.xml) همانند زیر خواهد بود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?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 همانند زیر می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | 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 دوربین را قطع کردیم.
این آموزش هم به پایان رسید.
موفق و موید باشید.
سلام من چطور مستونم تست کنم برنامه رو . هرچی مقابل عکس متن دار دوربین رو میگیرم اتفاقی نمیفته البته تو بخش ایکس ام ال هم surfaceview رو یک صفحه خاکستری نشون میده که این یعنی نشناخته surfaceview رو ممنون میشم راهنمایی ام کنید
سلام
ببینید نوشته شده که باید دسترسی هنگام اجرا را از آموزش های دیگه بهش اضافه بکنید چون توی اندروید های بالا نیازمند دسترسی هنگام اجرا هست اگر camera نمایش داده بشه یعنی شما بهش دسترسی داید اگر خاکستری باشه نتونسته دسترسی بگیره پس دوربین لود نمیشه.
موفق باشید.
با سلام
این آموزش را در شبیه ساز آزمایش میکنم به خوبی اجرا میشه
ولی روی گوشی کار نمیکنه، پرمیشن دوربین را هم فعال کردم و تصویر را نمایش میده ولی textRecognizer.isOperational() همیشه false میشه.
میشه راهنمایی کنید
سلام.
منم دقیقا همین مشکل دارم
textRecognizer.isOperational() همیشه false میشه.
مشکل چیه دسترسی همه چی هم داره