OCR Android
Là viết tắt của Optical Character Recognition(Nhận dạng ký tự quang học). Nếu bạn nhìn thấy một bức ảnh nào đấy chứa nhiều ký tự hay những câu chữ ý nghĩa mà bạn muốn lấy chúng ra khỏi bức ảnh mà không phải ngồi gõ từng ký tự một thì OCR sẻ giúp bạn tách những chữ bên trong hình ảnh ra chỉ trong ...
Là viết tắt của Optical Character Recognition(Nhận dạng ký tự quang học). Nếu bạn nhìn thấy một bức ảnh nào đấy chứa nhiều ký tự hay những câu chữ ý nghĩa mà bạn muốn lấy chúng ra khỏi bức ảnh mà không phải ngồi gõ từng ký tự một thì OCR sẻ giúp bạn tách những chữ bên trong hình ảnh ra chỉ trong nháy mắt. Bạn có thể dịch, có thể tìm kiếm, hay làm bất cứ thứ gì bạn mốn với đoạn text mà bạn có thông qua OCR.
- AndroidManifest.xml Bổ sung
<uses-feature android:name="android.hardware.camera" android:required="true"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-
build.gradle Thêm compile 'com.google.android.gms:play-services-vision:9.8.0' vào dependencies
-
Lớp MainActivity.java
private static final int PHOTO_REQUEST = 0; private TextView scanResults; private Uri imageUri ; private TextRecognizer detector; private static final int REQUEST_WRITE_PERMISSION = 1; private static final String SAVED_INSTANCE_URI = "uri"; private static final String SAVED_INSTANCE_RESULT = "result"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button) findViewById(R.id.button); scanResults = (TextView) findViewById(R.id.results); if (savedInstanceState != null) { imageUri = Uri.parse(savedInstanceState.getString(SAVED_INSTANCE_URI)); scanResults.setText(savedInstanceState.getString(SAVED_INSTANCE_RESULT)); } detector = new TextRecognizer.Builder(getApplicationContext()).build(); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_PERMISSION); } }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case REQUEST_WRITE_PERMISSION: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { takePicture(); } else { Toast.makeText(MainActivity.this, "Permission Denied!", Toast.LENGTH_SHORT).show(); } } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == PHOTO_REQUEST && resultCode == RESULT_OK) { launchMediaScanIntent(); try { Bitmap bitmap = decodeBitmapUri(this, imageUri); if (detector.isOperational() && bitmap != null) { Frame frame = new Frame.Builder().setBitmap(bitmap).build(); SparseArray<TextBlock> textBlocks = detector.detect(frame); String blocks = ""; for (int index = 0; index < textBlocks.size(); index++) { TextBlock tBlock = textBlocks.valueAt(index); blocks = blocks + tBlock.getValue() + " " + " "; } if (textBlocks.size() == 0) { scanResults.setText("Scan Failed: Found nothing to scan"); } else { scanResults.setText(scanResults.getText() + blocks + " "); } } else { scanResults.setText("Could not set up the detector!"); } } catch (Exception e) { Toast.makeText(this, "Failed to load Image", Toast.LENGTH_SHORT) .show(); } } } private void takePicture() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File photo = new File(Environment.getExternalStorageDirectory(), "picture.jpg"); imageUri = Uri.fromFile(photo); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, PHOTO_REQUEST); } @Override protected void onSaveInstanceState(Bundle outState) { if (imageUri != null) { outState.putString(SAVED_INSTANCE_URI, imageUri.toString()); outState.putString(SAVED_INSTANCE_RESULT, scanResults.getText().toString()); } super.onSaveInstanceState(outState); } private void launchMediaScanIntent() { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); mediaScanIntent.setData(imageUri); this.sendBroadcast(mediaScanIntent); } private Bitmap decodeBitmapUri(Context ctx, Uri uri) throws FileNotFoundException { int targetW = 600; int targetH = 600; BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inJustDecodeBounds = true; BitmapFactory.decodeStream(ctx.getContentResolver().openInputStream(uri), null, bmOptions); int photoW = bmOptions.outWidth; int photoH = bmOptions.outHeight; int scaleFactor = Math.min(photoW / targetW, photoH / targetH); bmOptions.inJustDecodeBounds = false; bmOptions.inSampleSize = scaleFactor; return BitmapFactory.decodeStream(ctx.getContentResolver() .openInputStream(uri), null, bmOptions); }
- Tạo gia diện cho ứng dụng
<Button android:id="@+id/button" android:layout_awidth="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:text="Scan Text" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" tools:layout_constraintLeft_creator="1" tools:layout_constraintRight_creator="1" /> <TextView android:id="@+id/textView" android:layout_awidth="wrap_content" android:layout_height="wrap_content" android:text="Scan Results:" android:textAllCaps="false" android:textStyle="normal|bold" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" tools:layout_constraintLeft_creator="1" tools:layout_constraintRight_creator="1" tools:layout_editor_absoluteY="0dp"/> <ScrollView android:layout_awidth="0dp" android:layout_height="0dp" android:layout_marginTop="8dp" android:paddingLeft="5dp" android:paddingRight="5dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView" tools:layout_constraintBottom_creator="1" tools:layout_constraintLeft_creator="1" tools:layout_constraintRight_creator="1" tools:layout_constraintTop_creator="1"> <LinearLayout android:layout_awidth="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/results" android:layout_awidth="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" tools:layout_constraintLeft_creator="1" tools:layout_constraintRight_creator="1" tools:layout_constraintTop_creator="1"/> </LinearLayout> </ScrollView>
Ok, vậy là bạn đã tạo được 1 app OCR đơn giản.