如何使用tesseract ocr将图像转换为缅甸字体的文本?我使用了mya.traineddata,它真的有效吗?
我想创建一个缅甸彩票扫描仪应用程序。我接受了三种语言(英语,日语,缅甸语)的测试
assets文件夹> tessdata文件夹> eng.traineddata,mya.traineddata,jpn.traineddata
我的应用程序可以阅读英语和日语。但是缅甸语言看不懂。
我使用(>实现'com.rmtheis:tess-two:9.0.0'mya.traineddata(https://raw.githubusercontent.com/tesseract-ocr/tessdata/3.04.00/mya.traineddata)
那是我的错误
Blockquote 01-25 15:14:28.637 4190-4190 / com.example.mit.ocrjpn E / Tesseract(native):无法使用language = mya初始化Tesseract API!
我想阅读缅甸字体。请帮我。 testing with eng.traineddata testing with jpn.traineddata
这是我的代码>> OCRAcivity.java
<EventData>
<Data Name="TargetState">5</Data>
<Data Name="EffectiveState">5</Data>
<Data Name="Reason">4</Data>
<Data Name="Flags">0</Data>
</EventData>
package com.example.mit.ocrjpn;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import static android.content.ContentValues.TAG;
public class OCRActivity extends Activity implements OnClickListener {
private TessOCR mTessOCR;
private TextView mResult;
private ProgressDialog mProgressDialog;
private ImageView mImage;
private Button mButtonGallery, mButtonCamera;
private String mCurrentPhotoPath;
private static final int REQUEST_TAKE_PHOTO = 1;
private static final int REQUEST_PICK_PHOTO = 2;
public static final String DATA_PATH = Environment
.getExternalStorageDirectory().toString() + "/OCRActivity/";
public static String lang = "eng";
private RadioGroup radioGroup;
private RadioButton eng, mya, jpn;
private static final String TAG = "OCRActivity.java";
@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
1);
}
}
mResult = (TextView) findViewById(R.id.tv_result);
mImage = (ImageView) findViewById(R.id.image);
mButtonGallery = (Button) findViewById(R.id.bt_gallery);
mButtonGallery.setOnClickListener(this);
mButtonCamera = (Button) findViewById(R.id.bt_camera);
mButtonCamera.setOnClickListener(this);
// ActivityCompat.requestPermissions(getApplicationContext(), new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA }, 22);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkPermission()) {
//do your work
} else {
requestPermission();
}
}
String[] paths = new String[]{DATA_PATH, DATA_PATH + "tessdata/"};
for (String path : paths) {
File dir = new File(path);
if (!dir.exists()) {
if (!dir.mkdirs()) {
Toast.makeText(getApplicationContext(), "ERROR: Creation of directory", Toast.LENGTH_LONG).show();
createfile(lang);
return;
} else {
Toast.makeText(getApplicationContext(), "Created directiry", Toast.LENGTH_LONG).show();
}
}
}
//createfile(lang);
radioGroup = (RadioGroup) findViewById(R.id.myRadioGroup);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (checkedId == R.id.eng) {
Toast.makeText(getApplicationContext(), "eng",
Toast.LENGTH_SHORT).show();
lang = "eng";
createfile(lang);
mTessOCR = new TessOCR(lang);
} else if (checkedId == R.id.jpn) {
Toast.makeText(getApplicationContext(), "jpn",
Toast.LENGTH_SHORT).show();
lang = "jpn";
createfile(lang);
mTessOCR = new TessOCR(lang);
} else {
Toast.makeText(getApplicationContext(), "mya",
Toast.LENGTH_SHORT).show();
lang = "mya";
createfile(lang);
mTessOCR = new TessOCR(lang);
}
}
}
);
}
protected boolean checkPermission() {
int result = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (result == PackageManager.PERMISSION_GRANTED) {
return true;
} else {
return false;
}
}
protected void requestPermission() {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
Toast.makeText(this, "Write External Storage permission allows us to do store images. Please allow this permission in App Settings.", Toast.LENGTH_LONG).show();
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case 100:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//do your work
} else {
Log.e("value", "Permission Denied, You cannot use local drive .");
}
break;
}
}
@RequiresApi(api = Build.VERSION_CODES.M)
private void getStorageAccessPermissions() {
int hasWriteStoragePermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (hasWriteStoragePermission != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
}
}
private static String isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
String retval = "External storage is not writable";
if (Environment.MEDIA_MOUNTED.equals(state)) {
retval = Environment.getExternalStorageDirectory().toString();
}
return retval;
}
/* Checks if external storage is available to at least read from and returns the path name */
private static String isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
String retval = "External storage is not readable";
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
retval = Environment.getExternalStorageDirectory().toString();
}
return retval;
}
public void createfile(String lg) {
if (!(new File(DATA_PATH + "tessdata/" + lg + ".traineddata")).exists()) {
try {
AssetManager assetManager = getAssets();
InputStream in = assetManager.open("tessdata/" + lg + ".traineddata");
//GZIPInputStream gin = new GZIPInputStream(in);
OutputStream out = new FileOutputStream(DATA_PATH
+ "tessdata/" + lg + ".traineddata");
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
//while ((lenf = gin.read(buff)) > 0) {
Log.e("Buffer", buf + "");
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
//gin.close();
out.close();
Log.e(TAG, "Copied " + lg + " traineddata");
Toast.makeText(getApplicationContext(), "Copied.................................." + lg + "traineddata", Toast.LENGTH_LONG).show();
} catch (IOException e) {
Log.e(TAG, "Was unable to copy " + lg + " traineddata " + e.toString());
Toast.makeText(getApplicationContext(), "Was unable to copy", Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(getApplicationContext(), "existing" + lg, Toast.LENGTH_LONG).show();
}
}
private void uriOCR(Uri uri) {
if (uri != null) {
InputStream is = null;
try {
is = getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(is);
mImage.setImageBitmap(bitmap);
doOCR(bitmap);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Intent intent = getIntent();
if (Intent.ACTION_SEND.equals(intent.getAction())) {
Uri uri = (Uri) intent
.getParcelableExtra(Intent.EXTRA_STREAM);
uriOCR(uri);
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mTessOCR.onDestroy();
}
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
}
// Continue only if the File was successfully created
if (photoFile != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(photoFile));
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}
}
}
/**
* http://developer.android.com/ining/camera/photobasics.html
*/
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
.format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
String storageDir = Environment.getExternalStorageDirectory()
+ "/TessOCR";
File dir = new File(storageDir);
if (!dir.exists())
dir.mkdir();
File image = new File(storageDir + "/" + imageFileName + ".jpg");
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = image.getAbsolutePath();
return image;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if (requestCode == REQUEST_TAKE_PHOTO
&& resultCode == Activity.RESULT_OK) {
setPic();
} else if (requestCode == REQUEST_PICK_PHOTO
&& resultCode == Activity.RESULT_OK) {
Uri uri = data.getData();
if (uri != null) {
uriOCR(uri);
}
}
}
private void setPic() {
// Get the dimensions of the View
int targetW = mImage.getWidth();
int targetH = mImage.getHeight();
// Get the dimensions of the bitmap
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
// Determine how much to scale down the image
int scaleFactor = Math.min(photoW / targetW, photoH / targetH);
// Decode the image file into a Bitmap sized to fill the View
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor << 1;
bmOptions.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
mImage.setImageBitmap(bitmap);
doOCR(bitmap);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int id = v.getId();
switch (id) {
case R.id.bt_gallery:
pickPhoto();
break;
case R.id.bt_camera:
takePhoto();
break;
}
}
private void pickPhoto() {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_PICK_PHOTO);
}
private void takePhoto() {
dispatchTakePictureIntent();
}
private void doOCR(final Bitmap bitmap) {
if (mProgressDialog == null) {
mProgressDialog = ProgressDialog.show(this, "Processing",
"Doing OCR...", true);
} else {
mProgressDialog.show();
}
new Thread(new Runnable() {
public void run() {
final String result = mTessOCR.getOCRResult(bitmap);
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if (result != null && !result.equals("")) {
mResult.setText(result);
}
mProgressDialog.dismiss();
}
});
}
;
}).start();
}
}